|
|
  |
Как в WinAVR разместить переменную в регистре? |
|
|
|
Apr 24 2009, 06:40
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(IgorAVR2 @ Apr 24 2009, 10:28)  Или как из Си winavr писать данные в нужный регистр?
register unsigned char counter asm("r4"); - не помогает!!!
То есть если пишем код: register unsigned char counter asm("r4"); counter=5; temp=counter;
то в дизасме видно, что переменную в r4 он не создаёт и естественно не присваивает r4=5 , а просто в temp загружает 5.
Мне нужно из Си писать в регистр и постоянно держать там эти данные, что бы постоянно использовать в прерывании, которое на Асме. avr-libc-user-manual FAQ Читайте вопросы 1и 3. Но я бы не советовал вам это использовать. GCC не всегда учитывает модификатор volatile у регистровых переменных. Если всеже решите их использовать попробуйте сделать доступ к таким переменным из программы на С с помощью ассемблерной вставки. Анатолий.
|
|
|
|
|
Apr 24 2009, 06:55
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(IgorAVR2 @ Apr 24 2009, 10:54)  Так а я ваам про что? Вы видели что я написал? Моя строчка кода это вопрос 3 FAQ и есть. Только она почему то нифига не работает, то есть в самом регистре ничего не создаёт!!!
Почему так? Потому что Вы не почитали FAQ 1 и мой коментарий. Анатолий.
Сообщение отредактировал aesok - Apr 24 2009, 06:56
|
|
|
|
|
Apr 24 2009, 07:21
|
Частый гость
 
Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901

|
Цитата(MrYuran @ Apr 24 2009, 10:13)  Насколько я понял, не рекомендуется размещать переменные в r3-r7, т.к. они используются при вызовах функций. Только что попробовал использовать r10 -результат такой же, ничего он там не размещает и ничему не присваевает.
|
|
|
|
|
Apr 24 2009, 07:22
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(IgorAVR2 @ Apr 24 2009, 11:06)  Читал и FAQ 1 и ваш коментарий, но тода получается что что то не допонял что там написано.
Поясните пожалуйста как происходит и как сделать так что бы компилятор имменно там разместил переменную. Размещаете переменную Вы правильно, только Вы не учитывате тот момент, что GCC это оптимизизирующий С компилятор. Вот он и отимизирует код: counter=5; temp=counter; в: temp=5; Ведь далее в этой функции переменная 'counter' не используеться, правильно? Так зачем выполнять лишнию пересылку? А что Вы там написали на ассемблере и как используете переменную counter компилятор C не знает и не учитывает. Доля того чтобы указать компилятору чтобы он не оптимизировал доступ к переменной служет модификатор "volatile". Это для обычных переменных, но GCC иногда теряет модификатор "volatile" для регистровых переменных, и последнии версии выдают предупреждение когда компилируют код с такими переменными. Анатолий.
|
|
|
|
|
Apr 24 2009, 08:18
|
Частый гость
 
Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901

|
Спасибо, Анатолий. Да именно так всё и есть, как вы описали.
Да, приписав volatile он действительно стал создавать эту переменную в регистре - дизасме это то же видно, как мне было и нужно!!! Победа!!! Вчерашний день мучений закончился сегодня благодаря вам. Надеюсь побочных эффектов с потерями модификатора не будет. Ещё раз спасибо.
Ещё вопрос:
можно ли разместить а регистре не переменную, а массив, начиная с какого нибудь регистра?
Всё равно не совсем работает как надо. А именно: если потом эту переменную используем как нибудь, то он действительно создаёт её в регистре, если дальше не использовать её, а просто присвоить ей значение, то в регистре она не создаётся и регистр ничему не присваивается. При этом эта переменная видна только там где описана, в других функциях не видна, хоть и описана как volatile.
|
|
|
|
|
Apr 24 2009, 09:50
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(IgorAVR2 @ Apr 24 2009, 12:18)  можно ли разместить а регистре не переменную, а массив, начиная с какого нибудь регистра? Можно, но вначеле внимательно перечитайте FAQ #3. Цитата(IgorAVR2 @ Apr 24 2009, 12:18)  При этом эта переменная видна только там где описана, в других функциях не видна, хоть и описана как volatile. У меня плохо получаеться объяснять, а то что Вам не понятно в этом предложении обычно очень хорошо обясняется в книжках по языку С. Анатолий.
|
|
|
|
|
Apr 24 2009, 11:11
|

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

|
Цитата(IgorAVR2 @ Apr 24 2009, 14:34)  И как же всё таки сделать, что бы таки переменные всегда там создавались, даже если не используються дальше в программе, а просто присваивается им значение? Компилятор оптимизирующий и имеет право выкидывать неиспользуемый код. Кстати, если у Вас не включены почти все предупреждения, то Вы много интересной информации о результатах компиляции упускаете. Выдержка из моего makefile Код CFLAGS += -Wall CFLAGS += -Wstrict-prototypes CFLAGS += -Wundef CFLAGS += -Wunreachable-code #CFLAGS += -Wsign-compare CFLAGS += -Wvolatile-register-var CFLAGS += -Wunused CFLAGS += -Wextra Я использовал назначения регистровых переменных для работы с прерываниями, правда только на С, и переменные явно использовались. Код register uint8_t curdata asm("r7"); // r7 register uint8_t baudr asm("r6"); // r6 register uint8_t val_baud asm("r5"); // r5 volatile register uint8_t flag asm("r4"); // r4 volatile register uint16_t txd_Tail asm("r2"); // r2, r3 Будьте внимательны, список доступных к использованию регистров зависит от версии Winavr.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Apr 25 2009, 22:29
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(IgorAVR2 @ Apr 24 2009, 14:34)  И как же всё таки сделать, что бы такие переменные всегда там создавались, даже если не используються дальше в программе, а просто присваивается им значение? Скорее всего Вам придеться делать некоторые спец телодвижения, Вам нужно сделать несколько противоречащих здравому смыслу вещей...  , - разместить определение Ваших регистровых переменных в xxx.h файле который будет подключаться везде... - Все функции с обращениями к данным регистрам(в том числе и прерывания...), разместить в отдельных файлах(типа раздельная компиляция) - ну и все это проверить в листинге...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|