ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
19 мая
50384
Павел В. (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 искривилась?