6. FreeRTOS任务调度

FreeRTOS任务调度

  • 架构:Cortex-M3

  • 版本:FreeRTOS V9.0.0

  • 前言:上一篇我们分析了任务的切换,其中写到了在vTaskSwitchContext里面的taskSELECT_HIGHEST_PRIORITY_TASK,计算uxTopReadyPriority 的前导零值,那么本篇尝试分析,FreeRTOS依据什么机制来操作uxTopReadyPriority 的。

1.任务创建

任务创建时,会把任务优先级的对应位置位到uxTopReadyPriority里,具体函数在prvAddTaskToReadyList

#define prvAddTaskToReadyList( pxTCB )																\
	traceMOVED_TASK_TO_READY_STATE( pxTCB );														\
	taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority );												\
	vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \
	tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )

比如我们创建第一个任务,任务优先级为1,那么在任务创建完成时,uxTopReadyPriority会被置为0x00000002。

2.SysTick异常

​ FreeRTOS中有一个系统滴答定时器,它会根据宏configTICK_RATE_HZ来设置周期中断时间,比如设置为1000,则1ms发生一次中断,在前面章节分析过,这个中断的优先级是最低的。下面具体看这个中断程序xP

### FreeRTOS任务调度原理 #### 任务状态转换 在FreeRTOS中,任务可以在运行态、就绪态、阻塞态和挂起态之间进行转换。当一个更高优先级的任务变为可执行状态时,当前正在运行的任务会被中断并保存其上下文环境,以便稍后恢复执行[^1]。 #### 就绪链表的作用 为了高效管理和快速查找处于就绪状态下的各个不同优先级的任务列表,FreeRTOS维护了一个全局的就绪链表。每当有新的任务进入就绪队列或是现有任务的状态发生变化时,该链表都会相应更新以反映最新的情况[^2]。 #### 可剥夺型与非可剥夺型内核的区别 FreeRTOS支持两种类型的内核——可剥夺型(preemptive)和不可剥夺型(non-preemptive)。对于前者而言,在任何时候只要存在更高等级的任务准备好了就可以立即抢占CPU资源;而对于后者,则只有等到当前活动中的进程主动释放处理器控制权之后才会考虑下一个待处理的工作项[^3]。 #### 调度算法细节 默认情况下采用的是基于固定优先级的抢占式调度方法,并且在同一级别内部实现了轮转法来分配时间片给各成员共享使用。“固定优先级”指的是在整个生命周期里除了因特殊原因触发外一般不会改变对象本身所设定的重要性程度【注:这里的特殊情况通常指代了所谓的‘优先级继承’机制】。这意味着一旦定义好初始条件以后就不会轻易变动除非必要情形下才允许临时调整权重大小从而影响整体排序逻辑。 ```c // 示例代码展示如何创建一个新的任务 void vCreateTask(void (*pvTaskCode)( void * ), const char *const pcName, unsigned short usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask ) { // 创建新任务的具体实现... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值