Павел В. (03.02.2006 21:35, просмотров: 1879)
Опять IAR AVR 4.12... Теперь (char __farflash*) Хочу поделится своим горем по поводу указателей (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 искривилась?