c: hi-tech 9,80, interrupt asm
Andrej Jancura
aj.hwlist na gmail.com
Pondělí Březen 31 22:20:37 CEST 2014
Dobry vecer,
skusim to komentovat vo Vasej reakcii, teda v texte a na konci.
A.
2014-03-31 21:27 GMT+02:00 Miroslav Draxal <evik na volny.cz>:
> Ne neuzavřeli. Jenom pátrám dál. O tom bootloaderovi v examles vím, koukal
> jsem. Problém je v tom, že tohle přesouvání je všechno "systémové". Já chci
> nesystémově podstrčit kompilátoru mnou napsanou obsluhu přerušení.
> Kompiler si udělá "systémově" začátek rutiny přerušení tj, uklidí registry,
> pak předá řízení do
>
> void interrupt low_priority interrupt_low (void)
>
> a po návratu z funkce přerušení zase systémově obnoví registry. Těch
> registrů ukládá a obnovuje cca 13, což je pro mě moc. V přerušení používám
> jenom W reg a potřebuji "fofr". Nemusím ukládat registry.
>
> Takže řešení je:
>
> 1/ buďto nějak systémově přesvědčit kompilátor, aby místo své obsluhy
> přerušení použil mou
>
> 2/ nebo nesystémově použít
>
> Void MeInterrupt(void)@0x08
>
>
>
> Pokud použuji 2/ v hi-tech 9,80 tak to místo na adresu 0x08 přeloží na
> 0x00, což je chyba
>
> Pokud použiji 2/ v xc8, tak se to přeloží OK
>
Myslim si, ze operator @ funguje az vo verzii xc8, preto Vam to nejde.
>
>
> Problém je, že 9,80 mám legálně ve verzi PRO, a pokud použiji XC8, tak tam
> jedu ve verzi Lite a už se do pice nevejdu. Ten projekt musí být i nadále
> živý, čili nemohu ho jednorázově přeložit ve zkušební verzi XC8 PRO.
>
A na upgrade na XC8 ste neuvazoval? :)
>
>
> Dnes mě napadlo, že bych využil toho, že funguje
>
> Void MeReset (void)@0x00
>
> #asm
>
> Goto _picInit
>
> Nop
>
> Nop
>
> Goto _MeHigInterrupt
>
> #endasm
>
>
>
> Což funguje, vše se uloží jak má, ale problém je, že zas nevím jak zapsat
> to _picInit. Je to inicializační rutina procesoru, kde se nuluje RAM atd.
> To zase dodá kompiler. Adresa počátku rutiny se mění po rekompilaci
> (přidání dalšího kódu). Nevím jak se na ten pic Init odkázat, aby tomu
> kompiler rozuměl.
>
>
>
> M.
>
>
>
Pozrite, myslim, ze zaklad je ten, ze v zdrojaku nenapisete void interrupt
my_isr() {}. Ked napisete tento riadok, tak prekladac automaticky generuje
celu rutinu ukladania a obnovy registrov v preruseni, aj ked je prazdna.
Pak by som sa pozrel ako to generuje ten mnou zmienovany startup . as, ja
mam toto:
--chip=16f690 -M -P -N31 \
--warn=0 \
--mode=pro \
--opt=all,+asm,+asmfile,9 \
--addrqual=ignore \
--runtime=default,+clear,+init,+keep,+osccal,+resetbits,-download,-stackcall,+stackwarn,+clib
\
--summary=default,-psect,-class,+mem,-hex \
--double=24 \
--float=24 \
-G \
--asmlist \
--output=default,-inhx032 \
rx_tx_debug.c
A pozrite si ako je rieseny ten startup a vas main v C. Potom Vam neostane
uz nic ine, iba sa vrhnut do toho asembleru a manualu a naprogramovat si tu
obsluhu sam. Ako som uz pisal, princip som pochopil na 90%, ale prakticky
mi to nikdy moc nechodilo. Ine riesenie v tych starych verziach kompilatora
nie je. Snad len to, ze si pozrite este kapitolu o uzivatelskom startup
file a jeho prilinkovani.
Viacej Vam k tomu naozaj neviem poradit.
A.
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20140331/c226a314/attachment-0001.html>
Další informace o konferenci Hw-list