Forum: Mikrocontroller und Digitale Elektronik FreeRTOS + CubeMX


von Dominik F. (Gast)


Lesenswert?

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

von Vincent H. (vinci)


Lesenswert?

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
}

von John Doe (Gast)


Lesenswert?

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.

von Vincent H. (vinci)


Lesenswert?

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.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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
Noch kein Account? Hier anmelden.