Что не так с IAR ?

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

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

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

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

Reply to
Pavel Sirotkin
Loading thread data ...

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

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

Reply to
Konstantin Morozov

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

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

Reply to
Sergei Tuchinski

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

Reply to
Kirill Frolov

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

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

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

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

Reply to
Pavel Sirotkin

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

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

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

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

Reply to
Pavel Sirotkin

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

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

Reply to
Sergei Tuchinski

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

Reply to
Sergei Tuchinski

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

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

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

Reply to
Pavel Sirotkin

Здравствуйте,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
Reply to
Pavel Sirotkin

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

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

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

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

Reply to
Pavel Sirotkin

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

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

Reply to
Kirill Frolov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.