XC8 a data ver Flash

Jan Smrz jan.smrz na email.cz
Středa Červen 19 16:17:47 CEST 2013


Zdravim,

mel bych dotazek k XC8, PIC18F4685 a pouzivani dat ulozenych ve flash. Jak 
spravne ulozit data na urcite misto v pameti?

Mam totiz takovy problem, ve flash mam ulozeny dve pomerne rozsahla pole dat.

const unsigned char pdata1[]= { 0x01,0x01,0x00,0x00,0x00,0xDA,0x08, ... atd, 
celkem asi 30KB
const unsigned char pdata2[]= { 0xA1,0x01,0x2C,0x01,0x10,0x23,0x02, ... atd, 
celkem asi 10KB

V programu k nim pristupuji pomoci rutin mem_read (v podstate ekvivalent 
knihovni FlashRead).

mem_read((uint32_t)pdata1,sizeof(format_version),&format_version);
    mem_read((uint32_t)pdata1 + 2,sizeof(length),(uint8_t*)&length);

Pokud necham ulozeni dat na plne linkeru, tak vse funguje. Pokud prvni pole 
umistim absolutne
const unsigned char pdata1[] @0x4000 = { ....
tak je to take jeste v poradku. Problem nastane, kdyz absolutne umistim i druhe pole
const unsigned char pdata2[] @0xC000 = { ....

Pak uz cteni nekde funguje a nekde nefunguje. Pri trasovani vidim, ze vyraz 
(uint32_t)pdata1 casto obsahuje 0 misto adresy promenne. Pole se neprekryvaji a 
nikde neni pri kompilaci/linkovani hlaseno zadne varovani.
Pole umistuji absolutne, protoze je musi byt mozno z programu modifikovat a chci 
je mit zarovnany na 64B (velikost flash bloku).


Druhy dotaz - v defaultnim nastaveni linkeru je oblast pro ulozeni promennych 
definovana takto: -AMEDIUMCONST=0D00h-0FFFFh,010D00h-017FFFh. Je nejaky duvod 
pro to, aby oblast nebyla v jednom kuse, t.j. 0D00h-017FFFh?


Dekuji,

J.S.



Další informace o konferenci Hw-list