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

 
 
> Размещение "изменчивой" переменной в регистре, 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

Сообщений в этой теме
- 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   Цитата(mdmitry @ May 23 2007, 14:32) У Ва...   May 23 2007, 09:17
|- - singlskv   Цитата(Snaky @ May 23 2007, 13:17) насчет...   May 23 2007, 09:32
|- - Snaky   Выкладываю минимум где наблюдается. В коде помечен...   May 23 2007, 09:45
|- - aesok   Цитата(Snaky @ May 23 2007, 13:45) Выклад...   May 23 2007, 10:02
|- - 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 Текстовая версия Сейчас: 20th June 2025 - 12:10
Рейтинг@Mail.ru


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