Столкнулся тут с интересной вещью:
Пишу "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 все хвалят - не думаю я, что такой хороший компилер
"виноват" в таком поведении программы.
Заранее спасибо.
--
С уважением
Павел Сироткин
siro...@mail.wplus.net
Попробуй сначала объявить локальный массив, а потом проинициализировать. Если не изменяет память, где-то такое у меня проскакивало.
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
... Дайте им свободу, и они проголосуют за рабство.
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>Если не изменяет память, где-то такое у меня проскакивало.
Пробовал. Результат тот же.
On Wed, 07 Jul 04 23:16:34 +0400, Pavel Sirotkin wrote:
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
попросту переносится из стека (функция уже не допускает вложенные
вызовы!) в сегмент памяти то ли определённый неизверстно как, то ли
попросту неопределённый.
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
... Делай с другими то же, что они собираются сделать с тобой: бей первым
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е любить женщин - преступление. Любить - наказание.
> Да, кстати. У ИАРа, если принудительно не установить противное, строки
> линкуются во внешнюю память. очень похоже на твой случай
При выборе --cpu=2313 -> Memory model Small не доступна для выбора
(то бишь модель _всегда_ -> Tiny) и соответсвенно "Place string literals and
constants in initialized RAM" по дефолту установлена и не доступна для
изменения.
Или не туда смотрю ?
> тады не оно. а мап-файл линкера чего говорит? в какой сегмент попадает
> массив?
А ничего не говорит. Массива 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
KF> Тем не менее, факты налицо. Однако неплохо бы изучить опции задаваемые
KF> компоновщику, так и карту памяти создаваемую компоновщиком, где там ROM
KF> оказывается и почему так происходит. Создаётся впечатление, что ROM
KF> попросту переносится из стека (функция уже не допускает вложенные
KF> вызовы!) в сегмент памяти то ли определённый неизверстно как, то ли
KF> попросту неопределённый.
Судя по адресу в отладчике -> попадает во флеш.
Опции изучить неплохо бы конечно :-) Просто странно,что другой компилер
нормально все компилирует (ну принудительно стек увеличивает только)
при чем этот "другой" компилер -> проще, дешевле и так далее.
Плюс IAR в том,что код на выходе меньше байт на 200.
Странно,что при расположении этого злосчастного массива в области
глобальных переменных -> все работает.
On Fri, 09 Jul 04 20:46:04 +0400, Pavel Sirotkin wrote:
PS> А ничего не говорит. Массива ROM[] в нем нету,только глобальный массив
PS> FoundROM[][].
Так здесь его и не будет. Hадо смотреть ассемблерный листинг -- там
есть, с каким-нибуть именем, вроде L12345. И потом это локальный символ.