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

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> Рассуждения о _regvar и register, Вынесено из темы "Глюки компилятора.."
ReAl
сообщение Jan 27 2008, 09:30
Сообщение #46


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

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



Цитата(aesok @ Jan 26 2008, 23:22) *
Используя код:
Код
register unsigned char counter asm("r3");

Вы заставляете компилятор разместить переменную counter в регистре r3 контроллера. И всю ответственность за этот поступок берете на себя.

В GCC полностью безопасно использовать регистры r2..r7 для объявления переменных. (С точки зрения компилятора, если только Вы сами не будете их изменять в ассемблерных вставках.)
Вот этим-то я и интересовался, ещё когда порт scmRTOS 1.x на avr-gcc обсуждался. И результат - в общем случае в avr-gcc лучше обойтись без -ffixed-reg и register ...asm("rX").
В некоторых функциях библиотек эти r2-r7 таки используются (в частности, a/b при uint64_t a, b задействует их все). Да, они их сохраняют и восстанавливают, но ведь обработчики прерываний об этом не знают.
На этом я и остановился - не стал разбираться, можно ли перекомпилировать библиотеки с запрещёнными к использованию несколькими регистрами (даст ли это что-то, не используются ли они в частях библиотек, кодированных на асме и т.д.). Можно ещё было поразбираться - какие именно функции залазят в эти регистры - возможно, кроме 64-битных целых и, к примеру, плавающей точки, никто туда и не залазит, но я просто решил для себя - если желание разместить глобальные переменные в регистрах возникнет, значит это будет задача под чистый асм :-), "ведь играл писал же я их в молодости" (С) актёрская шутка.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 27 2008, 10:03
Сообщение #47


дятел
*****

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



Цитата(aesok @ Jan 27 2008, 02:39) *
У Вас есть пример кода для GCC который будет в такой ситуации некорректным ?
Да нашел на www.avrfreaks.net.
Код
...........

Регистровая переменная объявлена как volatile, код на уровне оптимизации -Os:
Происходит копирование R2:R3 в R24:R25, и в цикле анализируеться копия переменой s1 в R24:R25, а не она сама в R2:R3.

Проверил на WinAVR 200604...
Код генериться одинаковый и с и без volatile
Код
16:         sei();
+00000045:   9478        SEI                      Global Interrupt Enable
17:         TCNT0+=10;
+00000046:   B782        IN      R24,0x32         In from I/O location
+00000047:   5F86        SUBI    R24,0xF6         Subtract immediate
+00000048:   BF82        OUT     0x32,R24         Out to I/O location
18:         while(s1<10);
+00000049:   E08A        LDI     R24,0x0A         Load immediate
+0000004A:   1628        CP      R2,R24           Compare
+0000004B:   0431        CPC     R3,R1            Compare with carry
+0000004C:   F3E0        BRCS    PC-0x03          Branch if carry set
Вроде все правильно.
C volatile выдает warning.
Go to the top of the page
 
+Quote Post
aesok
сообщение Jan 27 2008, 10:25
Сообщение #48


Знающий
****

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



Цитата(ReAl @ Jan 27 2008, 12:30) *
Вот этим-то я и интересовался, ещё когда порт scmRTOS 1.x на avr-gcc обсуждался. И результат - в общем случае в avr-gcc лучше обойтись без -ffixed-reg и register ...asm("rX").
В некоторых функциях библиотек эти r2-r7 таки используются (в частности, a/b при uint64_t a, b задействует их все). Да, они их сохраняют и восстанавливают, но ведь обработчики прерываний об этом не знают.

Получаеться в GCC небезопасно использовать глобальные регистровые переменные. Только локальные.

Анатолий.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 27 2008, 20:23
Сообщение #49


дятел
*****

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



Цитата(ReAl @ Jan 27 2008, 12:30) *
Можно ещё было поразбираться - какие именно функции залазят в эти регистры - возможно, кроме 64-битных целых и, к примеру, плавающей точки, никто туда и не залазит, ....

Насколько я ничего не знаю, еще setjmp() и longjmp() могут портить R2-R7,
но если все вышеописаное не применяется, то вполне можно пользоваться ими
как зарезервированными.
Для себя, в случае такого резервирования, просто выработал правило после сборки
проверять листинг(просто поиском) на использование в тексте "чужих" конструкций с
зарезервированными мною регистрами.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 30 2008, 11:33
Сообщение #50


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(prottoss @ Jan 26 2008, 19:37) *
Обращаться к ним, по моему, тоже можно так же через указатели - ибо адреса регистров находятся в памяти данных с адреса 0!

Да все так и есть R0-R31 лежат в адресном пространстве SRAM с адресами 0x00-0x1F.

Цитата(prottoss @ Jan 26 2008, 21:32) *
__flash меняется на const

#define __flash const
smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 17:23
Рейтинг@Mail.ru


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