[an error occurred while processing this directive]
IAR AVR 4.12 и (char __farflash*) - опять???
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено П.В. 03 февраля 2006 г. 21:34

Хочу поделится своим горем по поводу указателей (char __farflash*) в
ИАРе АВР версии 4.12A. Захотелось мне считать флеш-память программ и
проверить ее валидность. Проц - Мега128. Полагаю. ничего экзотического
в этом нет?

Попробуем считать 10 байт из флеш-памяти, с адреса 0x0FFFE по 0x10007.
(Ну и выпулить их куда-нибудь, пусть в порт А, дабы компилятор
не заоптимизировал все насмерть). Вот кусочек программки (блок):

-----------
{
char temp = 10;
char __farflash* fp = (char __farflash*)0xFFFE;
do PORTA = *fp++; while (--temp);
}
----------

А вот то, что генерит компилятор:

----------
// 157 char temp = 10;
// 158 char __farflash* fp = (char __farflash*)0xFFFE;
LDI R30, 254
LDI R31, 255
LDI R19, 0
LDI R16, 10
// 159 do PORTA = *fp++; while (--temp);
??main_0:
OUT 0x3B, R19 <<-- ПОЧЕМУ ОБНУЛЕНИЕ RAMPZ В ЦИКЛЕ ???????????
ELPM R17, Z+
OUT 0x1B, R17
DEC R16
BRNE ??main_0
----------

В момент перехода 0x0FFFF -> 0x10000 команда "ELPM R17, Z+" отрабатывает
согласно даташиту (и судя по АВРстудии), пара R31,R30 обнуляется, RAMPZ
становится равным 1. А потом в цикле его затирают нулем. И следующий байт
из флеша считывается с адреса 0х00000 вместо 0х10000... :-((

Грустно, если честно... Массив данных более 32К мы не можем, статические
адреса функций мы коверкаем, теперь еще и флеш-память мы умеем только 64К
Опять курить ассемблер?
Вопрос - у всех так? Утереться и постараться получить удовольствие?
А может это только версия 4.12 искривилась?

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru