c: hi-tech 9,80, interrupt asm
Miroslav Draxal
evik na volny.cz
Středa Duben 2 23:34:30 CEST 2014
Dobrý den, tak nakonec to dopadlo, ale nejsem s toho moudrý.
Ponejprv shrnutí.
HIGH přerušení mi stále ukládalo a obnovovalo registry, které se v přerušení
nepoužívají
5940 0009FA CFEA F03B movff fsr0h,??_interrupt_high+3
5941 0009FE CFE1 F03C movff fsr1l,??_interrupt_high+4
5942 000A02 CFE2 F03D movff fsr1h,??_interrupt_high+5
5943 000A06 CFD9 F03E movff fsr2l,??_interrupt_high+6
5944 000A0A CFDA F03F movff fsr2h,??_interrupt_high+7
5945 000A0E CFF3 F040 movff prodl,??_interrupt_high+8
5946 000A12 CFF4 F041 movff prodh,??_interrupt_high+9
5947 000A16 CFF6 F042 movff tblptrl,??_interrupt_high+10
5948 000A1A CFF7 F043 movff tblptrh,??_interrupt_high+11
5949 000A1E CFF8 F044 movff tblptru,??_interrupt_high+12
5950 000A22 CFF5 F045 movff tablat,??_interrupt_high+13
Po bližším rozboru názevProjektu.X.debug.lst jsem došel k poznání, že
překladač si určuje, s jakými registry funkce pracuje (přerušení) a podle
toho je ukládá. Takže jsem projekt zkopíroval, očesal pouze na prostá volání
procedur, těla vymazal a začal laborovat.
- STÁLE NESMYSLNÉ UKLÁDÁNÍ REGISTRU
Po té jsem vymazal ze složky projektu vše, kromě zdrojových souborů a
vytvořil projekt znovu.
- A HURÁ, při přerušení rovnou do rutiny obsluhy přerušení bez
ukládání nepoužívaných registrů.
Ovšem po přidání těl procedur obsluhy to zase začalo ukládat nepoužívané
registry.
Následně po laborování jsem zjistil, že pokud uložím podprogramy, které se
volají z hlavního programu přerušení před něj, je zase vše v pořádku.
Správná struktura
Podprogram_přerušení1
Podprogram_přerušení2
Program_přerušení
Špatná struktura
Program_přerušení
Podprogram_přerušení1
Podprogram_přerušení2
Zatím tohle chování neumím vysvětlit. Dělá to jak Hi-Tech 9,80 tak XC8 1,30.
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Andrej
Jancura
Sent: Monday, March 31, 2014 10:50 PM
To: HW-news
Subject: Re: c: hi-tech 9,80, interrupt asm
Pozrite, co som Vam vedel a mohol poradit, to som urobil. Netusim ako Vam
inak pomoct. Zial je to tak a je mi to luto, ze sa problem nepodarilo
vyriesit. Este by som skusil napisat na support a spytal sa tam.
A.
2014-03-31 22:42 GMT+02:00 Miroslav Draxal <evik na volny.cz>:
Myslim si, ze operator @ funguje az vo verzii xc8, preto Vam to nejde.
Ne toto funguje už v Hi-tech. Ovšem do adresy 0x10 nějak nekorektně. Buďto
je to chyba nebo úmysl, který jsem nepochopil.
Jaksi jsem přišel na jeden dosti závažný problém. Pokud bych napsal obsluhu
přerušení "nesystémově" potom by nejspíš následně nechodilo ICD3. Což by při
odlaďování byl problém. Opět tedy na začátku. Nemůže to být nic nesystémové.
m.
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Andrej
Jancura
Sent: Monday, March 31, 2014 10:21 PM
To: HW-news
Subject: Re: c: hi-tech 9,80, interrupt asm
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.
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20140402/89ccae68/attachment-0001.html>
Další informace o konferenci Hw-list