Charoit 0 28 января, 2010 Опубликовано 28 января, 2010 · Жалоба Поиском не нашел, решил задать вопрос.. Как на сях в WinAVR можно прочитать содержимое регистра, например R0? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
manul78 4 28 января, 2010 Опубликовано 28 января, 2010 · Жалоба Поиском не нашел, решил задать вопрос.. Как на сях в WinAVR можно прочитать содержимое регистра, например R0? Можно читать содержимое из памяти (регистровый файл)... А можно сделать ассемблерную вставку + привязку, и компилятор "сгенерит" код в котором переменная в С будет ассоциироватся с нужным Вам регистром. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Charoit 0 28 января, 2010 Опубликовано 28 января, 2010 · Жалоба Можно читать содержимое из памяти (регистровый файл)... А можно сделать ассемблерную вставку + привязку, и компилятор "сгенерит" код в котором переменная в С будет ассоциироватся с нужным Вам регистром. Мне бы пример, если Вам несложно:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
manul78 4 28 января, 2010 Опубликовано 28 января, 2010 · Жалоба Мне бы пример, если Вам несложно:) Статическая память микроконтроллеров AVR начинается с регистрового файла. Прямо с $00... Открываете даташит на Ваш микроконтроллер и смотрите адрес нужного Вам регистра. Например R0=$00, R1=$01,...R31=$1F Объявляем указатель: volatile char *R2 // название дано для наглядности... Объявляем переменную: volatile char x // сюда будет загруженно содержимое Заносим в указатель адрес регистра: R2 = 0x02 // адрес регистра R2 Читаем его : x = *R2 // содержимое регистра R2 - в переменной х Можете ещё посмотреть функции для прямого доступа к памяти в WinAVR... Ассемблерную вставку напишу позже, если понадобится... :) Там можно заставить компилятор ассоциировать например переменную X c регистром общего назначения и соответственно любое обращение к X равноценно выбранному регистру. Всё это делается исключительно для читабельности исходного файла, потому как машинный код что в первом примере, что в последнем будет одинаков... :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 28 января, 2010 Опубликовано 28 января, 2010 · Жалоба Как на сях в WinAVR можно прочитать содержимое регистра, например R0?Хотел там мяукнуть, но обленился. Тут спрошу - а зачем? Не подколки ради, просто чтение регистра из С ведь не самоцель. Опишите задачу. Тогда будет понятно, что советовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
manul78 4 28 января, 2010 Опубликовано 28 января, 2010 · Жалоба Хотел там мяукнуть, но обленился. Тут спрошу - а зачем? Действительно, зачем !? Ради праздного любопытства ? Для отладки ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 28 января, 2010 Опубликовано 28 января, 2010 · Жалоба Действительно, зачем !? Ради праздного любопытства ? Для отладки ?Особенно учитывая то, что именно R0 - это временый регистр __temp_reg__ компилятора, он же используется в команде mul и его и зарезервировать нельзя, вся работа компилятора обломается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
manul78 4 28 января, 2010 Опубликовано 28 января, 2010 · Жалоба Особенно учитывая то, что именно R0 - это временый регистр __temp_reg__ компилятора, он же используется в команде mul и его и зарезервировать нельзя, вся работа компилятора обломается. Кстати, WinAVR оперирует буквально 4-6 РОН и PUSH-ит их постоянно, остальные РОН пустуют. У меня несколько раз было, что "борода" стека рушила данные в SRAM... Я лично, всегда проверяю откомпиленный WinAVR код. Бывает придраться не к чему, а бывает наворочает мама не горюй. Заметил, что более ранние версии давали более компактный код. На эту тему здесь уже был разговор. Сошлись, на том, что большой код - высокая производительность, маленький код - низкая производительность... :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 28 января, 2010 Опубликовано 28 января, 2010 · Жалоба Заметил, что более ранние версии давали более компактный код. На эту тему здесь уже был разговор.на новых версиях, играясь с новыми ключами оптимизации, получаю более компактный код чем на версиях 2006-2007гг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aesthete Animus 0 29 января, 2010 Опубликовано 29 января, 2010 · Жалоба на новых версиях, играясь с новыми ключами оптимизации... А Вы не могли бы привести пример такой игры? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 29 января, 2010 Опубликовано 29 января, 2010 · Жалоба А Вы не могли бы привести пример такой игры?В ветке, посвященной WinAVR20100110 и в соседней. Просто комментирую один ключ, компилирую, смотрю результат. Если код уменьшился - так и оставляю, если увеличился - возвращаю назад. И так пару итераций. "Играюсь" так, когда почти вся программа написана, таким образом удается найти оптимальное сочитание имеенно под конкретную программу, ее стиль. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Charoit 0 29 января, 2010 Опубликовано 29 января, 2010 · Жалоба Хотел там мяукнуть, но обленился. Тут спрошу - а зачем? Не подколки ради, просто чтение регистра из С ведь не самоцель. Опишите задачу. Тогда будет понятно, что советовать. Да признаться стыдно..:) Хотел прочитать несколько байт памяти программ - на асме это делал командой LPM, в принципе все понятно было. Решил попробовать на С, выяснил, что есть макрос pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) - ну и решил, что результат чтения как и на асме тоже сохраняется в регистре R0. Микроконтроллерный С не так просто в освоении оказался.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 29 января, 2010 Опубликовано 29 января, 2010 · Жалоба что результат чтения как и на асме тоже сохраняется в регистре R0. Дык... не обязательно же ж ! LPM Rd,Z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Charoit 0 29 января, 2010 Опубликовано 29 января, 2010 · Жалоба Дык... не обязательно же ж ! LPM Rd,Z А вроде командой LPM без операндов байт всегда читается в регистр R0? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 29 января, 2010 Опубликовано 29 января, 2010 · Жалоба pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) А вроде командой LPM без операндов байт всегда читается в регистр R0?А кто сказал, что макрос пользуется командой LPM всегда? :-) Это от процессора зависит. Там условная компиляция по типу процессора и подставляется оптимальный вариант. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться