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