[elektro] dsPIC33 bootloader

Moczik Gabor pm_levlista at progzmaster.hu
Mon Sep 27 20:42:09 CEST 2010


Balla Zoltán wrote:
>> De ha meg tudod oldani a programot inicializáció és miegymás nélkül,
>> akkor elég egyszerű lehet egy saját crt0 összetákolása.
>>
> Nekem ugyan nem kéne, ennek örülnék legjobban, viszont ha kihagyom a linkerben ezeket a részeket, 
> lefordul ugyan, de a memóriafoglalásokat teljesenelrontja pl, ugyanarra a címre kezdi pakolni a 
> globális változókat is, meg pl egy függvény lokális változóit, meg bemenő paramétereit is... Így 
> természetesen teljesen szarul fut a progi, bár inkább csak resetbe megy rögtön....
> Sajnos nem tudom, mire van szüksége a C-nek, így szerintem reménytelen sajátot írni...legjobb lenne 
> kihagyni..., de úgy tűnik ez nem megy...

Nem tudod teljesen kihagyni, de pl. a tipikus feladatok amit elvégez, az 
a meg nem határozott értékű static és globális változók nullázása (psect 
BSS), az inicializált változókhoz a flashból a ram-ba másolja a 
tartalmat, ugrán a main-re, stb...

NEM feladata a változók relokálása, ezt a linkernek kell megtennie, hisz 
fordítás időben kell eldőlnie. Ha nincs gyári crt0, akkor állítom, hogy 
ha az ORG 0 címre bepattintasz egy JMP _main utasítást, akkor el kell 
induljon. Ott kézzel minden változót inicializálni kell (nullára is).
A main soha ne térjen vissza, JMP-vel ugorjon a bootolandó programra.

Nem lehet olyan nagy etwas ezt kisebb PIC-en megoldani, a PIC32 crt0-ja 
is csak inicializálást csinál. Csak azért van ilyen nagy arcom, mert 
annak idején Watcom C++ -ban bootolható objektum-orientált oprendszert 
kezdtem írni. Nem igazán vannak ezek a dolgok dokumentálva, na abból 
kihagyni a gyári crt0 rutint, majd megírni ami ahhoz kell, hogy 
egyáltalán a konstruktorok helyes sorrendben lefussanak... Pár sor lib 
forráskódot át kellett nyálazni. Végül be lehetett bootolni, de már el 
sem hiszem, hogy ezt tényleg megcsináltam. :-)

> A legfurcsább az egészben az, hogy annak függvényében fut másként a proci, hogy a boot loader mit 
> égetett a megfelelő területre! És itt most nem az értelemszerű programra gondoltam, hanem hogy maga 
> a boot loader működik már másként, holott ugyanaz a program és mégis másképpen viselkedik. Pl ha 
> csupa 0-val töltöm föl a frissítendő területet, működik jól a boot loader..., de ha 0x5h -val, akkor 
> meg már az elején, még mielőtt belépne a boot loaderbe, már a C-s plussz dologban elszáll....!! Na 
> ezt nem értem igazán miért van...olyan mintha vagy hivatkozna egy olyan területre, amit közben 
> átégetek, vagy pedig a memóriában hivatkozik máshová valamiért.... Szóval nem értem...

Tuti hogy nem jó helyen van a vezérlés. A 0 az NOP, végigfut rajta, és 
elindul a cuccod a terület végén, ha más van benne, akkor meg elakad.

Milyen fordító?
Nem lehetne memory map-et kérni?
Akkor látni lehetne mir hova méltóztatott relokálni, utána az asmlist 
tanulmányozásával kideríteni, hogy miként is hívódnak meg a dolgok.

Némi kódrészletet, vagy az egészet is mellékelhetnéd (ha nem titkos).

-- 
((( Móczik Gábor  )))--((( e|mail: pm-01 |@| progzmaster |.| hu )))
((( S.k.y.p.e.: moczik )))



More information about the Elektro mailing list