Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в WinAVR разместить переменную в регистре?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
IgorAVR2
Или как из Си winavr писать данные в нужный регистр?

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

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

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

Мне нужно из Си писать в регистр и постоянно держать там эти данные, что бы постоянно использовать в прерывании, которое на Асме.
aesok
Цитата(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 у регистровых переменных. Если всеже решите их использовать попробуйте сделать доступ к таким переменным из программы на С с помощью ассемблерной вставки.

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

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

Почему так?


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

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

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

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


Только что попробовал использовать r10 -результат такой же, ничего он там не размещает и ничему не присваевает.
aesok
Цитата(IgorAVR2 @ Apr 24 2009, 11:06) *
Читал и FAQ 1 и ваш коментарий, но тода получается что что то не допонял что там написано.

Поясните пожалуйста как происходит и как сделать так что бы компилятор имменно там разместил переменную.


Размещаете переменную Вы правильно, только Вы не учитывате тот момент, что GCC это оптимизизирующий С компилятор.
Вот он и отимизирует код:
counter=5;
temp=counter;
в:
temp=5;

Ведь далее в этой функции переменная 'counter' не используеться, правильно? Так зачем выполнять лишнию пересылку? А что Вы там написали на ассемблере и как используете переменную counter компилятор C не знает и не учитывает.

Доля того чтобы указать компилятору чтобы он не оптимизировал доступ к переменной служет модификатор "volatile".

Это для обычных переменных, но GCC иногда теряет модификатор "volatile" для регистровых переменных, и последнии версии выдают предупреждение когда компилируют код с такими переменными.

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

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

Ещё вопрос:

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

Всё равно не совсем работает как надо.
А именно: если потом эту переменную используем как нибудь, то он действительно создаёт её в регистре, если дальше не использовать её, а просто присвоить ей значение, то в регистре она не создаётся и регистр ничему не присваивается.
При этом эта переменная видна только там где описана, в других функциях не видна, хоть и описана как volatile.
aesok
Цитата(IgorAVR2 @ Apr 24 2009, 12:18) *
можно ли разместить а регистре не переменную, а массив, начиная с какого нибудь регистра?


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

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


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

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

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

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


http://www.citforum.ru/programming/c/h16.shtml
раздел 1.6.3. Время жизни и область видимости программных объектов
mdmitry
Цитата(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.
singlskv
Цитата(IgorAVR2 @ Apr 24 2009, 14:34) *
И как же всё таки сделать, что бы такие переменные всегда там создавались, даже если не используються дальше в программе, а просто присваивается им значение?
Скорее всего Вам придеться делать некоторые спец телодвижения,
Вам нужно сделать несколько противоречащих здравому смыслу вещей... smile.gif ,
- разместить определение Ваших регистровых переменных в xxx.h файле который будет подключаться везде...
- Все функции с обращениями к данным регистрам(в том числе и прерывания...),
разместить в отдельных файлах(типа раздельная компиляция)
- ну и все это проверить в листинге...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.