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

 
 
> Размещение "изменчивой" переменной в регистре, 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
Ответов
forever failure
сообщение May 23 2007, 07:01
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



{
volatile register unsigned char eol_trans_uart asm ("r15");
if (PORTC & BIT (MODBUS_ENABLE_TRANS_BIT))
return;
/* ... */

}
avr-gcc --std=gnu99 -c -g -Os -ffixed-r15 -Wall -D_DEBUG -Wstrict-prototypes -mmcu=atmega8 main.c -o main.o
io.h: In function `main':
io.h:21: warning: volatile register variables don't work as you might wish

Может об этом и предупреждение ?
Go to the top of the page
 
+Quote Post
Snaky
сообщение May 23 2007, 07:12
Сообщение #3


Mute Beholder
***

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



Цитата(forever failure @ May 23 2007, 13:01) *
io.h:21: warning: volatile register variables don't work as you might wish
Может об этом и предупреждение ?

Очень похоже что именно об этом. Странно что у меня Build succeeded with 0 Warnings... (WinAVR 20070122).


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


Знающий
****

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



Цитата(Snaky @ May 23 2007, 11:12) *
Очень похоже что именно об этом. Странно что у меня Build succeeded with 0 Warnings... (WinAVR 20070122).


Скорее всего причина в том что нет ключа "-Wall" в коммандной строке компилятора.

Анатолий.
Go to the top of the page
 
+Quote Post
Snaky
сообщение May 23 2007, 08:20
Сообщение #5


Mute Beholder
***

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



Цитата(aesok @ May 23 2007, 14:11) *
Скорее всего причина в том что нет ключа "-Wall" в коммандной строке компилятора.

Есть.


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 23 2007, 08:27
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Snaky @ May 23 2007, 11:20) *
Есть.

Попробуй к нему добавить ключ -Wextra


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Snaky
сообщение May 23 2007, 08:32
Сообщение #7


Mute Beholder
***

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



Цитата(ReAl @ May 23 2007, 14:27) *
Попробуй к нему добавить ключ -Wextra

C ключом -Wextra 1 warning: 'register' is not at beginning of declaration
Поменял местами register и volatile: register volatile unsigned char Timer asm("r15");
Результат: Build succeeded with 0 Warnings... Генерируемый код от перестановки, как и следовало ожидать, не изменился.


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


дятел
*****

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



Цитата(Snaky @ May 23 2007, 12:32) *
C ключом -Wextra 1 warning: 'register' is not at beginning of declaration
Поменял местами register и volatile: register volatile unsigned char Timer asm("r15");
Результат: Build succeeded with 0 Warnings... Генерируемый код от перестановки, как и следовало ожидать, не изменился.

Попробуйте убрать volatile из определения Timer
используйте -ffixed
ИМХО, регистры лучше выбирать снизу (исключая r0,r1), то есть например asm("r2")

А вобще, приведите минимальный "рабочий" код в котором будет ошибка, будет проще
разобраться
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
|- - 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 Текстовая версия Сейчас: 22nd June 2025 - 17:26
Рейтинг@Mail.ru


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