Sonntag, 11. Mai 2014

RTOS 8.0.1 auf dem STM32F4 discovery

Liebe Entwickler,
heute versuche ich, das FreeRTOS 8.0.1 auf meinem STM32F4 discovery zum Laufen zu bringen und mein Vorgehen hier zu beschreiben. Über die Installation der Toolchain hatte ich bereits geschrieben. Ziel ist es nun, mit Hilfe des vorbezeichneten OS die LEDs auf dem Board zum Blinken zu bringen.

  • Voraussetzung ist nun, dass ihr die Toolchain und das Basisprojekt funktioniert. Im Staccato:
    • Im CubeMX ein Projekt für das STM32F4 discovery erzeugen
    • --->Achte darauf, dass in der NVIC-Konfiguration 4bin für Preemption-Priorität und 0 Bits für die Subpriorität eingestellt sind<--
    • PINs der LEDs (PD12 - PD15) auf Output Mode PushPull umstellen
    • Code erzeugen und Eclipse C-Projekt im gleichen Verzeichnis erstellen
    • Include-Verzeichnisse hinzufügen
      • ${ProjDirPath}/Drivers/CMSIS/Device/ST/STM32F4xx/Include
      • ${ProjDirPath}/Drivers/CMSIS/Include
      • ${ProjDirPath}/Drivers/STM32F4xx_HAL_Driver/Inc
      • ${ProjDirPath}/Inc
    • Symbole definieren
      • Name="USE_HAL_DRIVER", Value leer lassen
      • Name= "STM32F407xx", Value leer lassen
    • Unnötige Header-Files in Drivers\CMSIS\Device\ST\STM32F4xx\Include ausschließen
    • Datei Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f407xx.s umbenennen
    • Target Processor M4; softfp
    • Linker-File einbinden
    • Debugger-Option: -f board/stm32f4discovery.cfg
  • FreeRTOS-Installation
    • Lade Dir nun die FreeRTOS-Distribution herunter (http://www.freertos.org/) und entpacke es in ein Unterverzeichnis Deiner Repository-Verzeichnisses (bei mir c:\stm32ws\repository).
    • Benenne das "Source"-Verzeichis von FreeRTOS in "FreeRTOS" um und ziehe es bei gedrückter rechter Maustaste ins Projekt hinein --> "Link to Files and Folders", "WORKSPACE_LOC".
    • Lösche aus dem Source/Portable-Verzeichnis alle unnötigen Toolchains (!=GCC && !=MemMang) und Prozessortypen (!=ARM_CM4F) raus.
    • Besorge Dir aus der veralteten FreeRTOS-Distribution aus der CubeMX-Firmware (C:\stm32ws\repository\STM32Cube_FW_F4_V1.1.0\Middlewares\Third_Party\FreeRTOS\Source) das Verzeichnis CMSIS_RTOS und kopiere dieses in das FreeRTOS-Verzeicnis Deines Projektes. Verlinke das Verzeichnis nicht, weil wir da gleich eine Datei anpassen.
    • Passe die darin befindliche Datei cmsis_os.c  in der Funktion "osStatus osThreadIsSuspended(osThreadId thread_id)" in Zeile 1098 an :  if (xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED)...
    • Besorge Dir aus einem FreeRTOS-Demoprojekt der STM32-Firmware (Bsp: C:\stm32ws\repository\STM32Cube_FW_F4_V1.1.0\Projects\STM32F429I-Discovery\Applications\FreeRTOS\FreeRTOS_ThreadCreation\Inc) eine FreeRTOSConfig.h Datei und packe diese in den Inc-Ordner Deines Projektes.
    • Füge das darin befindlich Include Verzeichnis "C:\stm32ws\repository\FreeRTOS\FreeRTOS\include" wie zuvor beschrieben allen Configurations und allen Languages hinzu. Füge außerdem das Verzeichnis "C:\stm32ws\repository\FreeRTOS\FreeRTOS\portable/GCC/ARM_CM4F" hinzu
  • Füge das Board Support Package (BSP) für das STM32F4-Discovery Deinem Projekt hinzu.
    • Ziehe dazu den Ordner "C:\stm32ws\repository\STM32Cube_FW_F4_V1.1.0\Drivers\BSP\STM32F4-Discovery" mit rechter Maustaste in den Ordner "Drivers" Deines Projektes und mache einen Link über "WORKSPACE_LOC". 
    • Füge das darin befindlich Include Verzeichnis "C:\stm32ws\repository\STM32Cube_FW_F4_V1.1.0\Drivers\BSP\STM32F4-Discovery" wie zuvor beschrieben allen Configurations und allen Languages hinzu.
  • Führe ein Exclude from Project der Datei Drivers/CMSIS/RTOS/cmsis_os.h durch. Hierbei handelt es sich nur um ein rudimentäres Template, welches für unsere Zwecke unbrauchbar ist. Jene Datei, die aus diesem Template speziell für FreeRTOS entstehen muss, haben wir und weiter oben schon mit dem Verzeichnis "CMSIS_RTOS" ins Projekt geholt.
Die Vorbereitungen sind damit abgeschlossen. Hoffentlich habe ich bei der Doku keinen Schritt vergessen. Zur Sicherheit gebe ich Euch noch ein Foto der Includes und meiner Projektstruktur.



  • Die main.c Datei muss jetzt mit passenden Tasks und Initialisierungsaufrufen befüllt werden. Von großer Wichtigkeit ist an dieser Stelle jedoch der Aufruf des FreeRTOS-Schedulers nach jeder Millisekunde. Ich empfand es als geschickt, diesen n der Callback-Funktion des SysTick-Timers aufzurufen. Die Funktion xPortSysTickHandler() muss zunächst als "extern" deklariert werden und kann dann aufgerufen werden:
void HAL_SYSTICK_Callback(void){
    xPortSysTickHandler();
}
Das gesamte Projekt findet Ihr auf https://code.google.com/p/stm32tutor/source/browse/#svn%2Ftrunk%2Frtostest%2FSrc

Keine Kommentare:

Kommentar veröffentlichen