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. C# Ioc ASP.NET MVC Dependency Injection

    ASP.NET MVC Dependency Injection 同志们,非常快速的Ioc注册接口和注入Mvc Controller,步骤如下: 安装Unity.Mvc NuGet Package 在 ...

  2. windows系统下安装Eclipse for PHP

    第一步: 如果机器上没有java运行环境,请先安装   第二步: 下载eclipse,下载地址: http://www.eclipse.org/downloads/ 选择对应版本,本人选择的是64位版 ...

  3. vue中如何获取后台数据

    原文链接:http://blog.csdn.net/vergilgeekopen/article/details/68954940 需要引用vue-resource 安装请参考https://gith ...

  4. python学习资料链接

    1.入门与量化:https://www.v2ex.com/t/257297

  5. php复习整理1--位运算符

    前言    子曰:"温故而知新,可以为师矣." php复习整理系列即是对已掌握的知识的温习,对久不使用的知识点进行重新学习,从而对php基础知识的掌握更加牢固.当然因为是重新温习, ...

  6. linux集群架构

    Linux集群架构   根据功能划分为两大类:高可用和负载均衡 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 实现高可用的开源软件有:heart ...

  7. Zabbix监控之迁移zabbix server

    abbix监控中有时会根据需要对zabbix服务器进行迁移,zabbix迁移是非常简单的,因为zabbix的前端所有的操作都存在zabbix数据库里.所以zabbix迁移只需对zabbix库中相应的表 ...

  8. iOS通知传值的使用

    通知 是在跳转控制器之间常用的传值代理方式,除了代理模式,通知更方便.便捷,一个简单的Demo实现通知的跳转传值. 输入所要发送的信息 ,同时将label的值通过button方法调用传递, - (IB ...

  9. 整理的linux面试运维题

    如何在非交互模式下把 /home/example/下所有.conf文件中的 192.168.0.2 改成 db01 ?   find /home/example/ -type f -name &quo ...

  10. Java基础(含思维导图)

    很早之前整理的Java基础的一些知识点,思维导图: 1.'别名现象' 对一个对象赋值另一个对象,会指向新的对象引用,赋值前的对象引用会由于不再被引用而被gc回收: 而基本类型则不同.基本类型存储了实际 ...