FreeRTOS系统时钟和中断
RTOS系统运行必需要有时钟,FreeRTOS可以选择SysTick或TIM作为时钟源。
本文以再stm32f1上的移植介绍
选择SysTick需要在FreeRTOSConfig.h中取消SysTick_Handler()函数的映射:
//#define xPortSysTickHandler SysTick_Handler
并且需要在systick 中断服务函数中添加xPortSysTickHandler()函数:
void SysTick_Handler(void) { //HAL时钟源 HAL_IncTick(); //FreeRTOS时钟源 if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行 { xPortSysTickHandler(); } }
在使用stm32cubeMX配置FreeRTOS时,选择时钟源为SysTick会有提示警告:WARNINGS:-When FreeRTOS is used, it is strongly recommended to use a HAL timebase source other than the Systick.The HAL timebase source can be changed from the Pinout tab under SYS
换用TIM就没有警告
用SysTick会有什么问题呢?
查看xPortSysTickHandler函数原型有一段注释
意思就是SysTick以最低的中断优先级运行,因此,在执行此中断时,必须取消所有中断的屏蔽。这里讲一下FreeRTOS屏蔽中断是为了如果某些代码段不允许被中断打断RTOS中用临界区通过开关中断来实现。(临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。)
虽然我一直用SysTick没出现问题,但为了保险起见,还是选择TIM比较好。
另外hal库中的HAL_Delay延迟函数也是使用SysTick定时器,优先级最低,再使用FreeRTOS时尽量不用。
本文地址:https://blog.csdn.net/qq_33938558/article/details/107886329
推荐阅读
-
liunx系统下时钟不同步会出现问题 怎么同步Linux 的系统时钟和硬件时钟?
-
FreeRTOS系统时钟和中断
-
ESP32 开发笔记(三)源码示例 5_KEY_Short_Long 使用IO中断和系统时间来检测按键时长实现长按短按
-
liunx系统下时钟不同步会出现问题 怎么同步Linux 的系统时钟和硬件时钟?
-
8.应对系统中出现大量不可中断进程和僵尸进程(下)
-
S5PV210系列 (裸机十)之按键和CPU的中断系统(一)
-
X281x的时钟和系统控制初始化代码分析
-
ARM:FreeRTOS系统栈和任务栈
-
FreeRTOS系统时钟和中断
-
ESP32 开发笔记(三)源码示例 5_KEY_Short_Long 使用IO中断和系统时间来检测按键时长实现长按短按