1、FreeRTOS:
(1)调度策略使用了抢占式调度和时间片调度的结合,不同级别间的任务抢占式调度,同级别任务采用时间片调度。采用了动态内存申请。
![]()
![]()
(2)任务优先级:数字越高,任务优先级越高。STM32中最大为32-1
![]()
(3)时间片的长度,依据滴答定时器的设定。滴答定时器为最高优先级

(4)任务切换:高优先级会延时释放CPU控制权
电机控制任务balance:100Hz频率运行,优先级为4(vTaskDelayUntil()函数)
OLED显示任务show: 1Hz频率运行,优先级为3(vTaskDelayUntil()函数)
消息帧任务modbus:优先级为0,没有更高优先级任务抢占时会一直运行
(但这样相当于一直占用空闲CPU的资源,设置为更高优先级可能会更好)
vTaskDelayUntil()函数:FreeRTOS中任务延时函数之一,让任务按照指定周期性方式运行。会使任务挂起,直至指定时间到达为止。时间为:上次此任务运行的时间+周期频率。
![]()
(5)任务堆栈:任务切换时,存储任务数据的内存区域。设置为了512
(6)滴答定时器
时间节拍频率设置为1000,周期1ms
![]()
初始化于delay_init(u8 SYSCLK)函数,SYSCLK=168

reload是滴答定时器的计数值。
reload = SYSCLK*100000/configTICK_RATE_HZ = 168*1000000/1000 = 168*1000
所以单次时间:reload/168M = 1ms
(7)开始任务start_task:用于创建其他任务
(8)临界区:相当于关中断,关闭所有优先级的中断
![]()
创建完start_task任务后退出临界区
![]()
(9)任务调度器的挂起:未关闭中断,只是停止任务的切换,不会被其他任务打断

仅仅防止了任务间的资源争夺
vTaskSuspend()、vTaskResume()挂起单个任务
(10)FreeRTOS的中断管理:
通常只能管理5~15优先级的,通过portDISABLE_INTERRUPTS(),优先级分组默认为4,

本文详细介绍了FreeRTOS的调度策略(抢占式和时间片),任务优先级设定,时间片长度,以及任务切换机制。此外,还探讨了FreeRTOS的移植步骤,包括配置文件调整和中断管理。重点强调了中断对任务调度的影响和堆栈设置的重要性。
最低0.47元/天 解锁文章
1383

被折叠的 条评论
为什么被折叠?



