Что не так с IAR ?

Jul 07, 2004 11 Replies

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



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



Пишу "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 все хвалят - не думаю я, что такой хороший компилер "виноват" в таком поведении программы.



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


"Pavel Sirotkin" snipped-for-privacy@mail.wplus.net> сообщил/сообщила в новостях следующее: news:cchlmc$24jp$ snipped-for-privacy@ddt.demos.su...

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

Доброго здоровья, 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

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

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 попросту переносится из стека (функция уже не допускает вложенные вызовы!) в сегмент памяти то ли определённый неизверстно как, то ли попросту неопределённый.

Здравствуйте, Сергей.

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

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

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

Здравствуйте, Константин.

PS> > unsigned char ROM[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };

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

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

Доброго здоровья, Pavel!

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

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

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

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

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

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

Доброго здоровья, 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е любить женщин - преступление. Любить - наказание.

Здравствуйте,Sergei

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

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

Здравствуйте,Sergei

А ничего не говорит. Массива 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\1.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

Здравствуйте,Kirill

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

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

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

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

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required