|
Как прочитать РОН в WinAVR? |
|
|
|
Jan 28 2010, 15:10
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 10-10-07
Пользователь №: 31 217

|
Поиском не нашел, решил задать вопрос.. Как на сях в WinAVR можно прочитать содержимое регистра, например R0?
|
|
|
|
|
Jan 28 2010, 15:22
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Цитата(Charoit @ Jan 28 2010, 18:10)  Поиском не нашел, решил задать вопрос.. Как на сях в WinAVR можно прочитать содержимое регистра, например R0? Можно читать содержимое из памяти (регистровый файл)... А можно сделать ассемблерную вставку + привязку, и компилятор "сгенерит" код в котором переменная в С будет ассоциироватся с нужным Вам регистром.
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
Jan 28 2010, 15:26
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 10-10-07
Пользователь №: 31 217

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

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Цитата(Charoit @ Jan 28 2010, 18:26)  Мне бы пример, если Вам несложно  Статическая память микроконтроллеров AVR начинается с регистрового файла. Прямо с $00... Открываете даташит на Ваш микроконтроллер и смотрите адрес нужного Вам регистра. Например R0=$00, R1=$01,...R31=$1F Объявляем указатель: volatile char *R2 // название дано для наглядности... Объявляем переменную: volatile char x // сюда будет загруженно содержимое Заносим в указатель адрес регистра: R2 = 0x02 // адрес регистра R2 Читаем его : x = *R2 // содержимое регистра R2 - в переменной х Можете ещё посмотреть функции для прямого доступа к памяти в WinAVR... Ассемблерную вставку напишу позже, если понадобится...  Там можно заставить компилятор ассоциировать например переменную X c регистром общего назначения и соответственно любое обращение к X равноценно выбранному регистру. Всё это делается исключительно для читабельности исходного файла, потому как машинный код что в первом примере, что в последнем будет одинаков...
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
Jan 28 2010, 16:47
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Charoit @ Jan 28 2010, 17:10)  Как на сях в WinAVR можно прочитать содержимое регистра, например R0? Хотел там мяукнуть, но обленился. Тут спрошу - а зачем? Не подколки ради, просто чтение регистра из С ведь не самоцель. Опишите задачу. Тогда будет понятно, что советовать.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 28 2010, 17:45
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Цитата(ReAl @ Jan 28 2010, 19:47)  Хотел там мяукнуть, но обленился. Тут спрошу - а зачем? Действительно, зачем !? Ради праздного любопытства ? Для отладки ?
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
Jan 28 2010, 20:48
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Цитата(ReAl @ Jan 28 2010, 23:24)  Особенно учитывая то, что именно R0 - это временый регистр __temp_reg__ компилятора, он же используется в команде mul и его и зарезервировать нельзя, вся работа компилятора обломается. Кстати, WinAVR оперирует буквально 4-6 РОН и PUSH-ит их постоянно, остальные РОН пустуют. У меня несколько раз было, что "борода" стека рушила данные в SRAM... Я лично, всегда проверяю откомпиленный WinAVR код. Бывает придраться не к чему, а бывает наворочает мама не горюй. Заметил, что более ранние версии давали более компактный код. На эту тему здесь уже был разговор. Сошлись, на том, что большой код - высокая производительность, маленький код - низкая производительность...
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
Jan 29 2010, 08:32
|

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

|
Цитата(Aesthete Animus @ Jan 29 2010, 09:42)  А Вы не могли бы привести пример такой игры? В ветке, посвященной WinAVR20100110 и в соседней. Просто комментирую один ключ, компилирую, смотрю результат. Если код уменьшился - так и оставляю, если увеличился - возвращаю назад. И так пару итераций. "Играюсь" так, когда почти вся программа написана, таким образом удается найти оптимальное сочитание имеенно под конкретную программу, ее стиль.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 29 2010, 09:31
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 10-10-07
Пользователь №: 31 217

|
Цитата(ReAl @ Jan 28 2010, 19:47)  Хотел там мяукнуть, но обленился. Тут спрошу - а зачем? Не подколки ради, просто чтение регистра из С ведь не самоцель. Опишите задачу. Тогда будет понятно, что советовать. Да признаться стыдно..  Хотел прочитать несколько байт памяти программ - на асме это делал командой LPM, в принципе все понятно было. Решил попробовать на С, выяснил, что есть макрос pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) - ну и решил, что результат чтения как и на асме тоже сохраняется в регистре R0. Микроконтроллерный С не так просто в освоении оказался..
|
|
|
|
|
Jan 29 2010, 11:18
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 10-10-07
Пользователь №: 31 217

|
Цитата(_Pasha @ Jan 29 2010, 13:13)  Дык... не обязательно же ж ! LPM Rd,Z А вроде командой LPM без операндов байт всегда читается в регистр R0?
|
|
|
|
|
Jan 29 2010, 13:35
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(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 всегда? :-) Это от процессора зависит. Там условная компиляция по типу процессора и подставляется оптимальный вариант.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|