OSSched()函数详细介绍

一、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
    }
}

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值