Вводные:
есть атмега128, в ней, в флеше хранятся данные размером больше, чем 64килобайта.
Данные берутся из бинарей и конвертятся в .o по
факу.
По факу же и используются:
Код
...
extern const char fpga[] PROGMEM;
extern const char fpga_end[] PROGMEM; // эти символы создаёт avr-objcopy в своём .o, так на них ссылаемся из сорца
...
uint32_t ptr;
...
ptr = fpga_end; // тут _end, чтобы продемонстрировать проблему
...
a=pgm_read_byte_far(ptr++); // этот фрагмент работает как надо, генерит elpm, ставит ROMPZ
Блок данных пихается в начало флешки, а конец уезжает за 64к (*.lss, дизасм)
Код
0000008c <fpga>:
8c: ff ff .word 0xffff; начало
...
...
17f72: ff 00 .word 0x00ff; конец
00017f73 <fpga_end>:
...
Проблема заключается вот в чём: грузим ptr нужным адресом
Код
1803a: 83 e7 ldi r24, 0x73; 115
1803c: 9f e7 ldi r25, 0x7F; 127
1803e: aa 27 eor r26, r26
18040: 97 fd sbrc r25, 7
18042: a0 95 com r26
18044: ba 2f mov r27, r26
Видно, что берутся ТОЛЬКО младшие 16 бит байтового адреса (0x17f73) и расширяются до 32 знаково.
Если брать начало блока, то все как бы хорошо. А если 2 таких блока, и начало 2ого вылезет за пределы 64к? Как правильно ссылаться за пределами 64к байт в флешку?
ps: avr-gcc (GCC) 4.2.2 (WinAVR 20071221)