Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
_artem_
При декларировании переменной как регистровой (пример внизу)

__regvar __no_init unsigned char test;

присвоение ей какого либо значения в функции main()

void main(void)
{
test = 3;
for(;;)
;
}

игнорируется компайлером. Для решения проблемы инициализации можно создать отдельную функцию вызываемую из main() где эта инициализация и совершается. В этом случае присвоение происходит без проблем.
использую две версии 4.20 и с 4.21. Везьде одно и то же .
Интересно пропустил ли я что то из виду ?
defunct
оптимизация включена?
kv_addr
Цитата(_artem_ @ May 27 2007, 02:03) *
При декларировании переменной как регистровой (пример внизу)

__regvar __no_init unsigned char test;

присвоение ей какого либо значения в функции main()

void main(void)
{
test = 3;
for(;;)
;
}

игнорируется компайлером. Для решения проблемы инициализации можно создать отдельную функцию вызываемую из main() где эта инициализация и совершается. В этом случае присвоение происходит без проблем.
использую две версии 4.20 и с 4.21. Везьде одно и то же .
Интересно пропустил ли я что то из виду ?

Если включена оптимизация, то IAR игнорирует все, что не используется реально. В даном случае хотя и присваивается переменной test значение, но переменная потом нигде не используется. Достаточно совершить какое-либо "полезное" действие, хотя бы отослать test в один из SFR, чтобы увидеть результат.
_artem_
Оптимизация включена на скорость, выключить не могу. Фунцкию наверху привел как пример , к переменным/регистрам обрашаюсь в прерывании по INT0 (в прерывании обрашение к ним есть видн из асм листинга) и причем явно в C, декларировал как volatile - компайлеру начхать.

В асм листинге main() видно как компайлер поставил REQUIRE Register_Rx_is_global_var - то есть неспоптимизировал если правильно понял . Тоже самое в листинге для INT0 isr. В опциях проекта зарезервировал все регистры (от R4 до R15), номер регистра в декларации переменной из зарезервированного листа регистров.
kv_addr
Цитата(_artem_ @ May 27 2007, 05:00) *
Оптимизация включена на скорость, выключить не могу. Фунцкию наверху привел как пример , к переменным/регистрам обрашаюсь в прерывании по INT0 (в прерывании обрашение к ним есть видн из асм листинга) и причем явно в C, декларировал как volatile - компайлеру начхать.

В асм листинге main() видно как компайлер поставил REQUIRE Register_Rx_is_global_var - то есть неспоптимизировал если правильно понял . Тоже самое в листинге для INT0 isr. В опциях проекта зарезервировал все регистры (от R4 до R15), номер регистра в декларации переменной из зарезервированного листа регистров.

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

Код
__regvar __no_init char test @ 14;

//присвоение ей какого либо значения в функции main()

void main(void)
{
test = 3;
for(;;)
PORTB=test;
;
}


Оптимизация средняя или высокая:

Код
??main_0:
        LDI     R16, 3
        OUT     0x18, R16
        RJMP    ??main_0


Нет оптимизации или малая оптимизация:

Код
main:
        REQUIRE ?Register_R14_is_global_regvar
        LDI     R16, 3
        MOV     R14, R16
??main_0:
        OUT     0x18, R14
        RJMP    ??main_0


Добавлю:
Если же установите:
Код
volatile __regvar __no_init char test @ 14;

то даже при высокой оптимизации регистровая переменная игнорирована не будет.
IgorKossak
Цитата(_artem_ @ May 27 2007, 02:03) *
При декларировании переменной как регистровой (пример внизу)

__regvar __no_init unsigned char test;

Номер конкретного регистра забыли присвоить.
_artem_
Нет не забыл . Вот экстракт из асм листинг вместе с С кодом:

2 kv_addr
Я весь листинг поиsком прошелся - требуемые регистры в main не присваиваются.
IgorKossak
1. Хранить указатели не в регистровых парах не слишком оптимально (хотя и можно), т. к. всё равно требует пересылки.
2. Выражения, приведённые Вами, сводятся к константным, поэтому компилятор счёл возможным их заменить. Тем более, что в эти переменные не происходит сохранения, а значит они не нужны.

PS Не приводите длинных текстов в сообщении, а вкладывайте в приаттаченные файлы (исправьте предыдущий пост).
_artem_
Код
1. Хранить указатели не в регистровых парах не слишком оптимально (хотя и можно), т. к. всё равно требует пересылки.


Так вроде бы я так и делаю - выделил регистры под указатели . Или Вы хотите сказать что в регистрах держать указатели не выгодно ? Я не привел остальную часть программы в которой значения указателей меняются - в зависимости от условий используются разные таблицы но указатель один на одинаковый тип таблиц.

Код
2. Выражения, приведённые Вами, сводятся к константным, поэтому компилятор счёл возможным их заменить. Тем более, что в эти переменные не происходит сохранения, а значит они не нужны.


Почему же ? Я ж указатель могу и для чтения использовать и как итератор изменять значение указателя тоже можно для чтения из разных областей памяти (для того и использовал регистровый указатель). Речь не идет о том что вместо значения регистра изпользуется константа а наоборот - в другом месте программы где я читаю из flash с изпользованием этих регистров как указателей значения констант (адреса памяти во флеше) не используется вместо самого регистра, а наоборот, используется значение самого регистра. То есть налицо глюк а не оптимизация. При том варианте что я привел - программа не работает. Если поместить указатели в sram или при использовании регистровых указателей присвоить значение регистрам в какой либо другой функции (как я и делаю сейчас в листинге 112 // init_regs(); он закоментирован для симуляции проблемы) - все работает ОК.


Код
PS Не приводите длинных текстов в сообщении, а вкладывайте в приаттаченные файлы (исправьте предыдущий пост).


За это приношу свои извинения. Исправил.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.