ucos-ii中文书(邵贝贝)第6章

合集下载

嵌入式实时操作系统uCOS-II_吴永忠

嵌入式实时操作系统uCOS-II_吴永忠

1.1.1.1嵌入式应用的起源
1946.2.15 ENIAC (Electronic Numerical Integrator And Computer)
长30.48米,宽1米,30个操作台重达30吨 耗电量150千瓦 造价48万美元。 它包含了17,468 真空管,7,200水晶 二极管, 1,500 中转, 70,000 电阻器, 10,000 电容器, 1500继电器,6000多个开关 每秒执行5000次加法或400次乘法,是继电器计 算机的1000倍、手工计算的20万倍。
BC NG
1.1嵌入式系统的基本概念
1.1.1 嵌入式系统的发展概况
1.1.1.1 嵌入式应用的起源 1.1.1.2 计算机技术的分化 1.1.1.3 两大分支的发展方向
1.1.2 嵌入式系统的定义 1.1.3 嵌入式系统的特点
BC NG
1.1嵌入式系统的基本概念
1.1.1 嵌入式系统的发展概况
计算机技术的分化----后PC时代
在早期,由于嵌入式应用范围比较狭窄,大多用于工业控 制领域,人们还可以勉强将通用计算机通过改装、加固、 定制专业软件等方法,嵌入到大型系统中去实现嵌入式应 用,但随着经济、技术的高速发展,嵌入式应用越来越广 泛,已经深入到我们生活中的方方面面,比如:小到彩电、 空调、洗衣机、手机,大到飞机、导弹、汽车等等,嵌入 式应用对计算机的功能、体积、功耗、价格、重量、可靠 性等方面的要求越来越苛刻,通过改造通用计算机的传统 方法远远不能胜任。 因此,嵌入式计算机不得不脱离通用计算机系统走上了独 立发展的道路。这就形成了现代计算机两大分支并行发展 的时期,也称为后PC时代。
在单片机的发展道路上,曾出现过两种探索模式,即“Σ模式”和 “创新模式”。

UCOS-II移植ARM的读书笔记

UCOS-II移植ARM的读书笔记

UCOS-II移植ARM的读书笔记导读:昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了,关键是我是第一次也是正式开始移植的学习之路啊,今天在工作之前先把昨天的笔记重新回顾一下,UCOS-II的移植需要提供2,真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。

5555。

一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。

真是够倒霉的。

今天在工作真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。

5555。

一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。

真是够倒霉的。

今天在工作之前先把昨天的笔记重新回顾一下,其实后来想想也许是件好事,可以让我今天在不借助其他的帮助的情况下自己看代码自己跟自己讲一遍,其实很多看起来是倒霉看起来是灰心的事情把我们的观点换一下那么就是一件好事。

这样的情况发生在我的身上已经挺多次了。

好啦,废话不说,开始补昨天的日记UCOS-II的移植需要提供2,3个文件分别介绍如下:一:OS_CPU.H1 与编译器有关的数据类型只是按照不同的编译器编写对应的数据类型的typedef对应于ARM7的数据类型的编写如下typedef unsigned char BOOLEAN; /* 布尔变量*/typedef unsigned char INT8U; /* 无符号8位整型变量*/typedef signed char INT8S; /* 有符号8位整型变量*/typedef unsigned short INT16U; /* 无符号16位整型变量*/typedef signed short INT16S; /* 有符号16位整型变量*/typedef unsigned int INT32U; /* 无符号32位整型变量*/typedef signed int INT32S; /* 有符号32位整型变量*/typedef float FP32; /* 单精度浮点数(32位长度)*/typedef double FP64; /* 双精度浮点数(64位长度)*/在上面定义的各种数据类型中按照ARM7的堆栈宽度选择INT32Utypedef INT32U OS_STK; /* 堆栈是32位宽度*/接下来一部分是为了兼容低版本UCOS的数据类型所编写的代码,在UCOS-II中暂不考虑2 与处理器相关的代码先定义中断的实现方式,预先设定的中断方式有三种,在ARM7中设置为方式2 #define OS_CRITICAL_METHOD 2 /* 选择开、关中断的方式*/接下来的一段是我暂时还没有完全搞懂的一部分,只知道是设定了12个软件中断的函数,当调用这些函数之前都会执行对应中断号的事情。

ucos-ii_api_参考手册.doc

ucos-ii_api_参考手册.doc

UCOS-II API 参考手册本章提供了μC/OS-Ⅱ的用户指南。

每一个用户可以调用的内核函数都按字母顺序加以说明,包括:●函数的功能描述●函数原型●函数名称及源代码●函数使用到的常量●函数参数●函数返回值●特殊说明和注意点OSInit( )Void OSInit(void);OSinit()初始化μC/OS-Ⅱ,对这个函数的调用必须在调用OSStart()函数之前,而OSStart ()函数真正开始运行多任务。

参数无返回值无注意/警告必须先于OSStart()函数的调用范例:void main (void){.OSInit(); /* 初始化 uC/OS-II */.OSStart(); /*启动多任务内核 */}μC/OS-II:实时操作系统内核OSIntEnter( )Void OSIntEnter(void);OSIntEnter()通知μC/OS-Ⅱ一个中断处理函数正在执行,这有助于μC/OS-Ⅱ掌握中断嵌套的情况。

OSIntEnter()函数通常和OSIntExit()函数联合使用。

参数无返回值无注意/警告在任务级不能调用该函数。

如果系统使用的处理器能够执行自动的独立执行读取-修改-写入的操作,那么就可以直接递增中断嵌套层数(OSIntNesting),这样可以避免调用函数所带来的额外的开销。

范例一:(Intel 80x86的实模式, 在大模式下编译,,real mode,large model)ISRx PROC FARPUSHA ; 保存中断现场PUSH ESPUSH DS;MOV AX, DGROUP ; 读入数据段MOV DS, AX;CALL FAR PTR _OSIntEnter ; 通知内核进入中断..POP DS ; 恢复中断现场POP ESPOPAIRET ; 中断返回ISRx ENDP范例二:(Intel 80x86的实模式, 在大模式下编译,, real mode , large model)参考手册ISRx PROC FARPUSHA ; 保存中断现场PUSH ESPUSH DS;MOV AX, DGROUP ; 读入数据段MOV DS, AX;INC BYTE PTR _OSIntNesting ; 通知内核进入中断...POP DS ; 恢复中断现场POP ESPOPAIRET ; 中断返回ISRx ENDPμC/OS-II:实时操作系统内核OSIntExit( )Void OSIntExit(void);OSIntExit()通知μC/OS-Ⅱ一个中断服务已执行完毕,这有助于μC/OS-Ⅱ掌握中断嵌套的情况。

chap9_rteos_ucos-ii 的移植[优质文档]

chap9_rteos_ucos-ii 的移植[优质文档]

OSStartHighRdy()
函数
*OS_CPU_A.ASM
进入多任务环境时运行优先 级最高的任务,
OSIntCt实xSw际() 上,还有一个函文数件很重*OS要_CP,U_A它.ASM就是中断I退R出Q时.I的N任C务,切换它函数定
义OST了ickI一SR(个) 汇编宏,它中是断服μ务C程/O序S-*IOISf_oCPrUA_AR.ASMM 7时通钟用节拍的中断中服断务程服序 务
在移植中另外增加了一个头文件config.h,要求所 有用户程序必须包含coInnclfuidge.sh.h,c在ongcfiog.nh fig.h中包含 includes.h和特定的头文件和配置项。而μC/OS-II的系 统文件依然只是包含includes.h,即μC/OS-II的系统文 件完全不必U改C/O动S内。核所文有件 的配置改变包括用户头程文序件的增减 均在config.h中进行,而includes.h定下来后不必改动 (μC/OS-II的系统文件需要包含的东西是固定的)。 这样,μC/OS-II的系统文件需编辑要课编件 译的次数大大减少,
后再开中断 n 用信号量禁止该函数在使用过程中
被再次调用
编辑课件
n 概述n ——移植需要编写的文件
根据μC/OS-II的要求,移植μC/OS-II到一个新的体 系结构上需要提供2个或3个文件: OS_CPU.H(C语言头文件) OS_CPU_C.C(C程序源文件) OS_CPU_A.ASM(汇编程序源文件)
n 可重入的代码指的是一段可以被多个任 务同时调用,而不必担心会破坏数据的 代码(比如:一个函数)
n 即:可重入型函数在任何时候都可以被 中断执行,过一段时间以后又可以继续 运行,而不会因为在函数中断的时候被 其他的任务重新调用,而影响函数中的 数据

第二章 ucos-ii工作原理

第二章 ucos-ii工作原理
任务的运行由操作系统调度管理。
OSTaskCreate( MyTask2,… … ); …… OSStart( ); …… } OSTaskCreate( MyTask1,… … );

2.2.1 任务的基本概念

OSInit( ) 函数原型: void OSInit( void )

OSStar( ) 函数原型: void 环境。 OSStart( void ) OSInit( ) ---- 初始化 uC/OS-II

μC/OS-II中的数据类型
备注:这些类型定义在 ARM\OS_CPU.H 文件中。
2.2 uC/OS-II中的任务
2.2.1 任务的基本概念




复杂问题 “分而治之” 的问题解题思路。 针对目标系统拆分后的 “小且易” 的问题的 具体处理方法编码和数据结构 ---- 任务。 uC/OS-II的两种任务:系统任务、用户任务。 任务的组成:
C H A P T E R
2
嵌入式实时操作系统 C/OS-Ⅱ分析
主要内容

嵌入式操作系统


C/OS-Ⅱ简介
C/OS-Ⅱ中的任务 C/OS-Ⅱ任务的中断和时钟 C/OS-Ⅱ任务通信与同步 C/OS-Ⅱ内存的动态分配

C/OS-Ⅱ移植相关
功能层
应用程序
文件系统 软件层
图形用户 接口

OS_TASK_STAT_EN 设置为 1,使能该函数。 3 、该任务是 uC/OS-II 初始化时自动创建,其任务优先 统计任务( OSTaskStat( )) 级固定为最低级,用户也可修改该任务的业务。 3原型: 、用户在 OS_CFG.H 中使能该任务后,系统自动创建 void OSTaskStat(void* pdata) 该任务,但在用户使用统计数据前必须调用系统 4、目的 ---- 使 CPU 在没有用户任务可执行时也有事可 函数 OSStatInit() 先进行初始化。 做。 4、该任务固定拥有次末任务优先级。

uC_OS-II实验指导书

uC_OS-II实验指导书
3.1 µC/OS-II 概述............................................................................................................................. 5 3.2 µC/OS-II 的特点......................................................................................................................... 6 3.3 µC/OS-II 主要源代码文件介绍.................................................................................................7 4 LambdaTOOL 集成开发环境简介....................................................................................................... 7 5 µC/OS-II 实验内容简介........................................................................................................................ 8 5.1 任务管理实验............................................................................................................................ 8 5.2 优先级反转实验........................................................................................................................ 8 5.3 优先级继承实验........................................................................................................................ 9 5.4 哲学家就餐实验........................................................................................................................ 9 5.5 内存管理实验............................................................................................................................ 9 5.6 时钟中断实验............................................................................................................................ 9 5.7 消息队列实验............................................................................................................................ 9 6 预备实验:嵌入式开发环境的建立................................................................................................... 9 6.1 目的............................................................................................................................................ 9 6.2 实验步骤及说明...................................................................................................................... 10

ZY-ucos-ii_api_参考手册.doc

UCOS-II API 参考手册本章提供了μC/OS-Ⅱ的用户指南。

每一个用户可以调用的内核函数都按字母顺序加以说明,包括:●函数的功能描述●函数原型●函数名称及源代码●函数使用到的常量●函数参数●函数返回值●特殊说明和注意点OSInit( )Void OSInit(void);OSinit()初始化μC/OS-Ⅱ,对这个函数的调用必须在调用OSStart()函数之前,而OSStart ()函数真正开始运行多任务。

参数无返回值无注意/警告必须先于OSStart()函数的调用范例:void main (void){.OSInit(); /* 初始化 uC/OS-II */.OSStart(); /*启动多任务内核 */}μC/OS-II:实时操作系统内核OSIntEnter( )Void OSIntEnter(void);OSIntEnter()通知μC/OS-Ⅱ一个中断处理函数正在执行,这有助于μC/OS-Ⅱ掌握中断嵌套的情况。

OSIntEnter()函数通常和OSIntExit()函数联合使用。

参数无返回值无注意/警告在任务级不能调用该函数。

如果系统使用的处理器能够执行自动的独立执行读取-修改-写入的操作,那么就可以直接递增中断嵌套层数(OSIntNesting),这样可以避免调用函数所带来的额外的开销。

范例一:(Intel 80x86的实模式, 在大模式下编译,,real mode,large model)ISRx PROC FARPUSHA ; 保存中断现场PUSH ESPUSH DS;MOV AX, DGROUP ; 读入数据段MOV DS, AX;CALL FAR PTR _OSIntEnter ; 通知内核进入中断..POP DS ; 恢复中断现场POP ESPOPAIRET ; 中断返回ISRx ENDP范例二:(Intel 80x86的实模式, 在大模式下编译,, real mode , large model)参考手册ISRx PROC FARPUSHA ; 保存中断现场PUSH ESPUSH DS;MOV AX, DGROUP ; 读入数据段MOV DS, AX;INC BYTE PTR _OSIntNesting ; 通知内核进入中断...POP DS ; 恢复中断现场POP ESPOPAIRET ; 中断返回ISRx ENDPμC/OS-II:实时操作系统内核OSIntExit( )Void OSIntExit(void);OSIntExit()通知μC/OS-Ⅱ一个中断服务已执行完毕,这有助于μC/OS-Ⅱ掌握中断嵌套的情况。

嵌入式操作系统_第5章 ucOS-II - 任务就绪表及任务就绪组


多任务操作系统的核心工作就是任 务调度。
所谓调度,就是通过一个算法在多
μ的个作C的任依/函μ务OC数中/据任OS就确S__叫务就定III进做该I进就行是调运任及度行绪行任务器的调。表任任务度务的,务就思做想调这绪是项度表工
任务调度 “近似地每时每刻总是让优先级最高的
任任就务务就就绪绪绪任表表务和和任任处务务于就就运绪绪组组行的的状结登态构记、”注销。、为了保证 最这高优一先点级,就绪它任在务系的查统找或用户任务调用系统
先保护被中 止任务的断
点数据
后恢复待运 行任务的断
点数据
不要企图用PUSH和POP指令来使程序计数 器PC压栈和出栈,因为没有这样的指令。
只好需一变次要通由中一宏断下或O了S_者。TA一SK次_S调W(用)来来使引发 中断动作和过OS程Ct调xS用w指( 令) 可以使PC压栈; 中断返回指令可以执使行P任C出务栈切。换工作
嵌入式实时操作系统
μC/OS-II
信息学院
3.3任务控制块 (OS_TCB)
及其链表
μC/OS-II用来记录任务的堆
栈指针、任务的当前状态、任 务的优先级别等一些与任务管 理有关的属性的表就叫做任务 控制块
任务控制块就相当于是一个任 务的身份证,没有任务控制块 的任务是不能被系统承认和管 理的
任务控制块结构的主要成员
5 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
6 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
7 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 y
任务就绪表的示意图
D7 D6 D5 D4 D3 D2 D1 D0 prio=29 0 0 0 1 1 1 0 1

ucos-ii(2.91)在LPC17xx上移植个人总结

Ucos-ii移植到LPC1752总结前言个人移植后觉得应该自己总结下,回忆下整个移植过程,于是有了一下内容。

本来是个人笔记,突然想分享给大家,所以有很多不足,内容仅供参考。

本文主要讨论移植,移植前一定要保证1752在没有操作系统的情况下能正常运行各个功能,具体请参照其他相关文档,这里不做探讨。

这里只是个人移植过程中遇到的情况及处理办法,粗略总结仅供参考。

Ucos 详情参考邵贝贝翻译作品。

注:本文仅适用于初学者,高手请绕道,初学者需对芯片和编译工具有基本的了解一、准备工作1、下载芯片驱动在lpcware官方网站下载1752的底层驱动,里面有现成的系统初始化配置函数及相关GPIO的操作接口函数。

当然这些也可以自己写。

2、下载ucos代码在ucos官方网站下载操作系统源文件(source),然后在官方网站(/page/home)找到LPC17xx相关的接口代码。

下载代码需要注册。

(/page/downloads/ports/nxp)图1开始移植1、建立工程首先建立工程,我使用的是keil,工程建立后将芯片的驱动文件添加并编译,先不移植看芯片是否能正常工作(最简单就是用一个led闪烁来指示芯片是否正常工作)。

能正常工作后再进行下一步操作(这样以后出问题就知道是系统原因还是芯片原因)。

这里具体操作不做探讨,因为这不属于移植的部分,是对芯片的基本操作。

2、移植ucos-ii将下载的ucos代码添加进工程,在source中将里面的文件全部添加进工程,而接口只需将Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\IAR里面的几个文件添加进去即可。

将#include <app_cfg.h>注释掉,因为我们在主程序里面定义堆栈。

并且将ucos-ii.h里面的os_cfg.h改为os_cfg_r.h因为不同版本命名不一样。

如图2所示图 22.1.1修改os_cpu_a.asm文件因为我们使用的是keil,所以需要建里面的public改为EXPORT如下图所示。

关于uCOS-II中优先级翻转问题

关于uC/OS-II中优先级翻转问题■ 山东大学 秦绍华 陈涤1uC/OS-II的运行机制在嵌入式系统的应用中,实时性是一个重要的指标,而优先级翻转是影响系统实时性的重要问题。

本文着重分析优先级翻转问题的产生和影响,以及在uC/OS-II中的解决方案。

uC/OS-II采用基于固定优先级的占先式调度方式,是一个实时、多任务的操作系统。

系统中的每个任务具有一个任务控制快OS_TCB,任务控制块记录任务执行的环境,包括任务的优先级,任务的堆栈指针,任务的相关事件控制块指针等。

内核将系统中处于就绪态的任务在就绪表(ready list)进行标注,通过就绪表中的两个变量OSRdyGrp和OSRdyTbl[]可快速查找系统中就绪的任务。

在uC/OS-II中每个任务有唯一的优先级,因此任务的优先级也是任务的唯一编号(ID),可以作为任务的唯一标识。

内核可用控制块优先级表OSTCBPrioTbl[]由任务的优先级查到任务控制块的地址。

uC/OS-II主要就是利用任务控制快OS_TCB、就绪表(ready list)和控制块优先级表OSTCBPrioTbl[]来进行任务调度的。

任务调度程序OSSched()首先由就绪表(ready list)中找到当前系统中处于就绪态的优先级最高的任务,然后根据其优先级由控制块优先级表OSTCBPrioTbl[]取得相应任务控制块的地址,由OS_TASK_SW()程序进行运行环境的切换。

将当前运行环境切换成该任务的运行环境,则该任务由就绪态转为运行态。

当这个任务运行完毕或因其它原因挂起时,任务调度程序OSSched()再次到就绪表(ready list)中寻找当前系统中处于就绪态中优先级最高的任务,转而执行该任务,如此完成任务调度。

若在任务运行时发生中断,则转向执行中断程序,执行完毕后不是简单的返回中断调用处,而是由OSIntExit()程序进行任务调度,执行当前系统中优先级最高的就绪态任务。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第6章任务之间的通讯与同步....................................................................................16.0事件控制块ECB................................................................................................26.1初始化一个ECB块,OSE VENT W AIT L IST I NIT()...............................................76.2使一个任务进入就绪状态,OSE VENT T ASK R DY().........................................86.3使一个任务进入等待状态,OSE VENT T ASK W AIT().......................................106.4由于等待超时将一个任务置为就绪状态,OSE VENT TO()...........................116.5信号量.............................................................................................................116.5.1建立一个信号量, OSSemCreate()......................................................126.5.2等待一个信号量, OSSemPend()..........................................................136.5.3发送一个信号量, OSSemPost()..........................................................156.5.4无等待地请求一个信号量, OSSemAccept()......................................166.5.5查询一个信号量的当前状态, OSSemQuery()....................................176.6邮箱.................................................................................................................186.6.1建立一个邮箱,OSMboxCreate()........................................................196.6.2等待一个邮箱中的消息,OSMboxPend()............................................206.6.3发送一个消息到邮箱中,OSMboxPost()............................................226.6.4无等待地从邮箱中得到一个消息, OSMboxAccept()........................236.6.5查询一个邮箱的状态, OSMboxQuery()..............................................246.6.6使用邮箱作为二值信号量....................................................................256.6.7使用邮箱实现延时,而不使用OSTimeDly()......................................266.7消息队列.........................................................................................................276.7.1建立一个消息队列,OSQCreate()......................................................316.7.2等待一个消息队列中的消息,OSQPend()..........................................336.7.3向消息队列发送一个消息(FIFO),OSQPost()..............................356.7.4向消息队列发送一个消息(LIFO),OSQPostFront()....................376.7.5无等待地从一个消息队列中取得消息, OSQAccept()......................386.7.6清空一个消息队列, OSQFlush()........................................................396.7.7查询一个消息队列的状态,OSQQuery()............................................406.7.8使用消息队列读取模拟量的值............................................................416.7.9使用一个消息队列作为计数信号量....................................................42第6章任务之间的通讯与同步在µC/OS-II中,有多种方法可以保护任务之间的共享数据和提供任务之间的通讯。

在前面的章节中,已经讲到了其中的两种:一是利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断。

当两个任务或者一个任务和一个中断服务子程序共享某些数据时,可以采用这种方法,详见3.00节临界段、8.03.02节OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()及9.03.02节 临界段,OS_CPU.H;二是利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度函数上锁和开锁。

用这种方法也可以实现数据的共享,详见3.06节 给调度器上锁和开锁。

本章将介绍另外三种用于数据共享和任务通讯的方法:信号量、邮箱和消息队列。

图F6.1介绍了任务和中断服务子程序之间是如何进行通讯的。

一个任务或者中断服务子程序可以通过事件控制块ECB(Event Control Blocks)来向另外的任务发信号[F6.1A(1)]。

这里,所有的信号都被看成是事件(Event)。

这也说明为什么上面把用于通讯的数据结构叫做事件控制块。

一个任务还可以等待另一个任务或中断服务子程序给它发送信号[F6.1A(2)]。

这里要注意的是,只有任务可以等待事件发生,中断服务子程序是不能这样做的。

对于处于等待状态的任务,还可以给它指定一个最长等待时间,以此来防止因为等待的事件没有发生而无限期地等下去。

多个任务可以同时等待同一个事件的发生[F6.1B]。

在这种情况下,当该事件发生后,所有等待该事件的任务中,优先级最高的任务得到了该事件并进入就绪状态,准备执行。

上面讲到的事件,可以是信号量、邮箱或者消息队列等。

当事件控制块是一个信号量时,任务可以等待它,也可以给它发送消息。

图 6.1 事件控制块的使用6.0事件控制块ECBµC/OS-II通过uCOS_II.H 中定义的OS_EVENT数据结构来维护一个事件控制块的所有信息[程序清单L6.1],也就是本章开篇讲到的事件控制块ECB。

该结构中除了包含了事件本身的定义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等,还定义了等待该事件的所有任务的列表。

程序清单 L6.1是该数据结构的定义。

程序清单 L6.1 ECB数据结构typedef struct {void *OSEventPtr; /* 指向消息或者消息队列的指针 */INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* 等待任务列表 */INT16U OSEventCnt; /* 计数器(当事件是信号量时) */INT8U OSEventType; /* 时间类型 */INT8U OSEventGrp; /* 等待任务所在的组 */} OS_EVENT;.OSEventPtr指针,只有在所定义的事件是邮箱或者消息队列时才使用。

当所定义的事件是邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构,详见6.06节消息邮箱和6.07节消息队列。

.OSEventTbl[] 和 .OSEventGrp 很像前面讲到的OSRdyTbl[]和OSRdyGrp,只不过前两者包含的是等待某事件的任务,而后两者包含的是系统中处于就绪状态的任务。

(见3.04节 就绪表).OSEventCnt当事件是一个信号量时,.OSEventCnt是用于信号量的计数器,(见6.05节信号量)。

.OSEventType定义了事件的具体类型。

它可以是信号量(OS_EVENT_SEM)、邮箱(OS_EVENT_TYPE_MBOX)或消息队列(OS_EVENT_TYPE_Q)中的一种。

用户要根据该域的具体值来调用相应的系统函数,以保证对其进行的操作的正确性。

每个等待事件发生的任务都被加入到该事件事件控制块中的等待任务列表中,该列表包括.OSEventGrp和.OSEventTbl[]两个域。

变量前面的[.]说明该变量是数据结构的一个域。

在这里,所有的任务的优先级被分成8组(每组8个优先级),分别对应.OSEventGrp中的8位。

当某组中有任务处于等待该事件的状态时,.OSEventGrp中对应的位就被置位。

相应地,该任务在.OSEventTbl[]中的对应位也被置位。

.OSEventTbl[]数组的大小由系统中任务的最低优先级决定,这个值由uCOS_II.H中的OS_LOWEST_PRIO常数定义。

这样,在任务优先级比较少的情况下,减少µC/OS-II对系统RAM的占用量。

当一个事件发生后,该事件的等待事件列表中优先级最高的任务,也即在.OSEventTbl[]中,所有被置1的位中,优先级代码最小的任务得到该事件。

相关文档
最新文档