XC8 a data ver Flash

Jan Waclawek konfera na efton.sk
Čtvrtek Červen 20 09:41:46 CEST 2013


>Po zbeznom precitani user guide pre XC8 by som este doporucil namiesto
>operatora @ skusit absolutnu lokaciu pomocou priradenia section (5.14.4.8
>a s tym suvisiace v kapitoli pre linker).

Citam ten user guide dalej a [ciastocne] odvolavam co som napisal... 

5.4.5.4.
Pointers and integers are not interchangeable.

Takze IMHO cely Vas problem spociva naozaj v tom pretypovani (presne ako
Andy napisal) a v obsahu dost rozsiahlej kapitoly 5.4.5. Prekladac pozna
mnozstvo typov pointrov a ich forma je dana ich pouzitim (t.j. to NIE JE
absolutna adresa). Podla mna je mechanizmus prekladaca vo Vasom pripade
nasledovny: s pointrovou konstantou pdata1 naklada rovnako ako s pointrom,
ktorym sa pristupuje len a len k objektu, na ktory konstanta ukazuje, v
tomto pripade k polu (pricom sa predpoklada, ze sa moze pristupit ku
kazdemu elementu objektu, t.j. ku kazdemu prvku pola, prostrednictvom
pointrovej aritmetiky napr. inkrementovanim pointra). V pripade 30k pola @
0x4000 vie, ze na to staci 16 bitov, a tak zvolil typ pointra "absolutna
adresa na data v prvych 64kB flash". V druhom pripade, t.j. 30k pole @
0xC000 vie, ze by takymto typom pointra nedosiahol na vsetky jeho prvky, a
tak pravdepodobne pouzil pointer ineho druhu, znova 16-bitovy, a to
"relativna adresa na data od ofsetu 0xC000". Myslim si, ze zo studia
asembleroveho vystupu prip. linker map by toto malo byt jasne.

Aj ked sa to zrejme bude zdat ze to predsa takto v C nemoze fungovat,
kupodivu je to vsetko presne podla normy; diskutovali sme tu o tom uz
prednedavnom. Pointre, ich vnutorna reprezentacia a nakladanie s nimi su
vysostna zalezitost prekladaca. Treba si to cim skor a cim silnejsie
natlct do hlavy: POINTER NIE JE ADRESA. Bodka. :-)

Ak vsak trvate na explicitnej konverzii na adresu, myslim si, ze jedine
schodne riesenie je schovane v nasledujucej vete z 5.4.5.2.1:
If assembly code references a C pointer, the compiler will force that
pointer to become [...] a 24-bit mixed target space pointer, for PIC18
programs. 
T.j. to pretypovanie musi prejst skutocnym pointrom, ktory je pouzity
(aspon naoko) aj v asembleri. Bohuzial to zrejme znamena aj datovy
priestor pre ten pointer, a tipujem, ze to vygeneruje aj nejaky kod
naviac. Mimochodom, z predchadzajuceho obsahu tej kapitoly vyplyva, ze
21.bit (ktory pre PIC18 rozlisuje ci ide o datovu alebo programovu pamat)
bude vynulovany.

Mimochodom, ten manual obsahuje (v App.C) aj normou vyzadovany zoznam
"implementation defined" vlastnosti, vratane spravania sa pretypovania
pointra na integer - skopiruje sa jeho obsah bezo zmeny ak nie je integer
prilis maly.

wek





Další informace o konferenci Hw-list