www.mikrocontroller.net

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


Autor: Markus Groh (mgdelta)
Datum:

Bewertung
0 lesenswert
nicht 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();

Autor: Markus Groh (mgdelta)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, habe mein Problem selber lösen können. Im Funktions-Prototyp der 
ISR fehte eine Compilerfunktion
void vISRblahblah(void) __attribute__ ((naked));

Nun funktioniert alles prima.

Autor: Windl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.