[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