Pole retezcu v PROGMEM FAR u XMega192; WinAVR2010

Miroslav Mraz mraz na seznam.cz
Sobota Listopad 17 10:58:14 CET 2012


Když nikdo nereaguje, pokusím se odpovědět. Z hlavičky avr/pgmspace.h se
dozvíte, že linker skript je nastaven tak, že data PROGMEM dává hned za
vektory, takže by to mělo být vše ve spodních 64kB flash. Pokud těch dat
nemáte víc jak těch 64kB, pak vám to bude chodit.
Nad 64kB je problém v tom, že pointer PGM_P používá 2 byte, což je málo.
Takže PGM_P texty[] PROGMEM = {text1, text2}; chodit nebude.
Je možné pole pointrů umístit do .data a deklarovat pointer jako
uint32_t. Pak se ovšem nechová jako pointer a není možné ani toto pole
inicializovat během překladu. Musíte použít makra:
uint32_t pointer[2];
pointer[0] = pgm_get_far_address (text1);
pointer[1] = pgm_get_far_address (text2);
Data se pak dají vyčíst pomocí pgm_read_byte_far(pointer[n]) nebo
memcpy_PF()...

Mrazík


Jan Smrz píše v Pá 16. 11. 2012 v 10:33 +0100:
> Zdravim,
> 
> zacinam ted pracovat s xmega a potreboval bych poradit s ulozenim dat ve flash 
> pameti.
> 
> Drive (u malych atmega) stacilo nasledujici:
> 
> 
> const char text1[] PROGMEM = "...";
> const char text2[] PROGMEM = "...";
> 
> PGM_P texty[] PROGMEM = {text1, text2};
> 
> 
> Jak udelam neco podobneho, pokud jsou data ulozena na adrese > 64K? Na netu jsem 
> nasel jen kuse postarsi informace, navic tam je pry nejaky problem s 
> pgm_read_*_far u xmega a tak nevim, zda to lze vubec pouzit.
> 
> 
> Dekuji,
> 
> J.S.
> 




Další informace o konferenci Hw-list