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

 
 
 
Reply to this topicStart new topic
_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
defunct
сообщение May 27 2007, 00:45
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



оптимизация включена?
Go to the top of the page
 
+Quote Post
kv_addr
сообщение May 27 2007, 01:34
Сообщение #3


Местный
***

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



Цитата(_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, чтобы увидеть результат.
Go to the top of the page
 
+Quote Post
_artem_
сообщение May 27 2007, 02:00
Сообщение #4


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

Группа: Свой
Сообщений: 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
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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
IgorKossak
сообщение May 27 2007, 07:12
Сообщение #6


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

__regvar __no_init unsigned char test;

Номер конкретного регистра забыли присвоить.
Go to the top of the page
 
+Quote Post
_artem_
сообщение May 27 2007, 09:18
Сообщение #7


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

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



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

2 kv_addr
Я весь листинг поиsком прошелся - требуемые регистры в main не присваиваются.
Прикрепленные файлы
Прикрепленный файл  main_listing.rar ( 1.95 килобайт ) Кол-во скачиваний: 46
 


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

Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 27 2007, 14:25
Сообщение #8


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

PS Не приводите длинных текстов в сообщении, а вкладывайте в приаттаченные файлы (исправьте предыдущий пост).
Go to the top of the page
 
+Quote Post
_artem_
сообщение May 27 2007, 19:43
Сообщение #9


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

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



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


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

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


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


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


За это приношу свои извинения. Исправил.


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

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 10:39
Рейтинг@Mail.ru


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