Forum: Mikrocontroller und Digitale Elektronik AVR32 FreeRTOS ISR/Semaphore Problem


von Markus G. (mgdelta)


Lesenswert?

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();

von Markus G. (mgdelta)


Lesenswert?

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.

von Windl (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.