zase C -Hi-Tech
Milan B.
milan na bastl.sk
Pondělí Únor 4 16:16:48 CET 2013
On 2/4/2013 3:15 PM, Miroslav Draxal wrote:
>
> Dobrý den,
>
> Snažím se deborelizovat projekt, mám ale problém s přerušením. Jak
> docílit toho, abych všechen kód od SPI v jednom souboru včetně
> přerušení. To stejné např. pro TMR2. Pokud to napíši takhle (viz dole)
> tak to přeloží za sebou, ale jako dvě low přerušení, a na to druhé se
> nedostane. RETFIE je již za přerušením od SPI. Koukám do dokumentace,
> a nějak nemohu najít co s tím. Jde to vůbec? Děkuji ve spolek za
> reakce. Míra
>
Snad som pochopil, o co ide...
Nepoznam dany prekladac, tak naznacim vseobecnu cestu:
Kedze su to dve samostatne funkcie, tak su kompletne aj s prologom, a
epilogom (vratane navratu), tak jednoduche riesenie nie je, kompilator -
a uz vobec nie linker - nema ako vediet, ze ma nejaky kusok funkcie
vynechat.
Taketo "zliepanie" funkcii sa da riesit (ak to prekladac podporuje) cez
"naked" funkcie. Treba sa pozriet, ci prekladac podporuje atribut
funkcie "naked" a ake ma obmedzenia. "naked" funkcia nema prolog a epilog.
Potom je treba zabezpecit, aby linker vsetky taketo "funkcie" zlinkoval
do jednej sekcie (atribut "section" alebo tak nejako) v definovanom
poradi - aby boli funkcie za sebou (a vykonavanie prechadzalo z jednej
do druhej)
Potom treba na zaciatok takejto sekcie natlacit vstupny bod pre
prerusenie a prolog - ulozenie registrov a na koniec takejto sekcie
epilog - obnovenie registrov a navrat z prerusenia - oboje najlepsie v
ASM (dalsie dve male "naked" funkcie)
Myslim, ze akekolvek riesenie je lepsie ako snaha pozliepat viac funkcii
do jednej. Napriklad ekvivalentnym riesenim (zlinkuje sa samo) moze byt
dispecerska tabulka, do ktorej sa pri linkovani funkcii prida smernik na
funkciu a samotna prerusovacia rutina iba prebehne tuto tabulku a zavola
vsetky funkcie.
-m-
> SPI.c
>
> void interrupt low_priority SPIinterrupt (void)
>
> {
>
> if (SSPIE && SSPIF)
>
> {
>
> ......
>
> }
>
> }
>
> a
>
> TMR2.c
>
> void interrupt low_priority TMR2interrupt (void)
>
> {
>
> if (TMR2IE && TMR2IF)
>
> {
>
> ....
>
> }
>
> }
>
> --------------------------přeloží to takhle
>
> 0x0016 -- low interrupt vektor
>
> uloží reg
>
> SPIinterrupt
>
> Načte reg
>
> 0x0090RETFIE<<<<<<<<<<<<<<
>
> 0x0091uloží reg
>
> TMR2interrupt
>
> Načte reg
>
> 0x0150RETFIE<<<<<<<<<<<<<<<
>
>
>
> __________ Informace od ESET NOD32 Antivirus, verze databaze 7968
> (20130204) __________
>
> Tuto zpravu proveril ESET NOD32 Antivirus.
>
> http://www.eset.cz
>
>
> _______________________________________________
> 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/20130204/f2a10fc3/attachment.htm>
Další informace o konferenci Hw-list