uC/OS-II任务机制理解

        半年前接触的uC/OS,看了两个月之后又因为其他的事把他放下了。现在因为项目需要又把它重拾起来。

        uC/OS----Micro Controller OS微控制器操作系统,美国人Jean Labrosse于1192年完成,1998年出现uC/OS--II,2000年NASA许可可用于飞行器中(无人机中有木有啊!但是很少有极客把他用到飞控中,APM的操作系统是一个裁剪的Linux--Nuxxt什么鬼的)。官方网站www.micrium.com.大家可以自己去注册个帐号,自行下载各个版本的源代码。

        uC/OS--II的性能特性不跟大家废话了,大家自己去看它的中文手册吧。有几点要注意理解:

        1、用户任务只有56个,因为有8个是系统保留的,这有点像Linux下的系统服务daemons。如空闲任务、统计任务都是系统保留任务。

        2、uC/OS中所有函数的调用和服务都有确定的时间,也就是说函数的执行周期确定、执行时间确定,这个由统计任务OSTaskStat()来完成。

        3、任务的优先级就是它的标识符,最低优先级 OS_LOWEST_PRIOR=63.

        下面进入主题--任务机制。

         任务控制块TCB:TCB是描述任务的核心数据结构,存放了它的各种管理信息,包括任务堆栈指针,任务的状态、优先级,任务链表指针等; 一旦务建立了,任务控制块OS_TCB将被赋值。

        typedef struct os_tcb 
       {
                     栈指针;
                     INT16U   OSTCBId;        /*任务的ID*/
                     链表指针;
                     OS_EVENT *OSTCBEventPtr; /*事件指针*/
                     void     *OSTCBMsg;     /*消息指针*/
                     INT8U    OSTCBStat;     /*任务的状态*/
                     INT8U    OSTCBPrio;     /*任务的优先级*/
                     其他……

                     }OS_TCB;

                    OSTCBStkPtr:指向当前任务栈顶的指针,每个任务可以有自己的栈,栈的容量可以是任意的;
                    OSTCBStkBottom:执行任务栈底的指针;
                    OSTCBStkSize:栈的容量,用可容纳的指针数目而不是字节数(Byte)来表示。

                    值得一提的是链表指针,这个设计可以快速的使任务就绪和休眠。所有的务控制块分属于两条不同的链表,单向的空闲链表(头指针为OSTCBFreeList)和双向的使用链表(头指针为OSTCBList); OSTCBNext、OSTCBPrev:用于将任务控制块插入到空闲链表或使用链表中。每个任务的任务控制块在任务创建的时候被链接到使用链表中,在任务删除的时候从链表中被删除。双向连接的链表使得一成员都能快速插入或删除。

                 

        任务的五个状态:休眠、就绪、运行、中断、挂起(阻塞)。

        各状态间的相互转换:

        好了,既然一共有64个任务,那我是怎么知道现在到底该运行哪个任务呢?这就是任务就绪表的工作了。多列几种就绪情况会发现,OSRdyGrp和OSRdyTbl[]的赋值与优先级priority有一定的关系哦。我们先列一个编码表叫OSMapTbl[7]=2^n.n=0.1.2...7(同理就有OSUnMapTbl[7])。可以得到这个公式说明OSRdyGrp与优先级的高三位有关、OSRdyTbl与优先级的低三位有关.通过上面公式就可以把相应的任务标志为就绪状态。既然有让他进入就绪态的方法,也就有让他解除就绪状态--休眠态的方法.

       任务的调度。前面的准备工作做好了之后,下面就可以真正的运行任务了。确定哪个务的优先级最高,应该选择哪个任务去运行,这部分的工作是由调度器(Scheduler)来完成的。任务级的调度是由函数OSSched()完成的;中断级的调度是由另一个函数OSIntExt()完成的。

      首先根据就绪表确定最高优先级。然后根据最高优先级替换当前任务的TCB,进行上下文切换。

void   OSSched(void)

{

         INT8U  y;

         OS_ENTER_CRITICAL();

         

         OS_EXIT_CRITICAL();

}

可以看到实际执行任务切换的是OS_TASK_SW()函数(也就是OSCtxSW()),我们看下任务切换的过程:


         中断级的任务切换会在接下来的中断机制中跟大家讨论。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值