Hallo zusammen, im Rahmen meiner Diplomarbeit stehe ich vor einem merkwürdigen Problem (für mich). Ich benutze das EVK 1100 Evaluation Board mit einem laufendem FreeRTOS System. Ich arbeite mich zur Zeit komplett in das System ein und es funktioniert auch alles bis jetzt prima. Ja, bis jetzt. Mein Problem: Ich lasse über einem Pushbutton einen Interrupt auslösen. In der ISR wird eine BinarySempahore "gegeben". Eine Task soll auf die Semaphore hören und wenn, einfach nur eine LED toggeln als Test. Wenn ich nun den Interrupt auslöse, bleibt der ganze MCU stehen. Kann ich mir nicht so recht erklären und bin einfach nicht durch endliche Versuche auf eine Lösung gekommen. Benutze ich keine Semaphore habe ich keine Probleme. In der ISR ist auch ein LED-toggle eingebaut. Läuft die ISR alleine (ohne Semaphore), reagiert das System erst ab dem 2. Drücken des Buttons. Ist mir auch noch nicht so ganz klar. Falls jemand hier Tips und Hilfen hat nehme ich sie gerne. Ich bin mit meinem Latein am Ende. Wenn noch mehr Code gebraucht wird, kann ich da gerne weiter helfen. P.S.: Interrupthandling mit einer Queue und der RS232 funktioniert dagegen ohne Crash. Jetzt schon ein großes Dank für alle Antworten! Verkürzter Code: Task: void vTestIsr(void *pvParameters){ xSemaphoreTake(gpiointerrupt); while (1){ xSemaphoreTake(gpiointerrupt,portMAX_DELAY); gpio_tgl_gpio_pin(AVR32_PIN_PB27); } } ISR: static portBASE_TYPE button_int_handler(void){ //portENTER_SWITCHING_ISR(); static portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; gpio_tgl_gpio_pin(AVR32_PIN_PB20); //portENTER_CRITICAL(); XSemaphoreGiveFromISR(gpiointerrupt,&xHigherPriorityTaskWoken); //portEXIT_CRITICAL(); //portEXIT_SWITCHING_ISR(); return xHigherPriorityTaskWoken; } in der main: . . . //interruptregistrierung Disable_global_interrupt(); gpio_enable_pin_interrupt(AVR32_PIN_PX16,GPIO_RISING_EDGE); INTC_init_interrupts(); INTC_register_interrupt((__int_handler)&button_int_handler,AVR32_GPIO_IR Q_0+(AVR32_PIN_PX16/8),AVR32_INTC_INT0); Enable_global_interrupt();
Gut, habe mein Problem selber lösen können. Im Funktions-Prototyp der ISR fehte eine Compilerfunktion
1 | void vISRblahblah(void) __attribute__ ((naked)); |
Nun funktioniert alles prima.
Hallo. Habe das selbe problem. Das interessante bei mir ist/war das die Button Interrupts gingen bis ich einen TX Interrupt dazugegeben habe. Jetzt geht garnix mehr ;-( Was ist das "gpiointerrupt"? eine Queue? Warum brauche ich dazu einen Semaphore? MFG, Roman
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.