Что не так с IAR ?

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Здравствуйте.

Столкнулся тут с интересной вещью:

Пишу "1-Wire Search ROM" на Си для своего любимого 90S2313.
В программе несколько глобальных переменных:

char   symbols[3] = { 0x3F, 0x3F, 0x3F };
char   position = 0;
unsigned char FoundROM[MAXDEV][8];

в main еще одна локальная:

unsigned int temperature;

из майна вызывается функция OWSearch. В ней тоже куча локальных:

unsigned char ROM[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
unsigned char id_bit;
unsigned char cmp_id_bit;
unsigned char SearchDirection;
unsigned char LastDeviceFlag = 0;
unsigned char id_bit_number;
unsigned char byte_index;
unsigned char mask;
unsigned char LastDiscrepancy = 0;
unsigned char last_zero;
unsigned char cnt = 0;
unsigned char i;

Суть в том, что если всю эту конструкцию компилирую в CodeVision,
компилер "заставляет" увеличить Data Stack до 41 байта (по дефолту там 37)
и спокойненько распихивает все переменные по регистрам и памяти.
IAR же так молча с дефолтовыми настройками - CSTACK 0x20,
RSTACK 16, Memory model Tiny - компилирует. Ни варнингов ни ерроров
не выдает. А потом в отладчике (проверял и в иаровском и в АВР Студио)
"пропадает" переменная ROM[8]. Т.е. она располагается по адресу 0x17E.
Что то мне сердце подсказывает, что в 2313 таких адресов нет :-)
Естественно эта переменная никак в программе не изменяется и доступа
к ней нет.
Пробовал менять CSTACK и RSTACK, толку - ноль.

Отсюда вопрос - что делать ?
Ну за одно уж и кто виноват ? :-)
А то ведь IAR все хвалят - не думаю я, что такой хороший компилер
"виноват" в таком поведении программы.

Заранее спасибо.

--
С уважением
Павел Сироткин
We've slightly trimmed the long signature. Click to see the full one.
Re: Что не так с IAR ?

Quoted text here. Click to load it

Попробуй сначала объявить локальный массив, а потом проинициализировать. Если не
изменяет память, где-то такое у меня проскакивало.  


Re: Что не так с IAR ?
Здравствуйте, Константин.

PS> > unsigned char ROM[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
Quoted text here. Click to load it
KM> Попробуй сначала объявить локальный массив, а потом проинициализировать.
KM>Если не изменяет память, где-то такое у меня проскакивало.

Пробовал. Результат тот же.

--
С уважением
Павел Сироткин
We've slightly trimmed the long signature. Click to see the full one.
Re: Что не так с IAR ?
       Доброго здоровья, Pavel!

08 Jul 04 00:16, Pavel Sirotkin написал для All:


 PS> unsigned char ROM[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
 PS> unsigned char id_bit;
 PS> unsigned char cmp_id_bit;
 PS> unsigned char SearchDirection;
 PS> unsigned char LastDeviceFlag = 0;
 PS> unsigned char id_bit_number;
 PS> unsigned char byte_index;
 PS> unsigned char mask;
 PS> unsigned char LastDiscrepancy = 0;
 PS> unsigned char last_zero;
 PS> unsigned char cnt = 0;
 PS> unsigned char i;

 PS> Суть в том, что если всю эту конструкцию компилирую в CodeVision,
 PS> компилер "заставляет" увеличить Data Stack до 41 байта (по дефолту там 37)
 PS> и спокойненько распихивает все переменные по регистрам и памяти.
 PS> IAR же так молча с дефолтовыми настройками - CSTACK 0x20,
 PS> RSTACK 16, Memory model Tiny - компилирует. Hи варнингов ни ерроров
 PS> не выдает. А потом в отладчике (проверял и в иаровском и в АВР Студио)
 PS> "пропадает" переменная ROM[8]. Т.е. она располагается по адресу 0x17E.
 PS> Что то мне сердце подсказывает, что в 2313 таких адресов нет :-)
 PS> Естественно эта переменная никак в программе не изменяется и доступа
 PS> к ней нет.
 PS> Пробовал менять CSTACK и RSTACK, толку - ноль.

  ты, случаем, внешнюю память не забыл отключить?

    WBR, Сергей.                                     ICQ: 101347299

... Дайте им свободу, и они проголосуют за рабство.

Re: Что не так с IAR ?
Здравствуйте, Сергей.

ST>   ты, случаем, внешнюю память не забыл отключить?

Имется ввиду External Memory Configuration ? Флажок Enable external memory
bus ?
При выборе --cpu23%13 сей флажок недоступен и по дефолту выключен.

Или что то другое ?

--
С уважением
Павел Сироткин
We've slightly trimmed the long signature. Click to see the full one.
Re: Что не так с IAR ?
Hемедленно нажми на RESET, Pavel Sirotkin!


 PS> из майна вызывается функция OWSearch. В ней тоже куча локальных:
 PS> unsigned char ROM[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
 PS> unsigned char id_bit;
  ...

 PS> IAR же так молча с дефолтовыми настройками - CSTACK 0x20,
 PS> RSTACK 16, Memory model Tiny - компилирует. Hи варнингов ни ерроров
 PS> не выдает. А потом в отладчике (проверял и в иаровском и в АВР Студио)
 PS> "пропадает" переменная ROM[8]. Т.е. она располагается по адресу 0x17E.
 PS> Что то мне сердце подсказывает, что в 2313 таких адресов нет :-)
 PS> Естественно эта переменная никак в программе не изменяется и доступа
 PS> к ней нет. Пробовал менять CSTACK и RSTACK, толку - ноль.

 PS> Отсюда вопрос - что делать ? Hу за одно уж и кто виноват ? :-)
 PS> А то ведь IAR все хвалят - не думаю я, что такой хороший компилер
 PS> "виноват" в таком поведении программы.

  Тем не менее, факты налицо. Однако неплохо бы изучить опции задаваемые
компоновщику, так и карту памяти создаваемую компоновщиком, где там ROM
оказывается и почему так происходит. Создаётся впечатление, что ROM
попросту переносится из стека (функция уже не допускает вложенные
вызовы!) в сегмент памяти то ли определённый неизверстно как, то ли
попросту неопределённый.



Что не так с IAR ?
       Доброго здоровья, Pavel!

08 Jul 04 13:17, Kirill Frolov написал для Pavel Sirotkin:

 PS>> из майна вызывается функция OWSearch. В ней тоже куча локальных:
 PS>> unsigned char ROM[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
 PS>> unsigned char id_bit;
 KF>   ...

 PS>> IAR же так молча с дефолтовыми настройками - CSTACK 0x20,
 PS>> RSTACK 16, Memory model Tiny - компилирует. Hи варнингов ни ерроров
 PS>> не выдает. А потом в отладчике (проверял и в иаровском и в АВР Студио)
 PS>> "пропадает" переменная ROM[8]. Т.е. она располагается по адресу 0x17E.
 PS>> Что то мне сердце подсказывает, что в 2313 таких адресов нет :-)
 PS>> Естественно эта переменная никак в программе не изменяется и доступа
 PS>> к ней нет. Пробовал менять CSTACK и RSTACK, толку - ноль.

 PS>> Отсюда вопрос - что делать ? Hу за одно уж и кто виноват ? :-)
 PS>> А то ведь IAR все хвалят - не думаю я, что такой хороший компилер
 PS>> "виноват" в таком поведении программы.

 KF>   Тем не менее, факты налицо. Однако неплохо бы изучить опции задаваемые
 KF> компоновщику, так и карту памяти создаваемую компоновщиком, где там ROM
 KF> оказывается и почему так происходит. Создаётся впечатление, что ROM
 KF> попросту переносится из стека (функция уже не допускает вложенные
 KF> вызовы!) в сегмент памяти то ли определённый неизверстно как, то ли
 KF> попросту неопределённый.


  Да, кстати. У ИАРа, если принудительно не установить противное, строки
линкуются во внешнюю память. очень похоже на твой случай

    WBR, Сергей.                                     ICQ: 101347299

... Hе любить женщин - преступление. Любить - наказание.

Re: Что не так с IAR ?
Здравствуйте,Sergei

Quoted text here. Click to load it

При выборе --cpu23%13 -> Memory model Small не доступна для выбора
(то бишь модель _всегда_ -> Tiny) и соответсвенно "Place string literals and
constants in initialized RAM" по дефолту установлена и не доступна для
изменения.

Или не туда смотрю ?

--
С уважением
Павел Сироткин
We've slightly trimmed the long signature. Click to see the full one.
Re: Что не так с IAR ?
Hемедленно нажми на RESET, Pavel Sirotkin!



 PS> А ничего не говорит. Массива ROM[] в нем нету,только глобальный массив
 PS> FoundROM[][].

  Так здесь его и не будет. Hадо смотреть ассемблерный листинг -- там
есть, с каким-нибуть именем, вроде L12345. И потом это локальный символ.


Re: Что не так с IAR ?
Здравствуйте,Kirill

KF> Тем не менее, факты налицо. Однако неплохо бы изучить опции задаваемые
KF> компоновщику, так и карту памяти создаваемую компоновщиком, где там ROM
KF> оказывается и почему так происходит. Создаётся впечатление, что ROM
KF> попросту переносится из стека (функция уже не допускает вложенные
KF> вызовы!) в сегмент памяти то ли определённый неизверстно как, то ли
KF> попросту неопределённый.

Судя по адресу в отладчике -> попадает во флеш.

Опции изучить неплохо бы конечно :-) Просто странно,что другой компилер
нормально все компилирует (ну принудительно стек увеличивает только)
при чем этот "другой" компилер -> проще, дешевле и так далее.
Плюс IAR в том,что код на выходе меньше байт на 200.
Странно,что при расположении этого злосчастного массива в области
глобальных переменных -> все работает.

--
С уважением
Павел Сироткин
We've slightly trimmed the long signature. Click to see the full one.
Re: Что не так с IAR ?
       Доброго здоровья, Pavel!

08 Jul 04 22:08, Pavel Sirotkin написал для Sergei Tuchinski:

 ST>>   ты, случаем, внешнюю память не забыл отключить?

 PS> Имется ввиду External Memory Configuration ? Флажок Enable external memory
 PS> bus ?
 PS> При выборе --cpu23%13 сей флажок недоступен и по дефолту выключен.

  тады не оно. а мап-файл линкера чего говорит? в какой сегмент попадает
массив?

    WBR, Сергей.                                     ICQ: 101347299

... Делай с другими то же, что они собираются сделать с тобой: бей первым

Re: Что не так с IAR ?
Здравствуйте,Sergei

Quoted text here. Click to load it

А ничего не говорит. Массива ROM[] в нем нету,только глобальный массив
FoundROM[][].


?ABS_ENTRY_MOD
  _..X_FLASH_BASE                  CODE      00000016
  _..X_RSTACK_SIZE                 CODE      00000010
  _..X_CSTACK_SIZE                 CODE      00000032
  _..X_HEAP_SIZE                   CODE      00000000
  _..X_EEPROM_END                  CODE      0000007F
  _..X_SRAM_END                    CODE      000000DF
  _..X_SRAM_BASE                   CODE      00000060
  _..X_FLASH_END                   CODE      000007FF
  _..X_INTVEC_SIZE                 CODE      00000016
1 ( C:\My\Temp\C\IAR\Debug\Obj.r90 )
  ow_reset                         CODE      0000002C
  write_bit                        CODE      00000060
  write_byte                       CODE      00000082
  read_bit                         CODE      000000AE
  read_byte                        CODE      000000CA
  calc_crc                         CODE      000000F4
  FoundROM                         DATA      00000063
  OWSearch                         CODE      0000013E
  Read_Temperature                 CODE      00000230
  LED_code                         CODE      00000019
  symbols                          DATA      00000060
  position                         DATA      00000073
  perevod                          CODE      0000032E
  main                             CODE      00000398
  timer0_overflow                  CODE      000003D6
  ?<Segment init: TINY_Z>          CODE      00000023
  ?<Segment init: TINY_I>          CODE      00000027
  _A_PIND                          DATA      00000030
  _A_DDRD                          DATA      00000031
  _A_PORTD                         DATA      00000032
  _A_DDRB                          DATA      00000037
  _A_PORTB                         DATA      00000038
  _A_TCNT0                         DATA      00000052
  _A_TCCR0                         DATA      00000053
  _A_TIMSK                         DATA      00000059
  __?EECR                          DATA      0000001C
  __?EEDR                          DATA      0000001D
  __?EEARL                         DATA      0000001E



--
С уважением
Павел Сироткин
We've slightly trimmed the long signature. Click to see the full one.

Site Timeline