|
|
  |
Как прочитать программно Flash память атмеги 128 |
|
|
|
Jun 15 2010, 12:34
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(YAM @ Jun 15 2010, 16:03)  Ну типа так для IAR AVR: unsigned int VAR; VAR = *(unsigned int __farflash *)0x1FFFE; // Читаем последние 2 байта памяти программ ТО есть получается что адрес FFFF применимо к функции pgm_read_word будет читать из флеша по адресу FFFF/2 а не FFFF? Я правильно понимаю?
|
|
|
|
|
Jun 15 2010, 12:52
|

Местный
  
Группа: Свой
Сообщений: 256
Регистрация: 7-07-04
Из: Ukraine
Пользователь №: 291

|
Цитата(inventor @ Jun 15 2010, 15:34)  ТО есть получается что адрес FFFF применимо к функции pgm_read_word будет читать из флеша по адресу FFFF/2 а не FFFF? Я правильно понимаю? Это зависит от типа компилятора. Я привел пример для IAR. Но по любому, любой многобайтовый доступ к памяти программ будет преобразован к установке RAMPZ и байтовому чтению командой ELPM.
--------------------
|
|
|
|
|
Jun 15 2010, 13:03
|

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

|
Цитата(inventor @ Jun 15 2010, 14:21)  Насколько я понимаю, эта внутренняя флеш устроена таким образом, что у нее в одной ячейке записаны ДВА байта. Не морочьте себе голову. Это странная прихоть писателей даташитов от атмела, что память адресуется словами. Обратите внимание, что согласно даташиту для команды LPM в Z грузится адрес слова сдвинутый на 1 и в младший бит - признак "младший/старший байт слова". Которые вместе образуют честный байтовый адрес. Чтение все равно происходит по одному байту за раз, а как оно устроено внутри - знают только сами разработчики кристалла. gcc-avr (WinAVR) использует нормальную байтовую адресацию. Словная адресация используется только для указателей на функции, которые физически не могут указывать на нечетный байтовый адрес. Цитата(inventor @ Jun 15 2010, 14:21)  ТО есть если я читаю предположим с адреса 0, то я должен прочитать ДВА байта функцией pgm_read_word а с адреса 1 следующие ДВА байта. Нет. В первом случае получите 2 байта с адресов 0,1, во втором - с адресов 1,2.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 15 2010, 13:34
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(Сергей Борщ @ Jun 15 2010, 17:03)  Не морочьте себе голову. Это странная прихоть писателей даташитов от атмела, что память адресуется словами. Обратите внимание, что согласно даташиту для команды LPM в Z грузится адрес слова сдвинутый на 1 и в младший бит - признак "младший/старший байт слова". Которые вместе образуют честный байтовый адрес. Чтение все равно происходит по одному байту за раз, а как оно устроено внутри - знают только сами разработчики кристалла. gcc-avr (WinAVR) использует нормальную байтовую адресацию. Словная адресация используется только для указателей на функции, которые физически не могут указывать на нечетный байтовый адрес. Нет. В первом случае получите 2 байта с адресов 0,1, во втором - с адресов 1,2. Спасибо. Именно так и получается (0,1...1,2) Просто я считал, что раз в документации написано, что конечный адрес флеша FFFF, то и адресовать я это должен соответсвенно по 16 бит.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|