реклама на сайте
подробности

 
 
> AVRGCC+длинные (>64k) байтовые адреса в флеши
LordVader
сообщение Aug 19 2009, 09:40
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 127
Регистрация: 18-10-06
Пользователь №: 21 418



Вводные:
есть атмега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)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 21:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01358 секунд с 7
ELECTRONIX ©2004-2016