没有合适的资源?快使用搜索试试~ 我知道了~
首页uC/OS-III 对象(事件)管理
本文档从uC/OS-III中,与对象(事件)相关的数据结构出发,结合对象管理的具体代码,分析了uC/OS-III中的对象管理机制。 第一章分析了与对象管理相关的数据结构(OS_PEND_DATA、OS_PEND_OBJ、OS_PEND_LIST),以及它们之间的关系。 第二章以信号量为例,介绍了对象的创建、获取(Pend)、释放(Post)与删除操作。 第三章介绍了多对象等待(OSPendMulti)功能的实现。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/4841780/bg1.jpg)
与对象相关的数据结构
1 与对象相关的数据结构
如果看过 uC/OS-III 的源代码,会发现里面与内核对象(如信号量、消息队
列等,它就是 uC/OS-2 中的事件,以下简称为对象)管理相关的数据结构看起
来很复杂。但为什么需要这么多数据结构?
个人认为,其原因有两个:一是为了支持多对象等待功能,二是为了支持
时间片轮转调度。这第一个理由还说的过去,但时间片轮转貌似是八竿子打不
着的东西,怎么把它也算做一个原因?不要着急,在下面的讨论中,你将逐渐
找到答案。
1.1 历史回顾之uC/OS-2
uC/OS-2 是不支持时间片轮转调度的,也就是说,一个优先级上只有一个
任务。这给系统的设计带来了很多便利。反映到对象(Object)(uC/OS-2 中被称
作事件(Event))管理上,就是几乎不需外加任何数据结构就能实现对象的操作。
在 uC/OS-2 中,每一个对象(或者事件)都有一个“等待表”,这个所谓
的表并不是一个链表,而是一组变量,里面每个变量的每一个二进制位,都对
应了一个任务(实质是对应一个优先级,但一个优先级上只有一个任务)。所
以这个“等待表”实质上就是一大堆二进制位。当有任务要等待这个对象时,
就把对应的二进制位设置为 1;当对象被释放时,就利用这组变量,找到所有
等待该对象的任务中,优先级最高的一个,使其就绪并清零对应的二进制位。
注:对于利用“等待表”找到优先级最高任务的方法有很多,比较容易想到的
是:从所有二进制位中,所对应优先级最高的那个开始,挨个查看所有二进制
位,直到发现某个二进制位等于“
1
“为止。但
uC/OS-2
没有用这么笨的方法,
而是利用查“优先级决策表(
Priority Resolution Table
)”的方法,这个表设计
的非常巧妙,但考虑到与本章主题关系不大,就不详细讨论了。
在上述情况下,任何操作实现起来都相对容易,因为优先级数是已知的,
所以任务数就已知,所需“等待表”的大小就已知,也就不需要什么复杂的数
据结构。即使是实现多对象等待也一样。在实现多对象等待时,只需建立一个
指针数组,数组中每一个元素都指向一个对象,然后在 TCB(任务的控制块)
1
![](https://csdnimg.cn/release/download_crawler_static/4841780/bg2.jpg)
Written by Sword1224 @ SDU
中加一个指针指向这个数组。当需要等待时,把所有对象的“等待表”中,该
任务对应的二进制位都设为 1;当某一个对象释放时,先把自己 “等待表”中,
该任务对应的二进制位清零,然后通过 TCB 中那个指向数组的指针,找到其它
对象,把这些对象“等待表”中的对应位清零。在 uC/OS-2 后期的版本中,就
是通过这种方法实现多对象等待功能的。
1.2 uC/OS-III中的实现
uC/OS-III 的情况就不一样了,它支持优先级轮转调度,所以一个优先级会
对应多个任务。那系统中总共会有多少个任务?不知道。由于任务数未知,就
无法用 uC/OS-2 的那组二进制位来设计“等待表”。对于这种任务数量未知的
情况,就只能求助于“链表”了。
可以提出一种这样的解决方案:为每一个对象设置一个链表,哪个任务要
等待它,就把这个任务链接进来。
但问题是,任务又不是一个变量,它是一种抽象的东西,怎么把任务加入
链表?对于这个问题,最容易想到的方法是利用 TCB(任务控制块)。可以说,
在操作系统中 TCB 就是任务的身份证,和任务一一对应。所以当任务等待某个
对象时,只要把这个任务的 TCB 链接到对象的“等待链表”中就可以了;当对
象被释放时,从链表中找出优先级最高的任务,使其就绪,并把它所对应的 TCB
从链表中删除。
这种做法确实没有问题,但它的功能却受到了限制。当面对“多对象等待”
功能时,它就变的束手无策了。因为一个任务只有一个 TCB,若要等待多个任
务,这个 TCB 到底应该加到哪个链表中?为了解决这个问题,就必须设置一种
辅助变量(我们暂且叫它 PendData)。
TCB 虽然只有一个,但 PendData 变量可以有很多个。当一个任务要等待 N
个对象时,只需设立一个“等待对象表”(实际就是一个数组),表中包含 N
个 PendData 变量,TCB 通过一个指针指向 “等待对象表”。进行等待操作时,
只要把这些 PendData 分别加入不同的链表就 OK 了。
2
![](https://csdnimg.cn/release/download_crawler_static/4841780/bg3.jpg)
与对象相关的数据结构
那么这个 PendData 变量,应该被设计成什么样子?既然它能被加入链表,
它就应该有一个向前指和向后指的指针;它是为任务等待对象设置的辅助变量,
所以通过它,即能找到任务,又能找到对象,因此它必须有一个指向 TCB 的指
针和一个指向对象的指针。
通过这张包含 N 个 PendData 的“等待对象表”,就可以同时支持多对象
等待功能和时间片轮转调度功能了。了解了这些,再看一下 uC/OS-III 中具体的
数据类型。
1.3 具体的数据结构
图 1.1 对象管理示意图
3
![](https://csdnimg.cn/release/download_crawler_static/4841780/bg4.jpg)
Written by Sword1224 @ SDU
与对象管理相关的数据类型主要有:OS_PEND_DATA、OS_PEND_OBJ、
OS_PEND_LIST。它们之间的关系如图 1.1 所示。
我们首先从图 1.1 最上方的 TCB 开始。TCB 为一个任务控制块,上图列出
了它和对象管理相关的两个成员变量 PendDataTblEntries 和 PendDataTblPtr。其
中 PendDataTblPtr 就是指向“等待对象表”的指针,而 PendDataTblEntries 表示
了这个表中元素的个数。
这里的指针 PendDataTblPtr,是“OS_PEND_DATA *”类型的,所以表中
的每一个元素都是 OS_PEND_DATA 类型的变量,它们就是前一节提到的辅助
变量 PendData。为简单起见,我们先考虑一个任务只等待一个对象的情况,即
“等待对象表”中只有一个元素,假设这个元素叫 PendData_X。它包含了很多
成员变量,上图中列出了其中 4 个:PrevPtr、NextPtr、TCBPtr 以及 PendObjPtr。
PrevPtr / NextPtr:这两个变量是“OS_PEND_DATA *”类型的指针。
这就是前一节所说的,PendData 中向前指和向后指的指针。
TCBPtr:这是一个指向 TCB 的指针。通过这个指针,使 PendData_X
和 TCB 之间建立了双向连接,通过 TCB 可以找到 PendData_X,反过
来通过 PendData_X 也可以找到 TCB。
PendObjPtr:它又是一个指针,它就是前一节所说的指向对象的指针。
它的数据类型是“OS_PEND_OBJ *”型。而这个 OS_PEND_OBJ 类型
十分重要,接下来要对它进行具体分析。
说 OS_PEND_OBJ 类型重要,是因为一个 OS_PEND_OBJ 变量才是真正负
责管理一个对象的,即每一个对象都对应唯一的一个 OS_PEND_OBJ 变量,且
操作该对象都必须通过这个变量。它和对象的关系就像任务与 TCB 的关系一
样,它不是对象本身,但可以把它称为对象的身份证(由此看出,前文所说的
“指向对象的指针”其实并不准确,因为对象是一个抽象的东西,
OS_PEND_OBJ 变量只是负责管理对象。但为了避免拗口的文字,以后都直接
把一个 OS_PEND_OBJ 变量称为一个对象)。
注:这里说明一点,其实具体的对象对应具体的数据类型,比如信号量对应
OS_SEM
类型,但为了便于理解,这里先不考虑具体对象的数据类型,只考虑
OS_PEND_OBJ
,具体的细节在
2.1
节的“注:”中介绍。
假设我们所等待的对象为 Object_X。上图列出了它最重要的两个成员变量:
4
![](https://csdnimg.cn/release/download_crawler_static/4841780/bg5.jpg)
与对象相关的数据结构
5
Type 与 PendList。
Type:说明对象的类型:信号量、消息队列还是其它的。
PendList:这个成员变量(这里终于不是指针了),负责管理一个等待
链表。它就是前一节所说的,为每个对象所添加的链表。
PendList 的数据类型是 OS_PEND_LIST。它的三个成员变量 HeadPtr、TailPtr
与 NbrEntries,分别是链表头指针、链表尾指针与链表中的成员个数。而链表
中的每一个成员都是 OS_PEND_DATA 类型(我们的 PendData_X 就是其中之
一),这些 OS_PEND_DATA 变量指向各自不同的 TCB,但它们都有一个共同
特点:指向同一个对象——Object_X。换句话说,这些 OS_PEND_DATA 变量
所对应的任务都有一个共同特点:都等待对象 Object_X。
1.4 各数据结构间关系的总结
到此为止,与对象管理相关的数据结构就理清了:
一个对象对应一个唯一的 OS_PEND_OBJ 变量(在本段中简写为
Object)。
如果有多个任务等待它,那每个任务都会建立一个自己的
OS_PEND_DATA 变量(在本段中简写为 PendData),并且各个 TCB(任
务控制块)通过自己的成员变量 PendDataTblPtr 与对应的 PendData 建
立联系,而 PendData 也通过自己的成员变量 TCBPtr 指向对应的 TCB。
同时所有的 PendData 都通过成员变量 PendObjPtr 指向同一个 Object。
而这个 Object 中的成员变量 PendList,负责将这些 PendData 组织成一
个“等待链表”。
把这些关系理清了,接下来再看与对象相关的具体操作就相对简单了。下
面以信号量(Sem)为例,介绍一下对象建立、占有、释放和删除的过程。
剩余25页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
Sword1224
- 粉丝: 2
- 资源: 2
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 共轴极紫外投影光刻物镜设计研究
- 基于GIS的通信管线管理系统构建与音视频编解码技术应用
- 单站被动目标跟踪算法:空频域信息下的深度研究与进展
- 构建通信企业工程项目的项目管理成熟度模型:理论与应用
- 基于控制理论的主动队列管理算法与稳定性分析
- 谷歌文件系统下的实用网络编码技术在分布式存储中的应用
- CMOS图像传感器快门特性与运动物体测量研究
- 深孔采矿研究:3D数据库在采场损失与稳定性控制中的应用
- 《洛神赋图》图像研究:明清以来的艺术价值与历史意义
- 故宫藏《洛神赋图》图像研究:明清艺术价值与审美的飞跃
- 分布式视频编码:无反馈通道算法与复杂运动场景优化
- 混沌信号的研究:产生、处理与通信系统应用
- 基于累加器的DSP数据通路内建自测试技术研究
- 跨国媒体对南亚农村社会的影响:以斯里兰卡案例的社会学分析
- 散单元法与CFD结合模拟气力输送研究
- 基于粒化机理的粗糙特征选择算法:海量数据高效处理研究
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)