Hallo zusammen, ich programmiere schon länger mit den STM32 uC's und immer nur ohne HAL. Nun möchte ich mich aber näher mit dem FreeRTOS beschäftigen und wollte mal nachfragen worauf man als FreeRTOS-Anfänger so achten sollte ? Ich habe mir mithilfe von CubeMX ein TRUEStudio-Projekt mit FreeRTOS für einen stm32L4 erstellen lassen. Da mir CubeMX die Warnung gegeben hat als Timebas nicht SysTick zu nehmen habe ich TIM16 ausgewählt. Nun habe ich mich die letzten paar Stunden mit dem generieten Code beschäftigt und mir stellt sich eine Frage: Wenn ich es richtig verstanden habe benötigt FreeRTOS einen "Tick", der mithilfe von der Funktion "osSystickHandler" generiert wird. Ich habe nun nach der ISR des TIM16 gesucht, konnte sie aber nicht finden. Wird diese nicht automatisch mit generiert und ich muss sie noch selber anlegen oder bin ich einfach "zu blöd" zum suchen ? (habe mir dann auch noch ein Projekt mit SysTick als Timebase generiert und die ISR "SysTick_Handler" ist auch nirgends zu finden) Ich könnte also jetzt jeden beliebiegen Timer Initialisierenund die Funktion "osSystickHandler" in die ISR hängen und es wäre ok ? (Natürlich muss der Timer in der konfigurierten Geschwindigkeit des FreeRTOS laufen) Gruß Dominik
Es gibt ein define für den SysTick_Handler ->
1 | /* IMPORTANT: This define is commented when used with STM32Cube firmware, when the timebase source is SysTick,
|
2 | to prevent overwriting SysTick_Handler defined within STM32Cube HAL */
|
3 | #define xPortSysTickHandler SysTick_Handler
|
Und jene Funktion wird dann in "port.c" angelegt.
1 | void xPortSysTickHandler( void ) |
2 | {
|
3 | /* The SysTick runs at the lowest interrupt priority, so when this interrupt
|
4 | executes all interrupts must be unmasked. There is therefore no need to
|
5 | save and then restore the interrupt mask value as its value is already
|
6 | known. */
|
7 | portDISABLE_INTERRUPTS(); |
8 | {
|
9 | /* Increment the RTOS tick. */
|
10 | if( xTaskIncrementTick() != pdFALSE ) |
11 | {
|
12 | /* A context switch is required. Context switching is performed in
|
13 | the PendSV interrupt. Pend the PendSV interrupt. */
|
14 | portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; |
15 | }
|
16 | }
|
17 | portENABLE_INTERRUPTS(); |
18 | }
|
Vincent H. schrieb: > Es gibt ein define für den SysTick_Handler -> > [viel Blabla] Wieso schreibst Du so belangloses Zeug und antwortest nicht auf seine Frage? @ Lies mal die Doku, da steht einiges Brauchbares drin, z.B.: "Setting HAL timebase sourceBy default, the STM32Cube HAL is built around a unique timebase source, the Arm® Cortex® system timer (SysTick).However, HAL-timebase related functions are defined as weak so that they can be overloaded to use another hardware timebase source. This is strongly recommended when the application uses an RTOS, since this middleware has full control on the SysTick configuration (tick and priority) and most RTOSs force the SysTick priority to be the lowest.Using the SysTick remains acceptable if the application respects the HAL programming model, that is, does not perform any call to HAL timebase services within an Interrupt Service Request context (no dead lock issue).To change the HAL timebase source, go to the SYS peripheral in the Component list panel and select a clock among the available sources: SysTick, TIM1, TIM2,... (see Figure76)." Allerdings frage ich mich, wieso Du, wenn Du bisher ohne HAL ausgekommen bist, jetzt damit anfängst. Nimm das nackte FreeRTOS, dann kannst Du auch mit dem Systick arbeiten und musst keine Seiteneffekte beachten.
John Doe schrieb: > Wieso schreibst Du so belangloses Zeug und antwortest nicht auf seine > Frage? Wieso belanglos? Er fragt wo die SysTick_Handler geblieben is. Und ich zeig ihm wo sie denn zu finden ist... Der Handler ist eben nicht mehr unter dem klassichen Namen zu finden weil man dafür ein #define angelegt hat. Das Zeug wird so direkt von CubeMX generiert.
Lass die HAL einfach wieder außen vor und es wird auch der systickhandler gehen mit FreeRTOS. Läuft bei mir ja auch ohne HAL, aber einen CMSIS Header brauchst du. Ein OS braucht eine Zeitbasis um die Tasks schedulen zu können. Das muss irgendein zyklischer Interrupt sein der den Task unterbricht damit der kernel im IRQ Space gucken kann ob ein neuer Task mit höherer Prio bereit ist oder ob er Round Robin machen muss bei Tasks gleicher Prio. Also geh auf die FreeRTOS Webseite, lad dir den passenden Port runter. Dann richte den systick im Armkern ein auf iwas zwischen 1-50ms. Melde den OS systick handler am NVIC an sowie den pendsv. Dann läufts eigentlich schon, auf deren Webseite gibts auch ne gute Anleitung.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.