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