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时尽量不用。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 在CubeMX中配置定时器 首先在CubeMX的"Pinout & Configuration"页面中选择一个可用的定时器,例如TIM2。 然后在"Clock Configuration"页中,启用TIM2的时钟,并配置其时钟频率。可以将TIM2的时钟频率设置为100kHz,用于实现一个10ms的定时器。 接下来,在"Configuration"页面,将TIM2配置为定时器模式,并设置其预分频器和计数器值,以实现一个10ms的定时器。例如,选择TIM2的时钟预分频器为999,计数器值为99,可以得到一个10ms的定时器。 2. 生成FreeRTOS的定时器中断 在"Project Manager"页面中,将FreeRTOS添加到项目中,并在FreeRTOSConfig.h文件中启用定时器中断。 //启用FreeRTOS的定时器中断 #define configUSE_TIMERS 1 接下来,在FreeRTOSConfig.h文件中配置定时器中断的优先级。可以选择一个较高的优先级,以确保定时器中断能够及时地被处理。 //定时器中断的优先级 #define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES - 1) 3. 实现定时器中断处理函数 在项目的main.c文件中,实现定时器中断处理函数。首先定义一个变量用于计数,每次定时器中断时将该变量加1。然后在定时器中断处理函数中,调用FreeRTOS的xTaskIncrementTick()函数,以增加FreeRTOS系统时间计数器。 //定义一个变量用于计数 volatile uint32_t ulTickCounter = 0; //定时器中断处理函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { //计数加1 ulTickCounter++; //增加FreeRTOS系统时间计数器 if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { xTaskIncrementTick(); } } 4. 启动定时器 在main函数中,调用HAL_TIM_Base_Start_IT()函数启动定时器。这将启用定时器中断,并开始计时。 int main(void) { //初始化FreeRTOS和HAL库 HAL_Init(); SystemClock_Config(); MX_FREERTOS_Init(); //启动定时器 HAL_TIM_Base_Start_IT(&htim2); //启动FreeRTOS的调度器 vTaskStartScheduler(); //永远不会到达这里 while (1) { } } 通过以上步骤,就可以在FreeRTOS中使用定时器中断了。每当定时器中断发生时,FreeRTOS系统时间计数器就会增加1,从而实现任务调度和延时等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值