ucos-ii核心算法分析

转载 2007年09月13日 16:46:00
μC/OS-Ⅱ是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其 内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。适合小型控制系统,具有执行效率高、占用空间小、实时性能优良和可扩展 性强等特点,最小内核可编译至2KB。μC/OS-Ⅱ为何如此高效呢?我们从它的核心算法——任务调度算法开始分析。
2.1任务调度算法分析
        操作系统的实时性主要体现在:当优先级高的任务要求工作时,操作系统要以尽快的时间将此任务调度到CPU执行。这里所花费的时间主要包括两部分:查找最高 优先级任务和任务上下文切换。其中,任务上下文切换时间是和处理器相关的,操作系统无法控制。我们主要分析uC/OS-ii如何查找最高优先级任务的。
          因为任务较少,uC/OS-II采用单一优先级,这为算法的实现提供了很大的方便在uC/OS-II中,优先级可以作为任务的标识(当然要在任务存在的情况下,是通过一个指针数组实现的)来用。
            调度算法主要基于分级查询。考虑到任务数目<64,可以用6bit来表示,分为高3位和低三位。uC/OS-II将优先级进行分组,按高三位进行 分组,可得8个(最多)优先级数组(000-111);每个优先级的在数组中的位置由其低三位表示。在源码中,高三位用带Y后缀的变量表示,而低三位用带 X后缀的变量表示。这样建立了1个变量OSRdyGrp(INT8U,8bit,每个bit代表一组)和1个数组OSRdyTbl[8](INT8U,每 组8bit,每个bit代表一个优先级)。这样形成了的二级查询,先选组,再选组内偏移。
        其中,OSRdyGrp每一bit置1,表示该组有任务就绪。(第0~7组)。其示意图见下图:

我们举一个例子,看一下如果优先级为22的任务就绪,我们如何对优先级数组进行操作。用二进制表示为0b00010110,其高3位为010,为2,则将 第2组,也就是OSRdyGrp的第2位置1。其低3位为110,为6,则将其OSRdyTbl[2]的第6位置1。编程实现时,可以通过对1进行移位, 再进行 或 操作来实现。但考虑到移位时间不确定,uC/OS-II选择建立了一个表OSMapTbl[8],如下。
表 T3.1 OSMapTbl[]的值

Index        Bit Mask (Binary)
0        00000001
1        00000010
2        00000100
3        00001000
4        00010000
5        00100000
6        01000000
7        10000000
这样,当一个任务就绪时,我们这样处理。其中Prio是任务的优先级。
程序清单 L3.5 使任务进入就绪态
OSRdyGrp            |= OSMapTbl[prio >> 3];
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
而当任务被挂起或删除时,我们这样处理:
程序清单 L3.6 从就绪表中删除一个任务
if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)
    OSRdyGrp &= ~OSMapTbl[prio >> 3];
表建立了,如何查询最高优先级呢?这是很关键的。因为优先级的值越小,优先级越高,我们只需从OSRdyGrp中找到最低位置1的的那一组,再从该组中,查找最低位置1的位置,组合一下,就得到了最高的优先级。
同样,这可以通过一个while循环进行判断,但是,时间也是不确定的。所以,uC/OS-II又建立了一张表OSUnMapTbl,这张表有点大,其下标值范围为0x00-0xff,值域为0-7。
这样,其查询流程为:
程序清单 L3.7 找出进入就绪态的优先级最高的任务
y    = OSUnMapTbl[OSRdyGrp];
x    = OSUnMapTbl[OSRdyTbl[y]];
prio = (y << 3) + x;

2.2事件处理算法分析
在uC/OS-II中,事件可以是信号量、邮箱或者消息队列等,并用统一的结构体OS_EVENT表示。
我们先看一下OS_EVENT的组成:
typedef struct {
INT8U           OSEventType;                 
INT8U    OSEventGrp;                    
INT16U          OSEventCnt;                    
void           *OSEventPtr;                  
INT8U    OSEventTbl[OS_EVENT_TBL_SIZE];
} OS_EVENT;
        注意其中两个变量:OSEventGrp和OSEventTbl[],是不是觉得有点象OSRdyGrp和OSRdyTbl[]。那它们的处理算法是不是 也一样呢?你猜对了,这里关于事件的各种操作(如pend、post、timeout、wait等)的算法和任务调度算法如出一辙。当然也用到了 OSUnMapTb[]和OSMapTbl[]。只是任务就绪时(等待CPU时)插入就绪表,而当任务需要等待事件时要插入EVENT等待列表,反之亦 同。
2.3 小结
        这两个算法(1种算法)是os_core.c中最主要的算法。此算法执行时间恒定,不随任务数目的多少变化(但不能超过64个任务),保证了其实时性。这 里,顺便对uC/OS-ii的设计哲学进行臆测:那就是“以空间换时间”,也就是表格table (array)。这可以从uC/OS-II中存在众多的全局变量,如OSEventTabl[],OSRdyTbl[],OSTCBTbl[](这样避免 了动态初始化)看出,也可以从上面介绍的任务调度算法中看出(核心数据结构为数组,并建立了两张表OSUnMapTbl和OSMapTbl)。 

相关文章推荐

uCOS-II核心算法分析(μCOS-Ⅱ)

μC/OS-Ⅱ是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。适合小型控制系统,具有执行效率高、占用空...

uCOS-II的核心算法

  • 2012-08-22 15:17
  • 92KB
  • 下载

用Buddy算法来改进uCos-ii内存管理方案

1 引言       内存管理是操作系统的中心任务之一,其主要任务是组织内存以容纳内核和待执行程序,跟踪当前内存的使用情况,在需要时为进程分配内存,使用完毕后释放并回收内存。目前嵌入式系统中常用的内...
  • gqb666
  • gqb666
  • 2013-11-29 09:35
  • 3499

ucos-ii系统分析一

操作系统最原始的功能在于对上层应用提供统一的硬件资源管理,这里的硬件资源包括CPU、内存、存储(文件系统)、外设(驱动管理)等等。 理解linux内核,代码庞大,功能复杂,可以通过ucos系统来窥探...

嵌入式实时操作系统ucos ii的分析

嵌入式实时操作系统ucos ii的分析2010年01月06日 星期三 上午 01:15摘要:近年来,在单片机系统中嵌入操作系统已经成为人们越来越关心的一个话题。本文通过对一种源码公开的嵌入式实时操作系...

嵌入式实时操作系统ucos ii的分析

摘要:近年来,在单片机系统中嵌入操作系统已经成为人们越来越关心的一个话题。本文通过对一种源码公开的嵌入式实时操作系统ucos ii的分析,以51系列单片机为例,阐述了在单片机中使用该嵌入式操作系统的优...

ucos-ii分析(1)

ucos-II虽然是一个小微的操作系统,但是基本上包含了操作系统的机制和管理原理,分析它可以有助于我们对操作系统的理解和应用,有助于我们开发产品。 我对分析整体的划分,分成如下几个部分: 1. 任...

ucos ii的事件标志组原理分析

很早以前就开始学习移植USOS ii了,移植倒没什么难的,主要是要清楚自己的单片机,最好是将启动代码分析一遍,那么在移植的时候,很多概念就不会陌生了。我用的是 stm32f103ze. 移植完了之...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)