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

 
 
> Как прочитать регистр из прогаммы на С, Максимально просто
b-volkov
сообщение Dec 9 2011, 12:35
Сообщение #1


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

Группа: Свой
Сообщений: 137
Регистрация: 10-04-07
Из: г. Троицк
Пользователь №: 26 907



Надо переписать значение R14 в некую глобальную переменную. Можно это сделать строкой онлайн-ассемблера и какой? В ассемблере не силен, прпробовал поподбирать сам - не вышло.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
Палыч
сообщение Dec 9 2011, 17:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Примерно так:
Код
char X;
.........
asm("STS X, R14");
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 13 2011, 21:29
Сообщение #3


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(b-volkov @ Dec 9 2011, 16:35) *
R14 в некую глобальную переменную.

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

volatile если в прерываниях используется.
Go to the top of the page
 
+Quote Post
usav
сообщение Dec 14 2011, 17:24
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 22-01-10
Из: Kiev
Пользователь №: 55 001



b-volkov: Надо переписать значение R14
-------------------------------------------------
Для начала неплохо бы выяснить откуда в программе взялся R14 и не
превратится ли он при следующей компиляции в R15 или в ОЗУ?
И вообще зачем это?
А решение, видимо, можно искать сделав объявление,
как указал KRS, предварительно в опциях разрешив использовать
сколько-то регистров для таких фокусов.

Сообщение отредактировал usav - Dec 14 2011, 17:25
Go to the top of the page
 
+Quote Post
vvppvv
сообщение Mar 9 2012, 06:22
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 3-07-05
Пользователь №: 6 485



Цитата(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
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 19 2012, 20:55
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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);

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

То есть метод частично нерабочий?
Или где-то ошибка?

Сообщение отредактировал IgorKossak - Mar 20 2012, 14:22
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 20 2012, 07:14
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

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

Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 20 2012, 09:41
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Палыч

Другое дело.

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

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

Спасибо, Палыч.
Помогло.

Сообщение отредактировал IgorKossak - Mar 20 2012, 14:23
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 20 2012, 14:21
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Помогло но не совсем:

Код
#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


Там работает, а тут нет.
Почему?

Сообщение отредактировал IgorKossak - Mar 20 2012, 14:23
Причина редактирования: Бездумное самоцитирование
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 20 2012, 15:29
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

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

Не работает потому, что Вы своими "извратами" совсем голову задурили транслятору/оптимизатору. Что Вы хотите получить? Полный контроль над регистрами? Пишите на чистом ассемблере - не дурите голову себе и транслятору Си. В отдельных случаях, возможно, и стоить применять такие конструкции (а, стоит ли?), но нужно хорошо представлять: как транслятор "строит" исполняемый код. Некоторые регистры (R28:R29 или регистр Y в частности) транслятор использует для своих нужд, и использование программистом этих регистров "левым" образом приводит к "интересным эффектам"...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 20 2012, 17:06
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Палыч @ 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) *
и использование программистом этих регистров "левым" образом приводит к "интересным эффектам"...

Видимо такой эффект и наблюдается.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 21 2012, 06:23
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

Вы должны понимать, что транслятору с ЯВУ отданы часть ресурсов МК. Есть соглашение (описание) как эти ресурсы транслятор использует. Возможно, часть ресурсов транслятор может использовать совместно с программистом. Часть же ресурсов "закреплено" за транслятором жестко. Использование этих ресурсов кем-то помимо транслятора сбивает транслятор "с толку".
Однако, программист волен, при необходимости, и эти ресурсы использовать... Для этого у программиста есть возможность писать модули на ассемблере (а, не ассемблерные вставки в ЯВУ). Разумеется, процедуры на ассемблере не должны разрушать вычислительную среду ЯВУ (т.е. необходимо соблюдать соглашения о "разделе" ресурсов). Большенство сред программирования (IAR в том числе) позволяют "смешивать" модули на ЯВУ и ассемблере.
Перестаньте "насиловать" транслятор Си. Напишите нужный Вам код на ассемблере...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 21 2012, 13:28
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Палыч @ Mar 21 2012, 08:23) *
Вы должны понимать, что транслятору с ЯВУ отданы часть ресурсов МК. Есть соглашение (описание) как эти ресурсы транслятор использует. Возможно, часть ресурсов транслятор может использовать совместно с программистом.

Это понятно.

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


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

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

Ассемблер - не вариант. Такой код мне не нужен.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 21 2012, 15:03
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 21 2012, 17:23
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Сергей Борщ @ Mar 21 2012, 17:03) *
Переходите на GCC. Он такое позволяет делать в при помощи инлайн-ассемблера.

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

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

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

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

Да, похоже на то - пример простой, но уже "дело пахнет керосином", если будет что-то реально функциональное - рухнет.
Go to the top of the page
 
+Quote Post

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

 


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


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