FreeRTOS使用教程(配合CubeMX)
一、CubeMX配置
- 在选择后单片机芯片后,在Middleware中选择FREERTOS的CMSIS_V1版本即可在工程开启FreeRTOS。
关于FreeRTOS的具体配置一般集中在Kernel Setting中。具体参数一般可以默认,有特殊需求可以去进行一些调整。
默认TICK_RATE_HZ为1000,表示FreeRTOS的系统时钟节拍为1000Hz(1ms)
可以理解为系统心跳,后面使用到的osDelay等函数的时间参数的单位就是1ms
-
之后就可以在Tasks and Queneus中Task中点击Add添加任务。
- Priority: 优先级根据需要更改
- Stack Size: 任务栈大小一般128Words就够用
- Entry Function:入口函数名称
- Code Generation Option:
- Default:生成在freertos.c中
- As external:只在freertos.c进行了extern函数声明
- 创建好任务后,此时选择生成会报一个Warning,大意是HAL库使用的是systick作为时钟源,现在使用了rtos,不建议hal库和rtos一起使用systick作为时钟源。
因此这里可以开启一个定时器TIM6作为HAL库的时钟源,rtos继续使用systick作为时钟源。
System Core中的SYS配置的是HAL库的时钟源
二、任务代码的编写
一个任务的标准写法:
/* USER CODE END Header_Task_10ms */
void Task_10ms(void *argument)
{/* USER CODE BEGIN Task_10ms *//* Infinite loop */for(;;){//10msosDelay(10);}/* USER CODE END Task_10ms */
}
注意:for(;;)里osDelay()不可缺少,比如这里osDelay(10)表示10ms(具体来说应该是10个tick后,取决于前面freertos的配置)后重新再来执行此任务
Tips:osDelay()这种延时是不精确的,因此就有vTaskDelayUntil()函数,此函数可以实现任务每次运行一个具体时间。