AVR32 FreeRTOS ISR/Semaphore Problem

OP #1870482
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();
Gast #2584782
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.