реклама на сайте
подробности

 
 
> Проблема с IAR, ...
_artem_
сообщение May 26 2007, 23:03
Сообщение #1


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



При декларировании переменной как регистровой (пример внизу)

__regvar __no_init unsigned char test;

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

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

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


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_artem_
сообщение May 27 2007, 02:00
Сообщение #2


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



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

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


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
kv_addr
сообщение May 27 2007, 02:20
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



Цитата(_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;

то даже при высокой оптимизации регистровая переменная игнорирована не будет.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 21:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016