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