Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как прочитать РОН в WinAVR?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Charoit
Поиском не нашел, решил задать вопрос..
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?
manul78
Цитата(Charoit @ Jan 28 2010, 18:10) *
Поиском не нашел, решил задать вопрос..
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?


Можно читать содержимое из памяти (регистровый файл)...

А можно сделать ассемблерную вставку + привязку, и компилятор "сгенерит" код в котором переменная в С будет
ассоциироватся с нужным Вам регистром.
Charoit
Цитата(manul78 @ Jan 28 2010, 18:22) *
Можно читать содержимое из памяти (регистровый файл)...

А можно сделать ассемблерную вставку + привязку, и компилятор "сгенерит" код в котором переменная в С будет
ассоциироватся с нужным Вам регистром.



Мне бы пример, если Вам несложноsmile.gif
manul78
Цитата(Charoit @ Jan 28 2010, 18:26) *
Мне бы пример, если Вам несложноsmile.gif


Статическая память микроконтроллеров AVR начинается с регистрового файла. Прямо с $00...
Открываете даташит на Ваш микроконтроллер и смотрите адрес нужного Вам регистра. Например R0=$00, R1=$01,...R31=$1F
Объявляем указатель: volatile char *R2 // название дано для наглядности...
Объявляем переменную: volatile char x // сюда будет загруженно содержимое
Заносим в указатель адрес регистра: R2 = 0x02 // адрес регистра R2
Читаем его : x = *R2 // содержимое регистра R2 - в переменной х


Можете ещё посмотреть функции для прямого доступа к памяти в WinAVR...

Ассемблерную вставку напишу позже, если понадобится... smile.gif Там можно заставить компилятор ассоциировать например
переменную X c регистром общего назначения и соответственно любое обращение к X равноценно выбранному регистру.
Всё это делается исключительно для читабельности исходного файла, потому как машинный код что в первом примере, что
в последнем будет одинаков... smile.gif
ReAl
Цитата(Charoit @ Jan 28 2010, 17:10) *
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?
Хотел там мяукнуть, но обленился. Тут спрошу - а зачем?
Не подколки ради, просто чтение регистра из С ведь не самоцель.
Опишите задачу.
Тогда будет понятно, что советовать.
manul78
Цитата(ReAl @ Jan 28 2010, 19:47) *
Хотел там мяукнуть, но обленился. Тут спрошу - а зачем?


Действительно, зачем !? Ради праздного любопытства ? Для отладки ?
ReAl
Цитата(manul78 @ Jan 28 2010, 19:45) *
Действительно, зачем !? Ради праздного любопытства ? Для отладки ?
Особенно учитывая то, что именно R0 - это временый регистр __temp_reg__ компилятора, он же используется в команде mul и его и зарезервировать нельзя, вся работа компилятора обломается.
manul78
Цитата(ReAl @ Jan 28 2010, 23:24) *
Особенно учитывая то, что именно R0 - это временый регистр __temp_reg__ компилятора, он же используется в команде mul и его и зарезервировать нельзя, вся работа компилятора обломается.


Кстати, WinAVR оперирует буквально 4-6 РОН и PUSH-ит их постоянно, остальные РОН пустуют.
У меня несколько раз было, что "борода" стека рушила данные в SRAM...
Я лично, всегда проверяю откомпиленный WinAVR код. Бывает придраться не к чему, а бывает наворочает мама не горюй.
Заметил, что более ранние версии давали более компактный код. На эту тему здесь уже был разговор. Сошлись, на том, что
большой код - высокая производительность, маленький код - низкая производительность... smile.gif
Сергей Борщ
Цитата(manul78 @ Jan 28 2010, 22:48) *
Заметил, что более ранние версии давали более компактный код. На эту тему здесь уже был разговор.
на новых версиях, играясь с новыми ключами оптимизации, получаю более компактный код чем на версиях 2006-2007гг.
Aesthete Animus
Цитата(Сергей Борщ @ Jan 29 2010, 00:15) *
на новых версиях, играясь с новыми ключами оптимизации...

А Вы не могли бы привести пример такой игры?
Сергей Борщ
Цитата(Aesthete Animus @ Jan 29 2010, 09:42) *
А Вы не могли бы привести пример такой игры?
В ветке, посвященной WinAVR20100110 и в соседней. Просто комментирую один ключ, компилирую, смотрю результат. Если код уменьшился - так и оставляю, если увеличился - возвращаю назад. И так пару итераций. "Играюсь" так, когда почти вся программа написана, таким образом удается найти оптимальное сочитание имеенно под конкретную программу, ее стиль.
Charoit
Цитата(ReAl @ Jan 28 2010, 19:47) *
Хотел там мяукнуть, но обленился. Тут спрошу - а зачем?
Не подколки ради, просто чтение регистра из С ведь не самоцель.
Опишите задачу.
Тогда будет понятно, что советовать.



Да признаться стыдно..smile.gif Хотел прочитать несколько байт памяти программ - на асме это делал командой LPM, в принципе все понятно было.
Решил попробовать на С, выяснил, что есть макрос pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) - ну и решил,
что результат чтения как и на асме тоже сохраняется в регистре R0.
Микроконтроллерный С не так просто в освоении оказался..
_Pasha
Цитата(Charoit @ Jan 29 2010, 12:31) *
что результат чтения как и на асме тоже сохраняется в регистре R0.

Дык... не обязательно же ж ! LPM Rd,Z
Charoit
Цитата(_Pasha @ Jan 29 2010, 13:13) *
Дык... не обязательно же ж ! LPM Rd,Z



А вроде командой LPM без операндов байт всегда читается в регистр R0?
ReAl
Цитата(Charoit @ Jan 29 2010, 11:31) *
pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short))

Цитата(Charoit @ Jan 29 2010, 13:18) *
А вроде командой LPM без операндов байт всегда читается в регистр R0?
А кто сказал, что макрос пользуется командой LPM всегда? :-)
Это от процессора зависит.
Там условная компиляция по типу процессора и подставляется оптимальный вариант.
Charoit
Кстати, в файле pgmspace.h есть макроопределения для чтения памяти данных - pgm_read в разных вариантах..
А как писать в память данных? rolleyes.gif Ничего похожего в pgmspace.h я не нашелsad.gif
Палыч
Цитата(Charoit @ Feb 1 2010, 16:23) *
А как писать в память данных? rolleyes.gif Ничего похожего в pgmspace.h я не нашел sad.gif
Наверное, вопрос был всё же о памяти программ? В эту память абы-откуда писать не получиться. Поэтому и смотреть нужно в файле boot.h
Charoit
Цитата(Палыч @ Feb 1 2010, 16:57) *
Наверное, вопрос был всё же о памяти программ? В эту память абы-откуда писать не получиться. Поэтому и смотреть нужно в файле boot.h


Тьфу, блин, конечно о памяти программ.. Спасибо, буду смотреть boot.h.
Charoit
Не получается писать в память программsad.gif Для начала решил просто стереть страницу - и это не работает..
Обязательно ли макросы boot_page_erase должны находиться в области загрузчика?

Вызываемая функция выглядит вот так :

CODE
void boot_program_page (uint16_t page)
{

uint8_t sreg;

// Disable interrupts.

sreg = SREG;
cli();

eeprom_busy_wait ();

boot_page_erase (page);
boot_spm_busy_wait (); // Wait until the memory is erased.



// Reenable RWW-section again. We need this if we want to jump back
// to the application after bootloading.

boot_rww_enable ();

// Re-enable interrupts (if they were ever enabled).

SREG = sreg;


}
Палыч
Цитата(Charoit @ Feb 10 2010, 17:30) *
Не получается писать в память программ. Обязательно ли макросы boot_page_erase должны находиться в области загрузчика?
Да, обязательно. Прочитайте в DS про RWW и NRWW секции.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.