一、OSSched()函数的作用
OSSched()
函数是μC/OS-II中进行任务切换的关键函数。它的主要作用是检查当前系统中是否有更高优先级的任务就绪运行,如果有,则执行任务切换,将CPU控制权转交给该任务。
二、OSSched()函数使用的三个先决条件
中断嵌套层数 (OSIntNesting) 为 0:
OSIntNesting 是一个全局变量,用来记录中断嵌套的层数。当系统处理中断时,这个变量的值会增加。当中断处理结束后,这个值会减少。如果 OSIntNesting 等于0,意味着当前系统中所有的中断服务程序(ISR)都已经执行完毕,系统不再处于处理中断的状态,允许任务调度。
任务调度加锁层数 (OSLockNesting) 为 0:
OSLockNesting 是另一个全局变量,记录任务调度的加锁层数。当调用 OSSchedLock() 函数时,这个变量的值会增加,表示任务调度被锁住,即调度被临时禁止。相应地,当调用 OSSchedUnlock() 函数时,这个变量的值会减少,表示解锁调度。如果 OSLockNesting 为0,说明任务调度没有被锁住,系统可以执行任务调度。
就绪表中找到的最高优先级任务的优先级高于当前任务的优先级:
μC/OS-II 使用就绪表(Ready List)来跟踪所有处于就绪状态的任务,并维护一个任务优先级的队列。如果就绪表中存在一个优先级高于当前正在运行任务的任务,并且满足前两个条件,那么就应该触发任务调度,将CPU控制权切换给该高优先级任务。
三、代码示例
#include "ucos_ii.h"
#define TASK_STK_SIZE 512
#define TASK_START_PRIO 10
OS_STK TaskStartStk[TASK_STK_SIZE];
void TaskStart(void *p_arg);
int main(void) {
OSInit();
// 创建任务
OSTaskCreate(TaskStart,
(void *)0,
&TaskStartStk[TASK_STK_SIZE - 1],
TASK_START_PRIO);
OSStart(); // 启动多任务
return 0;
}
void TaskStart(void *p_arg) {
while (1) {
OSSched(); // 调用OSSched(),检查并切换到更高优先级任务
OSTimeDly(1); // 延迟一段时间,让出CPU
}
}