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

 
 
> Размещение "изменчивой" переменной в регистре, WinAVR
Snaky
сообщение May 21 2007, 02:35
Сообщение #1


Mute Beholder
***

Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754



Как добиться, чтобы WinAVR разместил переменную в регистре и не оптимизировал ее?
Т.е. есть маленькая программа, хотелось одну переменную поместить в регистр для ускорения доступа, причем изменение переменной возможно в прерывании. Если бы писал на асме, то просто разместил бы переменную в регистре по своему усмотрению и использовал бы всегда значение этого регистра, однако с WinAVR такой трюк не прошел sad.gif .

Поясню:
1) Пишу: volatile unsigned char Timer;
Результат: переменная размещена в ОЗУ (@ 0x0078), считывается каждый раз. Все логично.
Дизасм:
if (Timer > max) max = Timer; // внутри цикла
Код
    LDS     R24,0x0078      // в цикле
    CP      R25,R24         // в цикле
    BRCC    PC+0x03         // в цикле
    LDS     R25,0x0078      // в цикле

2) Пишу: register unsigned char Timer asm("r15");
Результат: переменная размещена в регистре R15, но считывание оптимизировано. Тоже логично - компилятор "не знает", что она может менятся в прерывании.
Дизасм:
if (Timer > max) max = Timer; // внутри цикла
Код
   MOV     R19,R15      // за циклом
   ...
   CP      R25,R19      // в цикле
   BRCC    PC+0x02      // в цикле
   MOV     R25,R19      // в цикле
   ...

3) Пишу оба модификатора: volatile register unsigned char Timer asm("r15");
Результат: практически тот же, что и в п.2. Компилятор "частично помнит" что переменная volatile и при копировании использует значение регистра R15, однако при сравнении в цикле все равно использует копию R15 в R19. В результате программа не работает как ожидалось.
Дизасм:
if (Timer > max) max = Timer; // внутри цикла
Код
   MOV     R19,R15      // за циклом
   ...
   CP      R25,R19      // в цикле
   BRCC    PC+0x02      // в цикле
   MOV     R25,R15      // в цикле
   ...

В результате пришлось использовать вариант 1. Расходы на чтение/запись ОЗУ в принципе небольшие - 1 команда LDS. Однако в цикле уже ощутимо, да и все же хочется иметь возможность "управлять" действиями компилятора.


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Snaky
сообщение May 23 2007, 09:17
Сообщение #2


Mute Beholder
***

Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754



Цитата(mdmitry @ May 23 2007, 14:32) *
У Вас оптимизация по объему кода -Os.
В моем случае была оптимизация по скорости -O2. Возможно это влияет на результат. Попробуйте поменять режим оптимизации.

Не повлияло.

Цитата(singlskv @ May 23 2007, 14:47) *
Попробуйте убрать volatile из определения Timer
используйте -ffixed
ИМХО, регистры лучше выбирать снизу (исключая r0,r1), то есть например asm("r2")
А вобще, приведите минимальный "рабочий" код в котором будет ошибка, будет проще
разобраться

-ffixed использую, без volatile лучше не стало.
насчет порядка использования регистров - не согласен. где это сказано, что надо использовать снизу попорядку, а иначе будет неверный код? хотя все равно проверил - также копируется в R19.
Сейчас выдерну из проекта рабочий кусочек - выложу.

Цитата(aesok @ May 23 2007, 14:50) *
В avr-libc-user-manual а FAQ#13: "8.3.14 What registers are used by the C compiler?" описано как GCC использует регистры. Регистры которые можно безопастно использовать для регистровых переменных это r2..r7.

R2..R17


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 23 2007, 09:32
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Snaky @ May 23 2007, 13:17) *
насчет порядка использования регистров - не согласен. где это сказано, что надо использовать снизу попорядку, а иначе будет неверный код? хотя все равно проверил - также копируется в R19.
Сейчас выдерну из проекта рабочий кусочек - выложу.
R2..R17

А вот потому что:
• Function call conventions:
Arguments - allocated left to right, r25 to r8. All arguments are aligned to start in
even-numbered registers (odd-sized arguments, including char, have one free
register above them). This allows making better use of the movw instruction on
the enhanced core.

Это из того же 8.3.14
Go to the top of the page
 
+Quote Post
Snaky
сообщение May 23 2007, 09:45
Сообщение #4


Mute Beholder
***

Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754



Выкладываю минимум где наблюдается. В коде помечено комментарием.
Параметры вызова видны в makefile.
Прикрепленные файлы
Прикрепленный файл  testreg.zip ( 3.71 килобайт ) Кол-во скачиваний: 29
 


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post
aesok
сообщение May 23 2007, 10:02
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Snaky @ May 23 2007, 13:45) *
Выкладываю минимум где наблюдается. В коде помечено комментарием.
Параметры вызова видны в makefile.


Я же вам уже написал - GCC не поддерживает volatile register перемнные. Вы хотите доказать очевидный факт?

Вот почему у вас нет варинга это да, странно.

Анатолий.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Snaky   Размещение "изменчивой" переменной в регистре   May 21 2007, 02:35
- - makc   Посмотрите на опцию gcc -ffixed-reg: Цитата-ffixed...   May 21 2007, 04:27
- - mdmitry   Если в прерывании не используется более ничего, кр...   May 21 2007, 09:19
|- - Snaky   Цитата(mdmitry @ May 21 2007, 16:19) Если...   May 21 2007, 09:35
- - mdmitry   Посмотрел свой код и в нем объявленные переменные ...   May 22 2007, 10:22
|- - Snaky   Цитата(mdmitry @ May 22 2007, 16:22) Посм...   May 23 2007, 02:43
|- - dxp   Цитата(Snaky @ May 23 2007, 09:43) Посмот...   May 23 2007, 03:32
- - WHALE   Запретите в main во время работы с вашей переменно...   May 23 2007, 05:55
|- - Snaky   Цитата(WHALE @ May 23 2007, 11:55) Запрет...   May 23 2007, 06:35
- - forever failure   { volatile register unsigned char eol_trans_uar...   May 23 2007, 07:01
|- - Snaky   Цитата(forever failure @ May 23 2007, 13...   May 23 2007, 07:12
|- - aesok   Цитата(Snaky @ May 23 2007, 11:12) Очень ...   May 23 2007, 08:11
|- - Snaky   Цитата(aesok @ May 23 2007, 14:11) Скорее...   May 23 2007, 08:20
|- - ReAl   Цитата(Snaky @ May 23 2007, 11:20) Есть. ...   May 23 2007, 08:27
||- - Snaky   Цитата(ReAl @ May 23 2007, 14:27) Попробу...   May 23 2007, 08:32
||- - singlskv   Цитата(Snaky @ May 23 2007, 12:32) C ключ...   May 23 2007, 08:47
|- - aesok   Цитата(Snaky @ May 23 2007, 12:20) Есть. ...   May 23 2007, 08:30
- - mdmitry   >avr-gcc --std=gnu99 -c -g -Os -ffixed-r15 -Wal...   May 23 2007, 08:32
|- - aesok   Цитата(mdmitry @ May 23 2007, 12:32) В до...   May 23 2007, 08:50
|- - Snaky   Цитата(aesok @ May 23 2007, 16:02) Я же в...   May 23 2007, 10:06
||- - singlskv   Цитата(Snaky @ May 23 2007, 14:06) Да нет...   May 23 2007, 10:40
|- - aesok   Цитата(aesok @ May 23 2007, 14:02) Вот по...   May 23 2007, 10:15
- - mdmitry   >R2..R17 Из документации по Winavr: AVR Libc 1....   May 23 2007, 09:30
- - singlskv   Да, и еще одно небольшое добавление Если не хотите...   May 23 2007, 12:31
- - Snaky   Цитата(singlskv @ May 23 2007, 16:40) 1. ...   May 24 2007, 02:22
- - mdmitry   >хотя, гад, и предупреждать отказывается. Ну и,...   May 24 2007, 08:55


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:16
Рейтинг@Mail.ru


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