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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Размещение "изменчивой" переменной в регистре, WinAVR
mdmitry
сообщение May 23 2007, 08:32
Сообщение #16


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



>avr-gcc --std=gnu99 -c -g -Os -ffixed-r15 -Wall -D_DEBUG -Wstrict-prototypes -mmcu=atmega8 main.c -o >main.o
У Вас оптимизация по объему кода -Os.
В моем случае была оптимизация по скорости -O2. Возможно это влияет на результат. Попробуйте поменять режим оптимизации.
В дополнение к замечаниям по регистрам: регистры r2-r15 отданы пользователю в WinAVR, о чем есть в справке по библиотеке замечание, поэтому перекомпилировать библиотеку нет необходимости.

Сообщение отредактировал mdmitry - May 23 2007, 08:37


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Snaky
сообщение May 23 2007, 08:32
Сообщение #17


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
Сообщение #18


дятел
*****

Группа: Свой
Сообщений: 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
aesok
сообщение May 23 2007, 08:50
Сообщение #19


Знающий
****

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



Цитата(mdmitry @ May 23 2007, 12:32) *
В дополнение к замечаниям по регистрам: регистры r2-r15 отданы пользователю в WinAVR, о чем есть в справке по библиотеке замечание, поэтому перекомпилировать библиотеку нет необходимости.


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

Анатолий.

Сообщение отредактировал aesok - May 23 2007, 09:13
Go to the top of the page
 
+Quote Post
Snaky
сообщение May 23 2007, 09:17
Сообщение #20


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
mdmitry
сообщение May 23 2007, 09:30
Сообщение #21


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



>R2..R17
Из документации по Winavr:
AVR Libc 1.4.5
FAQ
3. How to permanently bind a variable to a register?

This can be done with

register unsigned char counter asm("r3");

Typically, it should be possible to use r2 through r15 that way.


Использую сейчас r2-r11.
Посмотрел свой код и обнаружил следующее:
1. Если в основной программе элементарные действия (инкремент) с регистровыми данными (вариант 3 описания), то идет прямое использование регистров.
2. Действия более сложные (инкремент и работа с массивами), то начинает использоваться копирование в рабочие регистры WINAVR.

IMHO: компилятор в зависимости от кода сам решает вопрос о использовании рабочих регистров и копировании данных. В моем коде без копирования все же не обойтись sad.gif

Сообщение отредактировал mdmitry - May 23 2007, 09:32


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 23 2007, 09:32
Сообщение #22


дятел
*****

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


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
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 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 23 2007, 10:06
Сообщение #25


Mute Beholder
***

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



Цитата(aesok @ May 23 2007, 16:02) *
Я же вам уже написал - GCC не поддерживает volatile register перемнные. Вы хотите доказать очевидный факт?
Вот почему у вас нет варинга это да, странно.

Да нет, не пытаюсь доказать, просто выкладываю по просьбе.


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


Знающий
****

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



Цитата(aesok @ May 23 2007, 14:02) *
Вот почему у вас нет варинга это да, странно.


Посмотрел в WinAVR-20060421.

demo.c
Код
register volatile unsigned char Timer asm("r15");


C:\work\avr>avr-gcc -Wall demo.c
demo.c:1: warning: volatile register variables don't work as you might wish

Кто нибудь проверте в WinAVR-2007.. (GCC 4.1.x)

Анатолий.

Сообщение отредактировал aesok - May 23 2007, 10:17
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 23 2007, 10:40
Сообщение #27


дятел
*****

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



Цитата(Snaky @ May 23 2007, 14:06) *
Да нет, не пытаюсь доказать, просто выкладываю по просьбе.


1. зачем
unsigned char tmp1, max;
сделаны глобальными ???
при переносе их в main скомпилированный код уменьшается с 296 до 270 байт

2.циклы в прерывании не есть хорошо

3. убрал volatile, warning исчез
вот код:
Код
78:           while(!Flag.Tick);
+0000006E:   91800060    LDS     R24,0x0060       Load direct from data space
+00000070:   FF80        SBRS    R24,0            Skip if bit in register set
+00000071:   CFFC        RJMP    PC-0x0003        Relative jump
79:           Flag.Tick = FALSE;
+00000072:   91800060    LDS     R24,0x0060       Load direct from data space
+00000074:   7F8E        ANDI    R24,0xFE         Logical AND with immediate
+00000075:   93800060    STS     0x0060,R24       Store direct to data space
80:           if (Timer > max) max = Timer;   // <-- LOOK HERE!
+00000077:   152F        CP      R18,R15          Compare
+00000078:   F408        BRCC    PC+0x02          Branch if carry cleared
+00000079:   2D2F        MOV     R18,R15          Copy register
81:           tmp1--;
+0000007A:   5091        SUBI    R25,0x01         Subtract immediate
82:         }
+0000007B:   F791        BRNE    PC-0x0D          Branch if not equal

с R15 вроде как все в порядке

P.S. Одно маленькое уточнение, версия компилятора у меня 20060421
Его Вам и порекомендую, особенно учитывая что проц у вас Tiny13

P.S.S Еще одно маленькое уточнение/вопрос

А нужен ли вобще volatile, в том случае, если переменная регистровая и мы
убедились в том что она дейсвительно разместилась в регистре (-ffixed) ???
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 23 2007, 12:31
Сообщение #28


дятел
*****

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



Да, и еще одно небольшое добавление
Если не хотите переползать на предыдущию версию
можете попробовать сделать еще так:

register unsigned char Timer asm("r15"); // без volatile
........
if ((volatile unsigned char)Timer > max) max = (volatile unsigned char)Timer; // <-- LOOK HERE!

Может быть поможет...
Go to the top of the page
 
+Quote Post
Snaky
сообщение May 24 2007, 02:22
Сообщение #29


Mute Beholder
***

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



Цитата(singlskv @ May 23 2007, 16:40) *
1. зачем
unsigned char tmp1, max;
сделаны глобальными ???

3. убрал volatile, warning исчез
с R15 вроде как все в порядке

1. Я же кусочек выдрал из всего проекта (повыкидывал другие функции) и не стал его вылизывать, переменные локализовывать.
3. Да и не было у меня warning-а изначально, про что сейчас речь и идет. И с R15 не в порядке было при любом объявлении.
Цитата
А нужен ли вобще volatile, в том случае, если переменная регистровая и мы
убедились в том что она дейсвительно разместилась в регистре (-ffixed) ???

На этот вопрос я отвечал уже выше.

Ладно, думаю тема исчерпана. Для себя сделал выводы, что лучше так не делать ибо gcc это не приветствует 05.gif , хотя, гад, и предупреждать отказывается. Ну и, естественно, новое не всегда лучше старого.


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение May 24 2007, 08:55
Сообщение #30


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



>хотя, гад, и предупреждать отказывается. Ну и, естественно, новое не всегда лучше старого.
При опции -Wall включены не все предупреждения, в частности, упомянутое ранее. Это описано в документации к gcc.
Ваш тест запустил под WINAVR-2007. Действительно есть копирование. Предупреждения нет, так как в опциях компилятора не указано его генерировать. В своем проекте на пробу включил smile.gif предупреждения, так сразу 5 штук получил crying.gif .


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post

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

 


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


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