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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как прочитать РОН в WinAVR?
Charoit
сообщение Jan 28 2010, 15:10
Сообщение #1


Участник
*

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



Поиском не нашел, решил задать вопрос..
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?
Go to the top of the page
 
+Quote Post
manul78
сообщение Jan 28 2010, 15:22
Сообщение #2


Местный
***

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



Цитата(Charoit @ Jan 28 2010, 18:10) *
Поиском не нашел, решил задать вопрос..
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?


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

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


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
Charoit
сообщение Jan 28 2010, 15:26
Сообщение #3


Участник
*

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



Цитата(manul78 @ Jan 28 2010, 18:22) *
Можно читать содержимое из памяти (регистровый файл)...

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



Мне бы пример, если Вам несложноsmile.gif
Go to the top of the page
 
+Quote Post
manul78
сообщение Jan 28 2010, 16:07
Сообщение #4


Местный
***

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



Цитата(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


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 28 2010, 16:47
Сообщение #5


Нечётный пользователь.
******

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



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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
manul78
сообщение Jan 28 2010, 17:45
Сообщение #6


Местный
***

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



Цитата(ReAl @ Jan 28 2010, 19:47) *
Хотел там мяукнуть, но обленился. Тут спрошу - а зачем?


Действительно, зачем !? Ради праздного любопытства ? Для отладки ?


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 28 2010, 20:24
Сообщение #7


Нечётный пользователь.
******

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



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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
manul78
сообщение Jan 28 2010, 20:48
Сообщение #8


Местный
***

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



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


Кстати, WinAVR оперирует буквально 4-6 РОН и PUSH-ит их постоянно, остальные РОН пустуют.
У меня несколько раз было, что "борода" стека рушила данные в SRAM...
Я лично, всегда проверяю откомпиленный WinAVR код. Бывает придраться не к чему, а бывает наворочает мама не горюй.
Заметил, что более ранние версии давали более компактный код. На эту тему здесь уже был разговор. Сошлись, на том, что
большой код - высокая производительность, маленький код - низкая производительность... smile.gif


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 28 2010, 21:15
Сообщение #9


Гуру
******

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



Цитата(manul78 @ Jan 28 2010, 22:48) *
Заметил, что более ранние версии давали более компактный код. На эту тему здесь уже был разговор.
на новых версиях, играясь с новыми ключами оптимизации, получаю более компактный код чем на версиях 2006-2007гг.


--------------------
На любой вопрос даю любой ответ
"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
Aesthete Animus
сообщение Jan 29 2010, 07:42
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(Сергей Борщ @ Jan 29 2010, 00:15) *
на новых версиях, играясь с новыми ключами оптимизации...

А Вы не могли бы привести пример такой игры?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 29 2010, 08:32
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Charoit
сообщение Jan 29 2010, 09:31
Сообщение #12


Участник
*

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



Цитата(ReAl @ Jan 28 2010, 19:47) *
Хотел там мяукнуть, но обленился. Тут спрошу - а зачем?
Не подколки ради, просто чтение регистра из С ведь не самоцель.
Опишите задачу.
Тогда будет понятно, что советовать.



Да признаться стыдно..smile.gif Хотел прочитать несколько байт памяти программ - на асме это делал командой LPM, в принципе все понятно было.
Решил попробовать на С, выяснил, что есть макрос pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) - ну и решил,
что результат чтения как и на асме тоже сохраняется в регистре R0.
Микроконтроллерный С не так просто в освоении оказался..
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 29 2010, 10:13
Сообщение #13


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Charoit @ Jan 29 2010, 12:31) *
что результат чтения как и на асме тоже сохраняется в регистре R0.

Дык... не обязательно же ж ! LPM Rd,Z
Go to the top of the page
 
+Quote Post
Charoit
сообщение Jan 29 2010, 11:18
Сообщение #14


Участник
*

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



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



А вроде командой LPM без операндов байт всегда читается в регистр R0?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 29 2010, 13:35
Сообщение #15


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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 всегда? :-)
Это от процессора зависит.
Там условная компиляция по типу процессора и подставляется оптимальный вариант.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


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


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