1、在ucos-ii中,有这么几张表来管理任务。

A、OSTCBPrioTbl[],其结构为OS_TCB指针的数组,其元素个数为64, 每一个元素对应一个任务的优先级,ucos-ii最多可以有64个任务,所以当有任务建立的时候,其每一个元素均指向一个任务控制块(若相应的优先级,已经建立了任务的话);若相应的优先级没有建立任务,则该数组元素指向的是(OS_TCB *)0;

B、任务控制块链表,该链表的每个节点,都是OS_TCB型结构。任务控制块链表除了本身构成一个双向链表, 其还与OSTCBPrioTbl[](OSTCBPrioTbl[]存放的就是任务控制块的首地址)和任务堆栈相联系(通过OS_TCB结构的OSTCBStkPtr元素指向任务堆栈的栈顶来实现)。在新建一个任务的时候,都必须新建任务控制块置于任务控制块链表中,通过OSTCBList来实现将其放于任务控制块链表的开头即新建的任务控制块。

C、任务就绪表,为9个字节,(OSRdyGrp和OSRdyTbl[8]).

OSRdyGrp存放的优先级分组的号。若其中的有一位置1, 表明其有任务处于就绪状态,若为0表示没有任务处于就绪状态。假设OSRdyGrp的第i位为1, 则表示处于任务优先级(i-1)*8~i*8-1中,至少有一个任务的处于就绪态(其中i属于(1~8))。

OSRdyTbl[8]的每个元素为8位,每一位代表一个任务优先级。这样8*8刚好为64,所以刚好可以存放完ucos-ii的最大任务总数。在该数组中,根据每位的值为0/1来决定其对应优先级的任务是否处于就绪态。为0表示该优先级任务不处于就绪状态,为1表示处于就绪态。同时当OSRdyTbl[]有一位为1时,该位代表的优先级将OSRdyGrp中对应的为置1。

由于ucos-ii为实时系统,为了尽量缩短查找表所用的时间,其还定义了两个常数数组,一个为OSMapTbl[8]和OSUnMapTbl[256]。(我个人认为这两个数组的设计最为巧妙和最有价值),通过这两张表很方便的就可以查询是否有任务处于就绪态,处于就绪态的最高优先级是多少。并且将一个任务置于就绪状态或者进行任务的调度都需要利用这两个常数数组。

OSMapTbl[]表如图1所示:

OSUnMapTbl[]表如图2所示:

D、空任务控制块链表,用来管理空任务控制块。当新建任务时,需要从该链表获取一个OS_TCB, 并将其放于任务控制块链表中。在这过程中主要是通过两个OS_TCB指针来完成,一个是OSTCBFreelist,另一个是OSTCBList,这两个指针始终指向链表的开头。

2、任务的创建过程

通过函数OSTaskCreate()或者OSTaskCreateEXT()两个函数来创建一个任务。

A、能否创建成功取决于这么几个条件:

a) 分配给即将要创建任务的优先级是否合法,prio<63(或者为自己修改的最大任务数);

b) 分配给将要创建任务的优先级是否已经被已存任务所占用,若没有被占用,则将OSTCBPrioTbl[prio]赋值1,来占用该优先级;

c) 是否有足够的RAM来分配给任务,作为任务的私有堆栈;

d) 是否有空余的OS_TCB分配给任务,作为该任务的任务控制块;

B、任务创建完后,上面所提到的有关任务控制块的几张表的更新。

a) OSTCBPrioTbl[]表:将新创建任务的任务控制块首地址存放在相应任务优先级元素中(即OSTCBPrioTbl[prio]中)。

b) 任务控制块链表:将OSTCBList指针更新指向新建的任务控制块,另外通过OS_TCB结构中的OSTCBNext和OSTCBPrev成员,将新建任务的OS_TCB置于双向链表中。

c) 任务就绪表的更新:新建任务建完后为就绪状态,因此应该将任务优先级在任务就绪表中相应的位置1, 其实现方式通过以下两条指令实现:OSRdyGrp |=OSMapTbl[prio>>3];

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

d) 空任务控制块链表:因为新建任务必须从空任务控制块中取出,所以在取完空OS_TCB需后,要修改OSTCBFreeList指针,将其指向下一个空OS_TCB。

C) 任务新建完后,与任务相关参数的设置。

任务的OS_TCB 存放在OSTCBPrioTbl[prio]中,任务的私有堆栈信息(栈顶指针、栈底指针和堆栈大小)存放在任务的OS_TCB中。任务函数的首地址存放在任务的堆栈中。

3、任务调度

A) 任务调度发生的时间

a)系统刚启动,完成初始化和至少建立了一个任务后,通过OSStart()函数调用__OSStartHighRdy函数将OSRunning=TRUE后,通过任务切换函数OSCtxSw来启动。

b) 系统运行过程中,新建任务的时需要启动任务调度器OSSched(),进行任务调度。

c) 任务被挂起或者等待延时或者等待其他时间发生时,需要进行任务调度。

d) 任务在运行过程中,有更高优先级任务处于就绪状态时,需要进行任务的调度(通过定时器中断服务程序,查询和更新所有任务状态时发现其是否有更高优先级任务处于就绪态)。

e) 中断服务程序运行过程中(ISR中需要使用任务)或者运行完之后需要进行任务的调度。

B) 怎样找到任务并运行

第一步:通过任务调度器或其他的方式,获得任务中的最高优先级prio;

第二步:通过prio在OSTCBPrioTbl[]中查找与prio相应的任务控制块,因为OSTCBPrioTbl[prio]中存放的就是与prio对应的OS_TCB,所以很容易就知道找到该OS_TCB。

第三步:获得任务的OS_TCB后,通过任务控制块中存放的有关堆栈信息来找到任务的私有堆栈。在堆栈中,将任务私有堆栈存放的有关处理器寄存器的内容恢复,则开始运行该任务。

在这过程中,有几个地方要记住:

1) 运行任务前,应该将其优先级在任务就绪表中相应的为清零;

2) 必须保存前一任务的信息;

ucos-ii的任务调度机制的更多相关文章

  1. DE1-SOC开发板上搭建NIOS II处理器运行UCOS II

    DE1-SOC开发板上搭建NIOS II处理器运行UCOS II   今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...

  2. ucos ii 46个系统API函数解析

    源: ucos ii 46个系统API函数解析

  3. FreeRTOS 和uCOS II的简单比较

    转载:http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=114 这是两种RTOS, 现在粗略比较一下. freeRTOS比uCO ...

  4. FairScheduler的任务调度机制——assignTasks(续)

    上一篇文章浅析了FairScheduler的assignTasks()方法,介绍了FairScheduler任务调度的原理.略过了最后一步通过JobScheduler获取Task时调用JobInPro ...

  5. ucos ii 百度官方介绍

          μC/OS II(Micro-Controller Operating System Two)是一个可以基于ROM运行的.可裁剪的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处 ...

  6. Spark内核-任务调度机制

    作者:十一喵先森 链接:https://juejin.im/post/5e1c414fe51d451cad4111d1 来源:掘金 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. ...

  7. FairScheduler的任务调度机制——assignTasks

    首先需要了解FairScheduler是如何在各个Pool之间分配资源,以及每个Pool如何在Job之间分配资源的.FairScheduler的分配资源发生在update()方法中,而该方法由一个线程 ...

  8. spark内核篇-任务调度机制

    在生产环境中,spark 部署方式一般都是 yarn-cluster 模式,本文针对该模式进行讲解,当然大体思路也适用于其他模式 基础概念 一个 spark 应用包含 job.stage.task 三 ...

  9. rontab踩坑(三):crontab定时任务调度机制与系统时间/时区的不一致

    解决方案: 因为我们的服务器在是肯尼亚: 我么查看一下localtime 是否和 时区一致? 可以看到是一致的. 应该是是配置改动后未重启! service crond restart

随机推荐

  1. JAVA设计模式---装饰者模式

    写在前面的话: 该模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案.装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的 ...

  2. c#写的热键注册程序

    玩网页游戏挂机,又不想让别人看见你电脑的运行.所以写了个后台运行的程序. 先谁HotKey注册类,用来调用com组件来显示与隐藏窗体: using System; using System.Colle ...

  3. python扒取百宝彩网站江西快三当日期号及开奖结果

    一.环境 windows10+python27 二.需求: 1.获取百宝彩网站中,江西快三当日的开奖期号和中奖号码: 2.根据输入期号,输出开奖号码: 三.上代码 #!/bin/env python ...

  4. Spring整合JMS(四)——事务管理

    原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFact ...

  5. 【linux之文件查看,操作】

    一.shell如何处理命令 1.shell会根据在命令中出现的空格字符,将命令划分为多个部分 2.判断第一个字段是内部命令还是外部命令 内部命令:内置于shell的命令(shell builtin) ...

  6. IOLI-crackme0x01-0x05 writeup

    上一篇开了个头, 使用Radare2并用3中方法来解决crackme0x00, 由于是第一篇, 所以解释得事无巨细, 今天就稍微加快点步伐, 分析一下另外几个crackme. 如果你忘记了crackm ...

  7. HDU [1529] || POJ [P1275] Cashier Employment

    经典的差分约束+二分答案. 本题的难点在于如何建图. 设x[i] 表示第i个小时可以开始工作的有多少个人. num[i] 表示第i个小时最少需雇佣多少人. s[i] 表示1...i小时实际开始工作的有 ...

  8. 自动化测试(二) 单元测试junit的Test注解突然不能使用原因以及解决方案

    做为一名刚接触自动化测试的人,才知道单元测试原来也挺有讲究的. 我塞,Test注解报错,没有道理啊~之前好好的,怎么会出现这样~ 原因如下,本人新建了个Test类,报错重名, 难怪提示Test不是注解 ...

  9. Google Chrome 圆形进度条

    Conmajia © 2012 Updated on Feb. 21, 2018 Google Chrome 的圆形进度条. Demo 功能 显示百分比(0-100).如果进度值达到 100%,则将闪 ...

  10. 面向对象编程总结--Python

    万物皆为对象.自然环境赋予人类无尽的遐想,而面向对象编程之思想就是来自于大自然.自然界,类和对象比比皆是,比如:鸟类和麻雀,鱼和鲤鱼......其中鸟类就是各种鸟的总称,而麻雀只不过是其中之一(对象) ...