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.