Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как прочитать регистр из прогаммы на С
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
b-volkov
Надо переписать значение R14 в некую глобальную переменную. Можно это сделать строкой онлайн-ассемблера и какой? В ассемблере не силен, прпробовал поподбирать сам - не вышло.
Палыч
Примерно так:
Код
char X;
.........
asm("STS X, R14");
KRS
Цитата(b-volkov @ Dec 9 2011, 16:35) *
R14 в некую глобальную переменную.

у IAR есть специальная фича
Код
__regvar __no_init volatile uint8_t Name@14;

volatile если в прерываниях используется.
usav
b-volkov: Надо переписать значение R14
-------------------------------------------------
Для начала неплохо бы выяснить откуда в программе взялся R14 и не
превратится ли он при следующей компиляции в R15 или в ОЗУ?
И вообще зачем это?
А решение, видимо, можно искать сделав объявление,
как указал KRS, предварительно в опциях разрешив использовать
сколько-то регистров для таких фокусов.
vvppvv
Цитата(b-volkov @ Dec 9 2011, 16:35) *
Надо переписать значение R14 в некую глобальную переменную. Можно это сделать строкой онлайн-ассемблера и какой? В ассемблере не силен, прпробовал поподбирать сам - не вышло.


Сделать функцию, например:
Код
#pragma inline = forced
char cGetReg_R8 (void) {asm("mov  r16, r8");}


Использовать как обычно, например, вывести R8 в порт А:

Код
    212            PORTA = cGetReg_R8();
   \   00000000   2D08               mov  r16, r8
   \   00000002   BB0B               OUT     0x1B, R16


Просто и лаконично. Хотя компилятор вполне обоснованно ругается, что в функции отсутствует Return :-))

Если нужен именно 14 регистр, то заменить в функции R8 на R14 wink.gif
_Артём_
vvppvv

Попробовал по вышесказанному:
Код
volatile unsigned short SavedR2021;
#pragma inline = forced
unsigned short cGetReg_R2021(void) {
    asm("mov  r16, r20");
    asm("mov  r17, r21");
}
#pragma inline = forced
void cSetR2021(unsigned short new_value) {
    asm("mov  r20, r16");
    asm("mov  r21, r17");
}
int main()
{
    SavedR2021=cGetReg_R2021();
    PORTA^=0x11;
    PORTE=0x23;
    cSetR2021(SavedR2021+0xA5);
    PORTA^=0x11;
    TCCR0=5;
    TIMSK|=(1<<TOIE0);
    PORTE=0x23;
    cSetR2021(SavedR2021);
    .....


В SavedR2021 значение считывается, но строка
Код
cSetR2021(SavedR2021+0xA5);

не выполнилась (не увидел в дизассемблере ожидаемого значения).

То есть метод частично нерабочий?
Или где-то ошибка?
Палыч
Цитата(_Артём_ @ Mar 20 2012, 00:55) *
То есть метод частично нерабочий?
Или где-то ошибка?

Если уж дурить транслятор/оптимизатор, то - с умом:
Код
void cSetR2021(volatile unsigned short new_value) {
    asm("mov  r20, r16");
    asm("mov  r21, r17");
}

_Артём_
Палыч

Другое дело.

Цитата(Палыч @ Mar 20 2012, 09:14) *
Если уж дурить транслятор/оптимизатор, то - с умом:

Дурить - так с volatile.

Спасибо, Палыч.
Помогло.
_Артём_
Помогло но не совсем:

Код
#pragma inline = forced
inline unsigned short cGetR2829(void) {
    asm("mov  r16, r28");
    asm("mov  r17, r29");
}
#pragma inline = forced
inline void cSetR2829(volatile unsigned short new_value) {
    asm("mov  r28, r16");
    asm("mov  r29, r17");
}


// Disassm.
42:           SavedR2021=cGetR2829();
+00000069:   2F0C        MOV       R16,R28        Copy register
+0000006A:   2F1D        MOV       R17,R29        Copy register
+0000006B:   932D        ST        X+,R18         Store indirect and postincrement
+0000006C:   933C        ST        X,R19          Store indirect
+0000006D:   9711        SBIW      R26,0x01       Subtract immediate from word
43:           cSetR2829(SavedR2021-0x20);
+0000006E:   918D        LD        R24,X+         Load indirect and postincrement
+0000006F:   919C        LD        R25,X          Load indirect
+00000070:   9711        SBIW      R26,0x01       Subtract immediate from word
+00000071:   9780        SBIW      R24,0x20       Subtract immediate from word
+00000072:   8388        STD       Y+0,R24        Store indirect with displacement
+00000073:   8399        STD       Y+1,R25        Store indirect with displacement
+00000074:   2FC0        MOV       R28,R16        Copy register
+00000075:   2FD1        MOV       R29,R17        Copy register


Там работает, а тут нет.
Почему?
Палыч
Цитата(_Артём_ @ Mar 20 2012, 18:21) *
Там работает, а тут нет.
Почему?

"Ну, Вы, блин, даёте..." (С)

Не работает потому, что Вы своими "извратами" совсем голову задурили транслятору/оптимизатору. Что Вы хотите получить? Полный контроль над регистрами? Пишите на чистом ассемблере - не дурите голову себе и транслятору Си. В отдельных случаях, возможно, и стоить применять такие конструкции (а, стоит ли?), но нужно хорошо представлять: как транслятор "строит" исполняемый код. Некоторые регистры (R28:R29 или регистр Y в частности) транслятор использует для своих нужд, и использование программистом этих регистров "левым" образом приводит к "интересным эффектам"...
_Артём_
Цитата(Палыч @ Mar 20 2012, 17:29) *
"Ну, Вы, блин, даёте..." (С)

А я чо, я - ничо. Оно само...


Цитата(Палыч @ Mar 20 2012, 17:29) *
Не работает потому, что Вы своими "извратами" совсем голову задурили транслятору/оптимизатору. .


Ну прямо вас послушаешь - руки ему заламываю.
Просто ведь говорю транслятору: дай регистр, установи регистр. А он мне - тут работаю, здесь не работаю.

Цитата(Палыч @ Mar 20 2012, 17:29) *
Что Вы хотите получить? Полный контроль над регистрами?

Нет, блин, неограниченную власть над миром.
Но чот не выходит.

Цитата(Палыч @ Mar 20 2012, 17:29) *
Пишите на чистом ассемблере

Всегда на асме? Не дай бог.

Цитата(Палыч @ Mar 20 2012, 17:29) *
В отдельных случаях, возможно, и стоить применять такие конструкции (а, стоит ли?),

Так я хочу в отдельных случаях...
Хотя может и не стоит (мне уже про это говорили тут).

Цитата(Палыч @ Mar 20 2012, 17:29) *
Некоторые регистры (R28:R29 или регистр Y в частности) транслятор использует для своих нужд

Ну я тоже хочу его иногда поюзать.

Цитата(Палыч @ Mar 20 2012, 17:29) *
и использование программистом этих регистров "левым" образом приводит к "интересным эффектам"...

Видимо такой эффект и наблюдается.
Палыч
Цитата(_Артём_ @ Mar 20 2012, 21:06) *
Ну прямо вас послушаешь - руки ему заламываю.
Просто ведь говорю транслятору: дай регистр, установи регистр. А он мне - тут работаю, здесь не работаю.

Вы должны понимать, что транслятору с ЯВУ отданы часть ресурсов МК. Есть соглашение (описание) как эти ресурсы транслятор использует. Возможно, часть ресурсов транслятор может использовать совместно с программистом. Часть же ресурсов "закреплено" за транслятором жестко. Использование этих ресурсов кем-то помимо транслятора сбивает транслятор "с толку".
Однако, программист волен, при необходимости, и эти ресурсы использовать... Для этого у программиста есть возможность писать модули на ассемблере (а, не ассемблерные вставки в ЯВУ). Разумеется, процедуры на ассемблере не должны разрушать вычислительную среду ЯВУ (т.е. необходимо соблюдать соглашения о "разделе" ресурсов). Большенство сред программирования (IAR в том числе) позволяют "смешивать" модули на ЯВУ и ассемблере.
Перестаньте "насиловать" транслятор Си. Напишите нужный Вам код на ассемблере...
_Артём_
Цитата(Палыч @ Mar 21 2012, 08:23) *
Вы должны понимать, что транслятору с ЯВУ отданы часть ресурсов МК. Есть соглашение (описание) как эти ресурсы транслятор использует. Возможно, часть ресурсов транслятор может использовать совместно с программистом.

Это понятно.

Цитата(Палыч @ Mar 21 2012, 08:23) *
Однако, программист волен, при необходимости, и эти ресурсы использовать... Для этого у программиста есть возможность писать модули на ассемблере (а, не ассемблерные вставки в ЯВУ).
Большенство сред программирования (IAR в том числе) позволяют "смешивать" модули на ЯВУ и ассемблере.


Ну хотелось бы писать не на ассемблере (и не с вставками), а на Си/Си++.
Но иногда хотелось бы вставить что-то короткое, ассемблерное и при этом без вызова асм-функций, описанных в других файлах.

Цитата(Палыч @ Mar 21 2012, 08:23) *
Напишите нужный Вам код на ассемблере...

Ассемблер - не вариант. Такой код мне не нужен.
Сергей Борщ
QUOTE (_Артём_ @ Mar 21 2012, 15:28) *
Но иногда хотелось бы вставить что-то короткое, ассемблерное и при этом без вызова асм-функций, описанных в других файлах.
Переходите на GCC. Он такое позволяет делать в при помощи инлайн-ассемблера. ИАР такого не позволяет в принципе (см. его документацию, там так и написано) и добавление нескольких строк в другой части программы вполне может привести к перераспределению регистров и крушению всей вашей конструкции.
_Артём_
Цитата(Сергей Борщ @ Mar 21 2012, 17:03) *
Переходите на GCC. Он такое позволяет делать в при помощи инлайн-ассемблера.

Осваиваю понемногу. Хотя отталкивает больший размер кода от GCC (или это уже не так? не знаю), но этот пункт редко когда важен.

Цитата(Сергей Борщ @ Mar 21 2012, 17:03) *
ИАР такого не позволяет в принципе (см. его документацию, там так и написано)

Видимо просмотрел.

Цитата(Сергей Борщ @ Mar 21 2012, 17:03) *
добавление нескольких строк в другой части программы вполне может привести к перераспределению регистров и крушению всей вашей конструкции.

Да, похоже на то - пример простой, но уже "дело пахнет керосином", если будет что-то реально функциональное - рухнет.
KRS
Цитата(Сергей Борщ @ Mar 21 2012, 19:03) *
ИАР такого не позволяет в принципе (см. его документацию, там так и написано)

это уже не так, в последних версиях ИАР (по крайней мере для ARM) есть GNUшные ассемблерные макросы!

_Артём_
Цитата(KRS @ Mar 21 2012, 19:42) *
в последних версиях ИАР


В 6-й версии?

Цитата(KRS @ Mar 21 2012, 19:42) *
есть GNUшные ассемблерные макросы

А что они там позаимствовали?

P.S. Для АВР они ничего не стянули?
KRS
Цитата(_Артём_ @ Mar 21 2012, 22:07) *
В 6-й версии?
А что они там позаимствовали?
P.S. Для АВР они ничего не стянули?

да, в 6 ке есть, синтаксис от GNU т.е. указываются output,input,clobbered (главное описание есть довольно приличное)

для АВР не знаю, может тоже есть я за последними версиями не слежу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.