Wie man freeRTOS auf stm32f4 zum Laufen bringt

Ich versuche, ein RTOS auf meinem STM32F407VGT6-Board auszuführen. Ich habe die Demo CORTEX_M4F_STM32F407ZG-SK von der freeRTOS-Website heruntergeladen und den Code mit IAR IDE geflasht, aber die LEDs blinken nicht wie erwartet. Beim Debuggen des Programms habe ich festgestellt, dass das Programm hier abstürzt:

vPortStartFirstTask
ldr r0, =0xE000ED08
ldr r0, [r0]
ldr r0, [r0]
msr msp, r0
cpsie i
cpsie f
dsb
isb
svc 0 // The program crashes here!!!!

Ich habe einige Nachforschungen in den freeRTOS-FAQ angestellt , der Abschnitt „Die von mir erstellte Anwendung wird kompiliert, läuft aber nicht“ scheint das gleiche Problem zu behandeln, aber

#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

ist in der Datei FreeRTOSConfig.h vorhanden. Hatte jemand das gleiche Problem? oder das von mir verwendete RTOS ist nicht das richtige?

"crashes" = null Informationen. Sie sollten die Fehlerregister untersuchen und verstehen, was sie Ihnen sagen.
Danke @EugeneSh. Mit "das Programm stürzt ab" meine ich, dass ich nicht zur nächsten Anweisung übergehen kann. Können Sie mir bitte weitere Informationen zum Fehlerregister geben? Was sind die Fehlerregister in stm32F4 und welchen Wert sollte ich in diesen Registern haben?
Lesen Sie mehr über die Behandlung von Hard-Fault-Ausnahmen in Cortex-M und Ihrem spezifischen Chip. Überprüfen Sie, ob dies der Fall ist (indem Sie diese ISR eintragen).

Antworten (3)

Wenn Ihr Code in dieser Zeile „abstürzt“, haben Sie höchstwahrscheinlich den FreeRTOS SVC-Handler nicht installiert. Ich stelle fest, dass Sie die Zeile eingefügt haben:

#define xPortPendSVHandler PendSV_Handler

Dadurch wird ein CMSIS-Standardname (PendSV_Handler) durch den FreeRTOS-Namen ersetzt, aber das setzt voraus, dass Ihre Vektortabelle den CMSIS-Standardnamen verwendet - überprüfen Sie, ob dies der Fall ist und dass nichts anderes in Ihrer Anwendung die Vektortabelle durch einen anderen ersetzt eine durch Neuschreiben des Vektor-Basisadressregisters. Übrigens – FreeRTOS hat ein sehr aktives Support-Forum – es ist mir immer ein Rätsel, warum Leute FreeRTOS-Fragen an einem anderen Ort stellen als an dem Ort, an dem FreeRTOS-Experten zuschauen und bereit sind, Fragen zu beantworten.

ARM-Cortex-M4-Produkte basieren auf der ARM7-Core-Architektur

Tatsächlich ist dies nicht der Fall. So verwirrend es auch erscheinen mag, ARM7-Mikrocontroller verwenden einen ARMv4-Kern, während Cortex-M4-Mikrocontroller einen ARMv7-Kern verwenden :o) Diese spezielle FAQ trifft in diesem Fall also nicht zu.

In der FreeRTOS-FAQ, die Sie verwenden, haben Sie nach Punkt 5 gesucht

  1. Der RTOS-Scheduler stürzt ab, wenn versucht wird, die erste Aufgabe zu starten. Wenn Sie ein ARM7-Ziel verwenden, muss sich der Prozessor im Supervisor-Modus befinden, wenn der RTOS-Scheduler gestartet wird.

ARM-Cortex-M4-Produkte basieren auf der ARM7-Kernarchitektur, siehe diese Wikipedia-Referenz , und da Ihr Snippet deutlich „vPortStartFirstTask“ zeigt, scheint dies vollständig zu beschreiben, was mit Ihrem System vor sich geht.

Unabhängig davon, ob dies architektonisch anwendbar ist oder nicht, das Referenzhandbuch gibt an, dass das Steuerregister des STM32F4 beim Zurücksetzen gelöscht wird, was bedeuten sollte, dass der Betrieb im privilegierten Modus beginnt. Daher scheint dies nur ein Problem zu sein, wenn der Modus zuvor geändert wurde Starten des Planers.
  1. Sie müssen den SVC_Handlerund PendSV_HandlerISR-Handler in stm32f4xx_it.cder Datei entfernen.

  2. Die FreeRTOS-Dateien müssen im C-Compiler-Modus und nicht in C++ kompiliert werden. Das bedeutet, dass C-Dateien als C-Quellcode und C++-Dateien als C++-Quellcode kompiliert werden müssen. Sie können „Auto (erweiterungsbasiert)“ im Abschnitt „Sprache“ auswählen.

  3. Sie müssen den Stamm der FreeRTOSConfig.hDatei wie folgt zur Präprozessor-Registerkarte des Assembler-Abschnitts des Projektoptionsfensters hinzufügen:Geben Sie hier die Bildbeschreibung ein