ucos-ii核心算法分析

第一章 嵌入式实时操作系统的基本概念 第一章        嵌入式实时操作系统的基本概念 操作系统是系统软件,在计算机硬件与计算机应用程序之间提供应用程序接口(API),提高应用程序的效率。 嵌入式系统是计算机系统,需要操作系统的支持,此操作系统为嵌入式操作系统。 1.1    嵌入式实时操作系统的基本概念 1.1.1         什么是计算机操作系统 1.      计算机的构成:中央微处理器(CPU)、存储器、接口及 阅读详情
μ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源码下载及源码目录结构   攻克RTOS之旅,扬帆起航!   RTOS有众多种,个人感觉,用得最火的是FreeRTOS,因为它即使用于商业途径,也是开源免费的;其次是就是uCOS-II和uCOS-III。uCOS-II用于商业途径是需要付费的,但是对于学习研究却是免费的。它们同是嵌入式实时操作系统,很多东西都是共通的,熟悉其一,其它都非难题了。   RTOS的学习,我选择的是uCOS-II。学习该操作系统的流程,主要... 阅读详情

相关推荐

ucos ii浅尝

前言 有人说:“好代码要看,坏代码也要看”。由于工作过程中看多了凌乱的代码,特找来UCOS来看,一看果真是有美感的代码。关于嵌入式实时系统,起初发明嵌入式实时操作系统的发展进程我猜想应该是这样的:裸机编程时发现太多的“延时”资源没有被利用好,那么“延时”又完全可以用定时器中断来计时,在计时未到之前,则完全可以运行接下来的函数。再加上一些对任务是否需要执行的标志位的判断,对各个任务的轮询执行,这样

yeah 1152

ucos-ii内核概述

一.临界段 处理器处理临界代码都必须先关中断,再处理临界代码,然后再开中断。关中断时间对实时系统的实时响应很重要。所以是实时系统的一个很重要的指标。uCOS使用两个宏(在OS_CPU.h中定义。注:没个CPU都有自己的OS_CPU.h)。这两个宏分别为OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()关闭中断和打开中断。   注意:在ODTimeDel()之类的函数

OSKernelLAB(gatieme) 1万+

UCOS-II 中断与时钟问题总结(以UCOS2.25自带的X86例子)

这两天在看UCOS-II, uCOS中断和时钟问题做个小结,以UCOS2.25自带的X86例子、《嵌入式实时操作系统uCOS-II原理及应用》为基础,相信对网友们也有帮助,理解不对的地方,请高手指正:       UCOS-II是抢占式、实时操作系统,这是核心。   1.   uCOS的系统有任务级任务调度和中断级任务调度:任务级任务调度靠常常在下面的代码中自动调用, void main

5988

uCOS-II 基础入门教程(三)

任务优先级 每个任务都有其优先级。任务越重要,赋予的优先级应越高。 静态优先级 应用程序执行过程中诸任务优先级不变,则称之为静态优先级。  动态优先级 应用程序执行过程中,任务的优先级是可变的,则称之为动态优先级。实时内核应当避免出现优先级反转问题。  优先级反转 如图,任务1优先级高于任务2,任务2优先级高于任务3。任务1和任务2处于挂起状态,等待某一事件的发生,任务3正在运行如。...

weixin_42019584的博客 4641

RTOS之UCOS(七)---UCOS系统移植

经过前一篇文章固件库的移植,我们的处理器就能完成从上电复位到进入main函数的过程,在main函数中初始化我们要用到的外设,并完成外设的中断处理函数。如果我们需要处理器完成的任务比较单一,可以不使用操作系统,比如BLE协议栈应用开发就是用了状态机模型,但如果需要处理器完成的任务比较多,为了便于管理可以引入轻巧的实时操作系统,下面以UCOS-II为例介绍下实时操作系统的移植。 1. UCOS的底层支...

流云 3437

【嵌入式开发】uCOS-II

在深入探索uCOS-II之前,我们首先需要构建坚实的实时操作系统(RTOS)基础知识。理解RTOS的本质、它与通用操作系统的区别、以及它在嵌入式系统中的核心作用,是掌握任何特定RTOS(如uCOS-II)的基石实时操作系统(Real-Time Operating System,简称RTOS)是一种特殊类型的操作系统,其核心目标是在严格的时间约束下执行任务,并保证任务响应的确定性和可预测性。与我们日常使用的通用操作系统(如Windows、Linux、macOS)不同,RTOS更侧重于对时间事件的精确控制,而非

宅男很神经 1457

ucos-ii核心算法分析(转)

μC/OS-Ⅱ是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其 内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。适合小型控制系统,具有执行效率高、占用空间小、实时性能优良和可扩展 性强等特点,最小内核可编译至2KB。μC/OS-Ⅱ为何如此高效呢?我们从它的核心算法——任务调度算法开始分析。 2.1任务调度算法分析 操作系统的实时...

weixin_30593261的博客 114

深入理解ucOS_II源代码:嵌入式操作系统设计与实践

本文还有配套的精品资源,点击获取 简介:本资源提供了μC/OS-II源代码,作为广泛使用的开源实时操作系统(RTOS),适合嵌入式系统开发新手学习操作系统设计原理。通过分析ucOS_II的源码,可以掌握多任务调度、抢占式调度、时间管理、信号量、互斥量、消息队列、内存管理、任务创建与删除、中断服务和API接口等核心概念,提升嵌入式开发技能和实践经验。 1. μC/O...

weixin_35578748的博客 1494

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

μC/OS-Ⅱ是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。适合小型控制系统,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB。μC/OS-Ⅱ为何如此高效呢?我们从它的核心算法——任务调度算法开始分析。 2.1任务调度算法分析    操作系统的实时性主要体现在:

1117

uCOS-II操作系统移植至ARM平台

在嵌入式系统设计中,系统初始化阶段是至关重要的第一步。初始化代码通常位于系统启动后执行的第一批代码中,它的主要任务是为操作系统的运行搭建一个基本的框架。初始化阶段通常包括以下几个主要任务:设置处理器运行模式,包括特权模式、用户模式等。配置系统时钟、内存管理单元(MMU)等硬件相关的参数。初始化核心外设,如串口、定时器、中断控制器等。配置和初始化操作系统内核需要的数据结构,例如任务控制块(TCB)、信号量、消息队列等。启动操作系统内核,开始任务调度。

weixin_35982453的博客 853

ucosII全套资料.rar

ucosII全套资料.rar

uCOS-II系统概述

1. 关于RTOS系统 UCOS系统属于RTOS操作系统,FreeRTOS也属于RTOS操作系统。 2. 前后台系统 以前编写裸跑程序时,main里面一个循环和ISR构成一套程序,也统称为前后台系统,前台程序就是ISR中断服务程序,后台程序就是main函数里面的程序,后台程序可以被前台程序打断。 3. 实时性 UCOS系统属于实时操作系统,实时分为硬实时和软实时,...

fengel_cs的专栏 1990

UCOSII学习资料

μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。

ucOS-II_RMS_EDF_sharedResources:基于μcOS-II实时操作系统源码实现RMS和EDF调度(考虑共享资源)

ucOS-II_RMS_EDF_shared资源 基于μcOS-II实时操作系统源码实现RMS和EDF调度(考虑共享资源) 博文链接: :

UCOSII资料.rar

ucosII全套学习资料,包含源码、在stm32上的移植、邵贝贝中文书、任哲--嵌入式操作系统原理及应用以及其他学习文档等全套学习资料。嵌入式系统学习的最佳选择。

UCOS 时间片轮转调度算法详解

我修改的 UCOS 支持不同优先级调度的同时,支持同一个优先级有 2 个以上的任务以时间片轮转方式进行调度

上一篇: Linux学习笔记
下一篇: Cygwin的使用方法
menuconfig
博客等级 码龄19年 713粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值