Easyelectronics.ru

Электроника для всех
Текущее время: 20 янв 2021, 22:08

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Как прочитать РОН в WinAVR?
СообщениеДобавлено: 28 янв 2010, 19:58 
Только пришел

Зарегистрирован: 28 янв 2010, 19:57
Сообщения: 23
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как прочитать РОН в WinAVR?
СообщениеДобавлено: 28 янв 2010, 23:35 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6283
Откуда: Челябинск
ЕМНИП обьявить переменную так:

register uint8_t peremennaya __asm__ ("r0");

Но зачем?

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как прочитать РОН в WinAVR?
СообщениеДобавлено: 02 фев 2010, 16:51 
Только пришел

Зарегистрирован: 28 янв 2010, 19:57
Сообщения: 23
Да я хотел прочитать несколько байт памяти программ :)
Выяснил, что есть макрос pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) - и решил, что результат чтения как и на асме тоже сохраняется в регистре R0.

Читать на сях из флэша вроде научился, но хочется разобраться до конца :) Ди, помоги, пжлста!

В файле pgmspace.h есть дефайн :
Код:
#define __LPM_classic__(addr)   \
(__extension__({                \
    uint16_t __addr16 = (uint16_t)(addr); \
    uint8_t __result;           \
    __asm__                     \
    (                           \
        "lpm" "\n\t"            \
        "mov %0, r0" "\n\t"     \
        : "=r" (__result)       \
        : "z" (__addr16)        \
        : "r0"                  \
    );                          \
    __result;                   \
}))


Не понимаю до конца как работает ассемблерная конструкция Почему первой идет команда lpm - ведь сначала надо адрес записать в регистр Z?
У оператора mov ссылка %0 соответствует операнду "=r" - это понятно, а операнды "z" и "r0" чему соответствуют?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как прочитать РОН в WinAVR?
СообщениеДобавлено: 02 фев 2010, 17:02 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2010, 12:18
Сообщения: 1259
Откуда: Moscow
Это простейший вариант lpm, который в r0 грузит. Они объявляют __addr16 как Z, а r0 как сам по себе и есть. То есть uint16_t __addr16 = (uint16_t)(addr); по сути требует от компилера загрузить параметр addr в Z, а потом из r0 переписать результат в __result.

ЗЫ. Я, скажем так, несколько недолюбливаю winavr за кривую реализацию доступа к флешу и невозможность отладки ассемблера в исходниках.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB