|
Как прочитать регистр из прогаммы на С, Максимально просто |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Dec 13 2011, 21:29
|

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

|
Цитата(b-volkov @ Dec 9 2011, 16:35)  R14 в некую глобальную переменную. у IAR есть специальная фича Код __regvar __no_init volatile uint8_t Name@14; volatile если в прерываниях используется.
|
|
|
|
|
Dec 14 2011, 17:24
|
Участник

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

|
b-volkov: Надо переписать значение R14 ------------------------------------------------- Для начала неплохо бы выяснить откуда в программе взялся R14 и не превратится ли он при следующей компиляции в R15 или в ОЗУ? И вообще зачем это? А решение, видимо, можно искать сделав объявление, как указал KRS, предварительно в опциях разрешив использовать сколько-то регистров для таких фокусов.
Сообщение отредактировал usav - Dec 14 2011, 17:25
|
|
|
|
|
Mar 9 2012, 06:22
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 19 2012, 20:55
|
Гуру
     
Группа: Свой
Сообщений: 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
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Mar 20 2012, 09:41
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
ПалычДругое дело. Цитата(Палыч @ Mar 20 2012, 09:14)  Если уж дурить транслятор/оптимизатор, то - с умом: Дурить - так с volatile. Спасибо, Палыч. Помогло.
Сообщение отредактировал IgorKossak - Mar 20 2012, 14:23
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Mar 20 2012, 14:21
|
Гуру
     
Группа: Свой
Сообщений: 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
Причина редактирования: Бездумное самоцитирование
|
|
|
|
|
Mar 20 2012, 15:29
|

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

|
Цитата(_Артём_ @ Mar 20 2012, 18:21)  Там работает, а тут нет. Почему? "Ну, Вы, блин, даёте..." (С) Не работает потому, что Вы своими "извратами" совсем голову задурили транслятору/оптимизатору. Что Вы хотите получить? Полный контроль над регистрами? Пишите на чистом ассемблере - не дурите голову себе и транслятору Си. В отдельных случаях, возможно, и стоить применять такие конструкции (а, стоит ли?), но нужно хорошо представлять: как транслятор "строит" исполняемый код. Некоторые регистры (R28:R29 или регистр Y в частности) транслятор использует для своих нужд, и использование программистом этих регистров "левым" образом приводит к "интересным эффектам"...
|
|
|
|
|
Mar 20 2012, 17:06
|
Гуру
     
Группа: Свой
Сообщений: 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)  и использование программистом этих регистров "левым" образом приводит к "интересным эффектам"... Видимо такой эффект и наблюдается.
|
|
|
|
|
Mar 21 2012, 06:23
|

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

|
Цитата(_Артём_ @ Mar 20 2012, 21:06)  Ну прямо вас послушаешь - руки ему заламываю. Просто ведь говорю транслятору: дай регистр, установи регистр. А он мне - тут работаю, здесь не работаю. Вы должны понимать, что транслятору с ЯВУ отданы часть ресурсов МК. Есть соглашение (описание) как эти ресурсы транслятор использует. Возможно, часть ресурсов транслятор может использовать совместно с программистом. Часть же ресурсов "закреплено" за транслятором жестко. Использование этих ресурсов кем-то помимо транслятора сбивает транслятор "с толку". Однако, программист волен, при необходимости, и эти ресурсы использовать... Для этого у программиста есть возможность писать модули на ассемблере (а, не ассемблерные вставки в ЯВУ). Разумеется, процедуры на ассемблере не должны разрушать вычислительную среду ЯВУ (т.е. необходимо соблюдать соглашения о "разделе" ресурсов). Большенство сред программирования (IAR в том числе) позволяют "смешивать" модули на ЯВУ и ассемблере. Перестаньте "насиловать" транслятор Си. Напишите нужный Вам код на ассемблере...
|
|
|
|
|
Mar 21 2012, 13:28
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Палыч @ Mar 21 2012, 08:23)  Вы должны понимать, что транслятору с ЯВУ отданы часть ресурсов МК. Есть соглашение (описание) как эти ресурсы транслятор использует. Возможно, часть ресурсов транслятор может использовать совместно с программистом. Это понятно. Цитата(Палыч @ Mar 21 2012, 08:23)  Однако, программист волен, при необходимости, и эти ресурсы использовать... Для этого у программиста есть возможность писать модули на ассемблере (а, не ассемблерные вставки в ЯВУ). Большенство сред программирования (IAR в том числе) позволяют "смешивать" модули на ЯВУ и ассемблере. Ну хотелось бы писать не на ассемблере (и не с вставками), а на Си/Си++. Но иногда хотелось бы вставить что-то короткое, ассемблерное и при этом без вызова асм-функций, описанных в других файлах. Цитата(Палыч @ Mar 21 2012, 08:23)  Напишите нужный Вам код на ассемблере... Ассемблер - не вариант. Такой код мне не нужен.
|
|
|
|
|
Mar 21 2012, 17:23
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Сергей Борщ @ Mar 21 2012, 17:03)  Переходите на GCC. Он такое позволяет делать в при помощи инлайн-ассемблера. Осваиваю понемногу. Хотя отталкивает больший размер кода от GCC (или это уже не так? не знаю), но этот пункт редко когда важен. Цитата(Сергей Борщ @ Mar 21 2012, 17:03)  ИАР такого не позволяет в принципе (см. его документацию, там так и написано) Видимо просмотрел. Цитата(Сергей Борщ @ Mar 21 2012, 17:03)  добавление нескольких строк в другой части программы вполне может привести к перераспределению регистров и крушению всей вашей конструкции. Да, похоже на то - пример простой, но уже "дело пахнет керосином", если будет что-то реально функциональное - рухнет.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|