Witam,
do zmiany "w locie" cu wykonuje sie w przerwaniu dobrze sie wykorzystuje wskaznik do funkcji. Zadeklaruj sobie zmienna typu wskaznik do funkcji w pliku, gdzie masz obsluge przerwania . Dodatkowo, w tym samym pliku stworz funkcje SetIrqHandler(), ktorej parameterm jest wskaznik na funkcje. W samym przerwaniu wywolujesz funkcje przez jej wskaznik.
na szybko cos podobnego do:
static void(*pIrqHandler)(void);
/** @file main.c */
// zmienna globalna dla tego pliku, niedostpena z innych modulow static void (*pIrqHandler)(void);
// funkcja do inicjalizacji wskaznika do funkcji, exportowana w irq.h void SetIrqHandler(void( *pNewHandler)(void)) { pIrqHandler = pNewHandler; }
/** to wlasciwa funkcja przerwania SIGNAL (SIG_OVERFLOW1) ale nie mam WinAvr zeby calosc kompilowac, testowalam poprawnosc skladni na Yagarto
*/ //SIGNAL (SIG_OVERFLOW1) void Doirq(void) { pIrqHandler(); }
/****************************/
int EnableIrq() { return 0; }
int DisableIrq() { return 0; }
void f1(void) { // zrob cos }
void f2(void) { // zrob co innego }
void main1 (void) { StandardowaInicjalizacja(); SetIrqHandler(f1);
EnableIrq();
while(1) {
// zrob co trzeba // a jak dojdziesz ze irq ma robic co innego to: // to tylko do testow, normalnie funkcja wywolana przez hardware irq Doirq(); DisableIrq(); SetIrqHandler(f1); EnableIrg(); // to tylko do testow, normalnie funkcja wywolana przez hardware irq Doirq(); // kontynuuj z main }
}
mankament jaki widze, to to ze obsluga przerwania wydluzy sie o wywolanie kolejnej funkcji oraz odlozy troche na stos. Ogowlnie, wskazniki do funkcji to bardzo uzyteczna rzecz, np. tablica takich wskaznikow zastepuje swietnie skomplikowane if czy switch no i mozna zmieniac je podczas dzialania programu