UCOS学习笔记——任务2

本文深入探讨了UCOS的调度思想、任务就绪表结构、任务的优先级别查找、就绪表操作、任务的调度、创建、挂起与恢复、优先级别修改、删除与查询等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四. 任务就续表及任务调度

UCOS的调度思想:总是使优先级最高的就绪任务处于运行状态。为了保证这一点,在系统或者用户任务调用系统函数或者中断服务程序时,总是调用调度器来确定应该运行的任务。


1.任务就绪表结构

UCOS在RAM中设立了一个记录表,系统中的每个任务都在表中占有一个位置,根据该位置的状态(是0/1)来确定该任务是不是就绪状态,该表就是任务就绪表。

UCOS中用INT8U类型的OSRdyTbl[]数组充当任务就绪表,每个元素记录8个任务,用OSRdyGrp[]数组加速对就绪表的查找。


如何根据任务的优先级别查找任务在就绪表中的位置?

由于优先级别的最大值不会超过63,即二进制00111111,是一个六位的二进制数,所以可以用该六位的高三位确定在OSRdyGrp[]中的位置,低三位确定数组元素的具体位。


2. 对任务就绪表的操作

程序中可利用如下代码将优先级为prio的任务设置为就绪状态

OSRdyGrp[] | =OSMapTbl[prio>>3];

OSRdyTbl[prio>>3] | = OSMapTbl[prio&0x07];

使优先级为prio的任务脱离就绪状态的代码。

如何获取优先级别最高的就绪任务?


3. 任务的调度

任务切换由任务调度器完成,主要完成两个工作:查找具有最高优先级别的就绪任务,实现任务切换。

UCOS有两种调度器:任务级调度器OSSched(),中断级调度器OSInitExt()。

任务切换分两步:第一步获得待运行任务的TCB指针,第二步进行断点数据的切换。

通过调用函数OSSchedlocked()和函数OSSchedUnlocked()给调度器上锁和解锁。变量OSLockNesting记录上锁次数。

任务切换宏:OSCtxSW()


五. 任务的创建

创建任务的工作实质上是创建一个任务控制块,通过任务控制块将任务代码与任务堆栈关联起来形成一个完整的任务,并使刚创建的任务进入就绪状态,接着引发一次任务调度。

两个任务创建函数:OSTaskCreate(),OSTaskCreateExt().

一般在OSStart()之前创建一个任务并赋予其最高优先级,UCOS允许任务在运行过程中创建任务,不允许在中断服务程序中创建任务。


六. 任务的挂起与恢复

1. 任务挂起

函数原型:INT8U OSTaskSuspend(INT8U prio);

 

2.恢复任务

函数原型:INT8U OSTaskResumed(INT8U prio);



七. 其他任务管理函数


1. 任务优先级别的修改:INT8U OSTaskChangePrio(INT8U OldPrio, INT8U NewPrio);


2.任务的删除:

具体过程:这里的任务删除就是将任务置于睡眠状态。具体做法是将被删除任务的任务控制块从任务控制块链表中删除,并将其归还给空任务控制块链表,然后在任务就绪表中将该任务标志位置为0,于是,该任务就不能被任务调度器使用了。

函数原型:OSTaskDel();


如何删除占有动态分配的内存和信号量等相关资源的任务?

方法:提出删除任务请求的任务只负责提出删除任务请求,而删除工作则由被删除任务自己完成。

利用被删除任务的任务快成员OSTCBDelReq作为请求删除方和被删除方的联络信号。同时提供一个双方都能调用的函数OSTaskDelReq(),通过该函数访问OSTCBDelReq,根据该信号状态决定各自行为。

函数原型:INT8U OSTaskDelReq(INT8U prio);


被删除方调用OSTaskDelReq()时通过检查TCB中OSTCBDelReq的值是否为OS_TASK_DEL_REQ来决定释放资源。



3. 任务查询

函数原型:INT8U OSTaskQuery(INT8U prio,OS_TCB *pdata);


八. UCOS的初始化和任务的启动


1. UCOS的初始化

通过OSInit()函数进行初始化,具体过程是对所有全局变量和数据结构进行初始化,创建空闲任务,并按系统选择创建统计任务。





2. UCOS的初始化


调用OSStart()后,进入多任务管理阶段。




OSStartHighRdy()在OSStart()中被调用,具体功能:设置系统运行状态标志位OSRunning = true,将就绪表中最高优先级任务的栈指针加载到SP中,并强制中断返回。这样,就绪的最高优先级任务就如同从中断里返回到运行态时一样,使得整个系统得以运转。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值