Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Что не так с IAR ?

19 views
Skip to first unread message

Pavel Sirotkin

unread,
Jul 7, 2004, 4:16:34 PM7/7/04
to
Здравствуйте.

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

Пишу "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


Konstantin Morozov

unread,
Jul 8, 2004, 12:21:20 AM7/8/04
to

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

> Здравствуйте.
>
> Столкнулся тут с интересной вещью:
>
> Пишу "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 };

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

Sergei Tuchinski

unread,
Jul 8, 2004, 12:53:42 AM7/8/04
to
Доброго здоровья, 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

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

Pavel Sirotkin

unread,
Jul 8, 2004, 2:08:29 PM7/8/04
to
Здравствуйте, Сергей.

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

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

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

Pavel Sirotkin

unread,
Jul 8, 2004, 2:09:00 PM7/8/04
to
Здравствуйте, Константин.

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

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

Kirill Frolov

unread,
Jul 8, 2004, 4:17:28 AM7/8/04
to
Hемедленно нажми на RESET, Pavel Sirotkin!

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


Sergei Tuchinski

unread,
Jul 9, 2004, 2:04:21 AM7/9/04
to
Доброго здоровья, 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

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

Sergei Tuchinski

unread,
Jul 9, 2004, 6:14:38 AM7/9/04
to
Доброго здоровья, 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е любить женщин - преступление. Любить - наказание.

Pavel Sirotkin

unread,
Jul 9, 2004, 1:46:03 PM7/9/04
to
Здравствуйте,Sergei

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

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

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

Pavel Sirotkin

unread,
Jul 9, 2004, 1:46:04 PM7/9/04
to
Здравствуйте,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

Pavel Sirotkin

unread,
Jul 9, 2004, 1:46:04 PM7/9/04
to
Здравствуйте,Kirill

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

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

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

Kirill Frolov

unread,
Jul 10, 2004, 6:25:25 AM7/10/04
to
Hемедленно нажми на RESET, Pavel Sirotkin!

On Fri, 09 Jul 04 20:46:04 +0400, Pavel Sirotkin wrote:


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

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

0 new messages