AVR-GCC - jeszcze jedno zapytanie natury "teologicznej"

Feb 02, 2004 2 Replies

Pisz±c w C pod kompilator AVR-GCC napotka³em jeszcze jeden problem: jak zdeklarowaæ obs³ugê np. 2 przerwañ, aby oba wywo³ywa³y t± sam± procedurê obs³ugi przerwania, (np. zg³oszenia przerwañ na INT1 i INT2 s± obs³ugiwane przez ten sam kod)



W asemblerze piszê tak:



------------------------------------ .section .text



.global SIG_INTERRUPT1 .global SIG_INTERRUPT2



SIG_INTERRUPT1: SIG_INTERRUPT2:



;kod procedury obs³ugi



reti



----------------------------------- i ju¿ oba zg³oszenia bêd± wywo³ywaæ ten sam kawa³ek kodu.



No fajnie! A jak to samo zrobiæ w C?



Mo¿na oczywi¶cie napisaæ jedn± procedurê obs³ugi, np.:



--------------------------- void ProcObslugi(void) { //kod procedury }



--------------------------- i w ka¿dej z procedur obs³ugi poszczególnych przerwañ wywo³aæ powy¿szy podprogram, np. tak:



----------------------------------- SIGNAL (SIG_INTERRUPT1) { ProcObslugi(); } SIGNAL (SIG_INTERRUPT2) { ProcObslugi(); }



----------------------------------- ale to kosztuje dodatkowe cykle maszynowe potrzebne na wywo³anie procedury i powrót z niej, a na dok³adkê kompilator (chyba z uwagi na obecno¶æ wywo³ania procedury zewnêtrznej) dorzuca tam masê zbêdnych zrzutów rejestrów na stos, które te¿ zajmuj± sporo czasu.



Mo¿na równie¿ w ka¿dej z procedur obs³ugi 2x powtórzyæ ten sam kod, ale to z kolei niepotrzebnie zajmuje pamiêæ programu.



Zadanie do wykonania w przerwaniu jest do¶æ krytyczne czasowo i zale¿y mi na tym, aby wykonywa³o siê jak najszybciej. Chcia³bym siê dowiedzieæ, czy istnieje sposób zrobienia tego samego co w ASM w "czystym" C.



Pozdrawiam, QmX.



QmX wrote: ...

W czystym chyba nie, ale w GCC tak:

Funkcji ProcObslugi można nadać atrybut always_inline. Oczywiście ma to tą wadę, że wydłuży Ci wygenerowny kod.

lub

Napisać w asemblerze: .section .text .global SIG_INTERRUPT1 .global SIG_INTERRUPT2 SIG_INTERRUPT1: SIG_INTERRUPT2: rjmp ProcObslugi

gdzie ProcObslugi jest już w C i ma atrybut signal (lub interrupt).

Pozdrawiam,

No to widzê, ¿e sprawa nie jest taka prosta. Pozostanie mi wyrze¼biæ kod ASM i po k³opocie. :-)

Dziêki za wyja¶nienie. QmX.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required