Hey Leute,
ich wollte mich mal mit RTOS auseinandersetzen und FreeRTOS für das
STM32F429i-disco Board verwenden.
Dafür habe ich mir ein Projekt in Eclipse eingerichtet, welches mir
fleißig Code ausspuckt, der auch funktioniert. Allerdings habe ich wie
im Titel beschrieben das Problem, dass mein Task nur einmal ausgeführt
wird. Im Projekt verwende ich die neusten HAL-Treiber von der ST
Homepage (FW1.5).
Ich poste hier erstmal nur den Code der main.c, wenn Bedarf an weiteren
Ausschnitten besteht, einfach Bescheid sagen :)
Bin ich nur zu doof die FreeRTOS API zu benutzen oder liegt es
vielleicht doch an etwas anderem?
Deine Fehlerbeschreibung ist doch recht oberflächlich.
Was genau passiert denn, was nicht?
Wo "hängt" das Programm?
Um deine Frage so wie sie ist zu beantworten, würde ich sagen:
Du rufst den Task einmal auf, also wird er einmal Ausgeführt. Was willst
du mehr?
Ich vermute aber deine LED blinkt nicht wie gewollt. Da würde ich den
Fehler bei vTaskDelay() suchen:
http://www.freertos.org/a00127.html
vielleicht das hier?
1
INCLUDE_vTaskDelay must be defined as 1 for this function to be available.
Hallo Leo,
hier eine bisschen genauere Beschreibung:
Der Task "vTaskCode12" soll in 0,5s Abständen die LED3 (GPIOG Pin 13)
toggeln.
Nach dem Initialisieren des Pin 13 des Port G setze ich die LED auf
HIGH, sodass sie anfängt zu leuchten. Mit dem Task wird sie nun wieder
ausgeschaltet und bleibt dann leider aus, obwohl sie ab nun im 500ms
Takt blinken sollte.
Daher ist meine Vermutung, dass der Task nur einmal ausgeführt wird. Ich
hatte überlegt, ob es vielleicht an irgendwelchen Interrupts bzw.
falschen Prioritäten des NVIC zu tun hat... Hat sich bis jetzt aber noch
nicht rausfinden lassen.
Leo B. schrieb:> INCLUDE_vTaskDelay must be defined as 1 for this function to be> available.
Leider steht genau in dieser Zeile eine 1, schön wär's gewesen :)
Hallo,
wenn du die "neue" STM HAL nimmst solltest du auch die hierfür
bereitgestellten Befehle verwenden.
Definition und erstellen des tasks über STM HAL:
W. M. schrieb:> /* We should never get here as control is now taken by the scheduler> */> while(1)> {> HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);> }
Steht zwar wahrscheinlich so im Template, aber wer weiss obs auch
stimmt. Da würde der Pin immer gesetzt und nur einige Bruchteile von us
von der Task getoggelt!
kommentiere HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); aus und
versuche es nochmals.
Un ich finde es immer spannend, wenn so ein Thread mitten drinn beendet
wird. Jetzt hat "Jeder" der mal recherchiert, gar nichts davon.
Zum anderen wird nur eingeschaltet uns sonst nix.
Mit einem JTAG/SWD kann man schon bei nutzung von FreeRTOS die laufenden
Threads und deren Status anzeigen lassen. In emBits und Keil's µVision
geht sowas sehr gut. In anderen IDE's gibt es sowas auch. Da muss man
also nicht raten oder vermuten sondern prüfen und tracen.
Um das Thema mal abzuschließen:
Ich stand gerade vor dem selben Problem. Leider sieht man vor lauter
Wrappern/StdLib/HAL/Präsidentenwahl/etc.pp. gar nicht mehr durch.
Gerade die cmsis_os.h finde ich nicht hilfreich, wenn man FreeRTOS
lernen bzw. nutzen möchte.
Lange Rede, kurzer Sinn: vTaskDelay funktioniert nur, wenn
xPortSysTickHandler aufgerufen wird.
Das wiederum passiert im SysTick_Handler, aber nur, wenn dort
USE_RTOS_SYSTICK definiert ist.
Diese Symbol kann man in Eclipse (4.6.1) unter Project -> Properties ->
C/C++ General -> Paths and Symbols -> Symbols -> Add... -> Name:
USE_RTOS_SYSTICK
definieren.
Hier ist ein Minimalbeispiel, getestet mit Eclipse, dem openSTM32-Plugin
und einem Nucleo-F446ZE:
1
#include"stm32f4xx.h"
2
#include"stm32f4xx_nucleo_144.h"
3
4
// don't forget to define USE_RTOS_SYSTICK globally!
5
// Wichitg! USE_RTOS_SYSTICK muss global definiert werden!
6
// (damit wird über osSystickHandler -> xPortSysTickHandler von freeRTOS aufgerufen)
7
8
// Wrapper von ARM/CMSIS einbinden (bindet wiederum freertos.h ein)