FreeRTOS in hardfault nach BLE User Event

Gast #5760493
Lesenswert?

Ich hab ein CM4 Nucleo und ein BLE shield. Auf dem Cortex läuft FreeRTOS 
mit 3 Tasks.
Einer der Tasks wäre eigentlich für's Abarbeiten der BLE User Events 
zuständig.
1
void hci_user_evt_proc(void)
2
{
3
  tHciDataPacket * hciReadPacket = NULL;
4
     
5
  /* process any pending events read */
6
  while (list_is_empty(&hciReadPktRxQueue) == FALSE)
7
  {
8
    list_remove_head (&hciReadPktRxQueue, (tListNode **)&hciReadPacket);
9
    if (hciContext.UserEvtRx != NULL)
10
    {
11
      hciContext.UserEvtRx(hciReadPacket->dataBuff);
12
    }
13
    list_insert_tail(&hciReadPktPool, (tListNode *)hciReadPacket);
14
  }
15
}

Initialisieren des BLE funktioniert (d.h. ich kann auch darauf 
verbinden). Wenn ich nun aber einen User Event auslöse (z.B. service 
discovery) dann landet der Cortex im HardFault_Handler().
Wenn ich nur den BLE Task am laufen hab oder ihm entsprechend eine 
höhere Priorität gebe dann funktioniert das Ganze.

Hat jemand Erfahrung mit solchen Problemen und kann mir sagen wie ich 
dem auf die Schliche komme? Der BLE Code stammt aus dem ST Beispiel, 
könnte also sein, dass ich da noch Anpassungen machen muss, damit das 
multithread-fähig wird.
Gast #5761067
Lesenswert?

Gehört zur Standardcheckliste. FreeRTOS ist enorm stabil und 
zuverlässig. WENN es Probleme gibt, die nicht in Richtung 
Applikationsprogrammierfehler/Synchronisation o.ä. gehen, ist es sehr 
oft entweder ein geplatzter Taskstack, eine fehlerhafte dynamische 
Speicherverwendung (doppeltes free, Wiederverwendung bereits befreiten 
Speichers, Überschreiben von alloziiertem Speicher etc) oder fehlerhafte 
Betriebssystemkonfiguration (falsch definierte Taskprioritäten etc). Ich 
gucke immer erst auf diese drei Dinge, wenn ein Fault irgendwo "aus dem 
Nichts" einschlägt. In 80% der Fälle

Viele IDEs bieten auch FreeRTOS plugins an, die Dir zum Faultzeitpunkt 
eine Analyse der Tasks anbieten. Da FreeRTOS so konfiguriert werden 
kann, dass es beim Anlegen eines Taskstacks den gesamten Stack mit einer 
konstanten Signatur belegt, sind geplatzte Stacks recht schnell als 
Fehlerquelle identifizierbar.
Gast #5761235
Lesenswert?

Daniel schrieb:
> Das übliche Vorgehen ist, mit JTAG nachzuschauen bei welcher
> Instruktion
> die CPU in die Exception gesprungen ist.

Das hilft aber leider oft nicht. Ein Stacküberlauf z.B. wird erst dann 
Folgeprobleme generieren, wenn auf den korrumpierten Speicher 
zugegriffen wird, was viele viele viele Instruktionen nach dem 
tatsächlichen Übertrampeln des Speichers sein kann. Je nachdem was in 
dem überschriebenen Speicherbereich liegt, kann das ein komplett Anderes 
Fehlerbild sein. In sofern ist eine Analyse der Task stacks (vor Allem 
wenn die IDE das unterstützt) ein guter erster Filter.

Was tatsächlich helfen würde wäre ein Trace, aber für den brauchst Du 
beim Cortex zusätzlich herausgeführte Leitungen, eine teurere Probe und 
eine IDE, die die Tracedaten aufbereiten kann (das ist eine recht 
diffizile Angelegenheit, weil der Cortex die Tracedaten komprimiert 
liefert, d.h. die IDE muss dazu in der Lage sein, die Daten an Hand der 
Imagedatei wieder zu entpacken).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren