Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка при компиляции
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
shrek
Добрый день. Проблема вот в чем...
Собирал сегодня проект (точнее что то вроде близкое к проекту). Компилятор IAR MCS-51 v7.51A.
Камень nRF24LE1.
Написал вот такую функцию, которая (по идее должна) записывает в модуль интегрированного приемопередатчика порцию байтов разной длинны. Компилятор и до этого ругался как оказалось на указатель *buff. Почему то ему он не нравился wacko.gif ...
Код
void rf_write_multibyte_reg(unsigned char reg, unsigned char *buff, unsigned char byte_num)
     {
     unsigned char i;
     i = 0;
     CS_LOW;
     rf_spi_rw(W_REGISTER | reg);
     while (i < byte_num)
          {
          rf_spi_rw(*(buff + i));
          i++;
          }
     CS_HIGH;
     }


После компиляции выдал ошибку:
Error[e124]: Segment conflict for segment ISTACK. In module "__program_start" there is a segment part that is of type STACK, while in module "CSTARTUP" there is a segment part that is of type RELOCATABLE

немного изменил функцию
Код
void rf_write_multibyte_reg(unsigned char reg, unsigned char *buff, unsigned char byte_num)
     {
     unsigned char i;
     i = 0;
     CS_LOW;
     rf_spi_rw(W_REGISTER | reg);
     while (i < byte_num)
          {
          rf_spi_rw(*(buff + i));
          //i++;
          }
     CS_HIGH;
     }


соответственно цикл стал бесконечным... Но компилятор его схавал!!!
Изменял размер стека все бестолку...
bseyur
А так?
Код
void rf_write_multibyte_reg(unsigned char reg, unsigned char *buff, unsigned char byte_num)
     {
     CS_LOW;
     rf_spi_rw(W_REGISTER | reg);
     for (unsigned char i=0;i<byte_num;i++)
          {rf_spi_rw(buff[i]);}
     CS_HIGH;
     }

И что за макрос - rf_spi_rw ?
shrek
Цитата
И что за макрос - rf_spi_rw ?


Это макрос записи чтения байта из интегрированного контроллера SPI приемо передатчика nRF24LE1
Все самописное. Писал на основе примеров завода производителя данных девайсов)))
Код
unsigned char rf_spi_rw(unsigned char value)
     {
     SPIRDAT = value;
     while(!(SPIRSTAT & 0x02));
     return SPIRDAT;
     }


Цитата
А так?

Все равно ошибку выдает

А вот эту функцию
Код
void rf_write_multibyte_reg(unsigned char reg, unsigned char *buff, unsigned char byte_num)
     {
     CS_LOW;
     rf_spi_rw(W_REGISTER | reg);
     while (byte_num--) rf_spi_rw(*(buff + byte_num));
     CS_HIGH;
     }

компилятор схавал
или эту
Код
void rf_write_multibyte_reg(unsigned char reg, unsigned char *buff, unsigned char byte_num)
     {
     CS_LOW;
     rf_spi_rw(W_REGISTER | reg);
     while (byte_num--) rf_spi_rw(*buff++);
     CS_HIGH;
     }
shrek
И еще кое что... В отладке в симуляторе последняя функция у меня заработала. Но когда я пытаюсь передать в функцию указатель на первый элемент массива, который находится в памяти code с приведением типа например,
Код
(unsigned char *) a
сам массив например
const unsigned char a[] = {0x10,0x20,0x30,0x40,0x50}

(указатель передается в функцию все нормально)
функция берет байты из памяти idata.
чтобы все нормально работало приходится создавать массив дополнительный в idata в который необходимо перед входом в функцию занести необходимые байты своего рода буфер...
skripach
Цитата
Но когда я пытаюсь передать в функцию указатель на первый элемент массива, который находится в памяти code

Если у code и data разные адресные пространства (не помню как том i8051), то наверное проблема в этом.
shrek
да у 8051 разные адресные пространства. И эта проблема искореняется буфером... sad.gif
Но все же не понятно почему IAR ругается на функцию
Код
void rf_write_multibyte_reg(unsigned char reg, unsigned char *buff, unsigned char byte_num)
     {
     unsigned char i;
     i = 0;
     CS_LOW;
     rf_spi_rw(W_REGISTER | reg);
     while (i < byte_num)
          {
          rf_spi_rw(*(buff + i));
          i++;
          }
     CS_HIGH;
     }

help.gif
В том же ARMе biggrin.gif на раз прокатывало)))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.