XC8 a data ver Flash

Jan Smrz jan.smrz na email.cz
Středa Červen 19 23:42:40 CEST 2013


Dne 19.6.2013 19:36, Jan Waclawek napsal(a):
>> const unsigned char pdata1[]= { 0x01,0x01,0x00,0x00,0x00,0xDA,0x08, ... atd,
>> Pri trasovani vidim, ze vyraz
>> (uint32_t)pdata1 casto obsahuje 0 misto adresy promenne.
> No, nechcem krivdit Microchipu a samozrejme o PICoidoch nic neviem, ale rozne tie ladiace prostriedky castokrat ukazuju kraviny. Ved pdata1 je predsa konstanta, nie? Skor by som dal breakpoint niekde na zaciatok tej funkcie a pozeral na "miesto" (register? pamat?), kde sa odovzdavaju parametre. No a samozrejme by som pozrel v disasemblerovanom binare, ako sa pred volaniami tej funkcia to inkriminovane "miesto" plni.
>
> wek
>
Ano, pdata1 je konstanta, jen mám podezření, že ji asi ne vždy přiřadí 
správnou hodnotu. V kódu mám dvoje čtení hned za sebou
mem_read((uint32_t)pdata1,sizeof(format_version),&format_version);
mem_read((uint32_t)pdata1 + 2,sizeof(length),(uint8_t*)&length);

První čtení je špatné (opravdu čte data z adresy 0), druhé je již 
správné. Pokud pořadí čtení prohodím (první čtu length), je opět první 
špatné, druhé správné.

Asi to bude bug v linkeru, zkusil jsem teď nahradit (uint32_t)pdata1 
konstantou rovnou adrese proměnné a kód s tím funguje správně .

On ten linker vůbec funguje prapodivně. Např. pokud napíši

const unsigned char pdata1[1000]= { .. zde jen 50 inicializačních dat

Pak rezervuje pro proměnnou 1000 bytů. Pokud ale napíši

const unsigned char pdata1[1000] @0x3000= { .. zde jen 50 inicializačních dat

Tak proměnná je sice umístěna na adresu 0x3000, ale velikost má již jen 
50 bytů a zbytek je obsazen jinými proměnnými/programem.


J.S.


   



Další informace o konferenci Hw-list