|
Размещение "изменчивой" переменной в регистре, WinAVR |
|
|
|
May 23 2007, 08:32
|

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.
|
|
|
|
|
May 23 2007, 08:47
|
дятел
    
Группа: Свой
Сообщений: 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") А вобще, приведите минимальный "рабочий" код в котором будет ошибка, будет проще разобраться
|
|
|
|
|
May 23 2007, 08:50
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 23 2007, 09:17
|

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.
|
|
|
|
|
May 23 2007, 09:30
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 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: компилятор в зависимости от кода сам решает вопрос о использовании рабочих регистров и копировании данных. В моем коде без копирования все же не обойтись
Сообщение отредактировал mdmitry - May 23 2007, 09:32
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
May 23 2007, 09:32
|
дятел
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 23 2007, 09:45
|

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

|
Выкладываю минимум где наблюдается. В коде помечено комментарием. Параметры вызова видны в makefile.
--------------------
Common sense is not so common.
|
|
|
|
|
May 23 2007, 10:02
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Snaky @ May 23 2007, 13:45)  Выкладываю минимум где наблюдается. В коде помечено комментарием. Параметры вызова видны в makefile. Я же вам уже написал - GCC не поддерживает volatile register перемнные. Вы хотите доказать очевидный факт? Вот почему у вас нет варинга это да, странно. Анатолий.
|
|
|
|
|
May 23 2007, 10:06
|

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

|
Цитата(aesok @ May 23 2007, 16:02)  Я же вам уже написал - GCC не поддерживает volatile register перемнные. Вы хотите доказать очевидный факт? Вот почему у вас нет варинга это да, странно. Да нет, не пытаюсь доказать, просто выкладываю по просьбе.
--------------------
Common sense is not so common.
|
|
|
|
|
May 23 2007, 10:15
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 23 2007, 10:40
|
дятел
    
Группа: Свой
Сообщений: 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) ???
|
|
|
|
|
May 24 2007, 02:22
|

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 это не приветствует  , хотя, гад, и предупреждать отказывается. Ну и, естественно, новое не всегда лучше старого.
--------------------
Common sense is not so common.
|
|
|
|
|
May 24 2007, 08:55
|

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

|
>хотя, гад, и предупреждать отказывается. Ну и, естественно, новое не всегда лучше старого. При опции -Wall включены не все предупреждения, в частности, упомянутое ранее. Это описано в документации к gcc. Ваш тест запустил под WINAVR-2007. Действительно есть копирование. Предупреждения нет, так как в опциях компилятора не указано его генерировать. В своем проекте на пробу включил  предупреждения, так сразу 5 штук получил  .
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|