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

 
 
 
Reply to this topicStart new topic
> Как в WinAVR разместить переменную в регистре?
IgorAVR2
сообщение Apr 24 2009, 06:28
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Или как из Си winavr писать данные в нужный регистр?

register unsigned char counter asm("r4"); - не помогает!!!

То есть если пишем код:
register unsigned char counter asm("r4");
counter=5;
temp=counter;

то в дизасме видно, что переменную в r4 он не создаёт и естественно не присваивает r4=5 , а просто в temp загружает 5.

Мне нужно из Си писать в регистр и постоянно держать там эти данные, что бы постоянно использовать в прерывании, которое на Асме.
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 24 2009, 06:40
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 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 у регистровых переменных. Если всеже решите их использовать попробуйте сделать доступ к таким переменным из программы на С с помощью ассемблерной вставки.

Анатолий.
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Apr 24 2009, 06:54
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Так а я ваам про что? Вы видели что я написал? Моя строчка кода это вопрос 3 FAQ и есть. Только она почему то нифига не работает, то есть в самом регистре ничего не создаёт!!!

Почему так?
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 24 2009, 06:55
Сообщение #4


Знающий
****

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



Цитата(IgorAVR2 @ Apr 24 2009, 10:54) *
Так а я ваам про что? Вы видели что я написал? Моя строчка кода это вопрос 3 FAQ и есть. Только она почему то нифига не работает, то есть в самом регистре ничего не создаёт!!!

Почему так?


Потому что Вы не почитали FAQ 1 и мой коментарий.

Анатолий.

Сообщение отредактировал aesok - Apr 24 2009, 06:56
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Apr 24 2009, 07:06
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Читал и FAQ 1 и ваш коментарий, но тода получается что что то не допонял что там написано.

Поясните пожалуйста как происходит и как сделать так что бы компилятор имменно там разместил переменную.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 24 2009, 07:13
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(IgorAVR2 @ Apr 24 2009, 11:06) *
Читал и FAQ 1 и ваш коментарий, но тода получается что что то не допонял что там написано.

Насколько я понял, не рекомендуется размещать переменные в r3-r7, т.к. они используются при вызовах функций.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Apr 24 2009, 07:21
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Цитата(MrYuran @ Apr 24 2009, 10:13) *
Насколько я понял, не рекомендуется размещать переменные в r3-r7, т.к. они используются при вызовах функций.


Только что попробовал использовать r10 -результат такой же, ничего он там не размещает и ничему не присваевает.
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 24 2009, 07:22
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 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" для регистровых переменных, и последнии версии выдают предупреждение когда компилируют код с такими переменными.

Анатолий.
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Apr 24 2009, 08:18
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Спасибо, Анатолий. Да именно так всё и есть, как вы описали.

Да, приписав volatile он действительно стал создавать эту переменную в регистре - дизасме это то же видно, как мне было и нужно!!! Победа!!! Вчерашний день мучений закончился сегодня благодаря вам. Надеюсь побочных эффектов с потерями модификатора не будет. Ещё раз спасибо.

Ещё вопрос:

можно ли разместить а регистре не переменную, а массив, начиная с какого нибудь регистра?

Всё равно не совсем работает как надо.
А именно: если потом эту переменную используем как нибудь, то он действительно создаёт её в регистре, если дальше не использовать её, а просто присвоить ей значение, то в регистре она не создаётся и регистр ничему не присваивается.
При этом эта переменная видна только там где описана, в других функциях не видна, хоть и описана как volatile.
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 24 2009, 09:50
Сообщение #10


Знающий
****

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



Цитата(IgorAVR2 @ Apr 24 2009, 12:18) *
можно ли разместить а регистре не переменную, а массив, начиная с какого нибудь регистра?


Можно, но вначеле внимательно перечитайте FAQ #3.

Цитата(IgorAVR2 @ Apr 24 2009, 12:18) *
При этом эта переменная видна только там где описана, в других функциях не видна, хоть и описана как volatile.


У меня плохо получаеться объяснять, а то что Вам не понятно в этом предложении обычно очень хорошо обясняется в книжках по языку С.

Анатолий.
Go to the top of the page
 
+Quote Post
IgorAVR2
сообщение Apr 24 2009, 10:34
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Попробуйте пожалуйста объяснить ещё, я не тупой должен понять... Тем более в книгах по Си я вряд ли это найду, уверен. Перерыл вчера весь инет и нечего подобного нету, никто кроме вас не знает.

И как же всё таки сделать, что бы такие переменные всегда там создавались, даже если не используються дальше в программе, а просто присваивается им значение?
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 24 2009, 10:47
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(IgorAVR2 @ Apr 24 2009, 10:28) *
Мне нужно из Си писать в регистр и постоянно держать там эти данные, что бы постоянно использовать в прерывании, которое на Асме.

Не думаю, что вы много выиграете если будете держать их в регистре, а не в памяти. А проблем будет много.
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 24 2009, 11:04
Сообщение #13


Знающий
****

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



Цитата(IgorAVR2 @ Apr 24 2009, 14:34) *
Попробуйте пожалуйста объяснить ещё, я не тупой должен понять... Тем более в книгах по Си я вряд ли это найду, уверен. Перерыл вчера весь инет и нечего подобного нету, никто кроме вас не знает.


http://www.citforum.ru/programming/c/h16.shtml
раздел 1.6.3. Время жизни и область видимости программных объектов
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Apr 24 2009, 11:11
Сообщение #14


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

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


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


дятел
*****

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



Цитата(IgorAVR2 @ Apr 24 2009, 14:34) *
И как же всё таки сделать, что бы такие переменные всегда там создавались, даже если не используються дальше в программе, а просто присваивается им значение?
Скорее всего Вам придеться делать некоторые спец телодвижения,
Вам нужно сделать несколько противоречащих здравому смыслу вещей... smile.gif ,
- разместить определение Ваших регистровых переменных в xxx.h файле который будет подключаться везде...
- Все функции с обращениями к данным регистрам(в том числе и прерывания...),
разместить в отдельных файлах(типа раздельная компиляция)
- ну и все это проверить в листинге...
Go to the top of the page
 
+Quote Post

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

 


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


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