首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
通信技术
» 基于μC/OS-Ⅲ的多任务间邮箱机制分析与应用
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
基于μC/OS-Ⅲ的多任务间邮箱机制分析与应用
发短消息
加为好友
forsuccess
当前离线
UID
871057
帖子
6281
精华
0
积分
3141
阅读权限
90
在线时间
282 小时
注册时间
2012-2-21
最后登录
2015-6-23
论坛元老
UID
871057
性别
男
1
#
打印
字体大小:
t
T
forsuccess
发表于 2013-6-16 23:42
|
只看该作者
基于μC/OS-Ⅲ的多任务间邮箱机制分析与应用
系统软件
,
实际应用
,
嵌入式
,
操作系统
,
邮箱
嵌入式系统软件通常由多个功能模块构成,而模块的功能一般由基于嵌入式操作系统的任务来实现。在实际应用中,常需要进行任务间通信来实现特定的功能,如变量的传递、资源的共享等,这就需要针对操作系统建立可靠的任务间通信,而邮箱是最常用的任务间通信机制之一。本文基于μC/OS-Ⅲ嵌入式实时操作系统,研究了邮箱的使用和技巧,不仅探讨了邮箱在传统任务间通信和数据的传递中的应用,还通过实例研究了邮箱在二值信号量和实现延时功能中的灵活应用。
1 μC/OS-Ⅲ简介
嵌入式实时操作系统(RTOS)是嵌入式系统的关键组成部分。近年来,μC/OS-Ⅲ操作系统以其较小的体积、开放的源码和值得信赖的可靠性获得了工程技术人员的青睐。2011年,μC/OS-Ⅲ的升级版μC/OS-Ⅲ发布。μC/OS-Ⅲ秉承了前一版本的优点,是一个高度可移植、可固化、可扩展,具有优先抢占的实时性,专为满足当今嵌入式系统的苛刻要求的多任务内核,它的最大改进之处在于允许多个任务运行于同一优先级上,相同优先级的任务按时间片轮转调度,内核对象的数量不受限制以及接近于零的终端禁用时钟周期。μC/OS-Ⅲ内核为程序员提供了高效的实时任务调度、中断管理以及任务间通信。与前期版本不同,μC/OS-Ⅲ支持无限多个任务,无限多个优先级,无限多个信号量,同时支持互斥信号量、消息邮箱等任务间通信方式。
2 任务间通信与邮箱的应用
由于嵌入式系统软件通常由基于操作系统的若干个任务实现,因此,不可避免的需要任务之间或中断服务子程序与任务间的通信,这种信息传递机制称为任务间的通信。μC/OS-Ⅲ任务间的通信可以通过共享内存、信号量、任务内建消息队列、外部消息队列、事件标志组实现。共享内存方式使用全局变量或缓存,对大型而复杂的程序,多个任务同时对一个变量进行读写操作会引起冲突或缓存区的溢出,因此共享内存用于共享一些对数据安全性不高的通用数据。信号量的通信模型虽然可以很好地起到互斥的作用,但在多个任务同时与某一任务通信是就会产生对信号量的竞争,引起通信发起端的排队,降低系统的效率。任务内建消息队列一般用于接收少量消息(如中断服务程序发送过来的消息)、外部消息队列主要面向于多个任务共同等待的消息,事件标志组则用于多个任务间的同步。
总结来说,μC/OS-Ⅲ任务间通信有2个途径:通过全局变量或发消息给另一个任务。用全局变量时,必须保证每个任务或中断服务子程序独享该变量。中断服务中保证独享的惟一办法是关中断。如果2个任务共享某变量,各任务实现独享该变量的办法可以使关中断,再开中断,或使用信号量。需要注意的是,任务只能通过全局变量与中断服务子程序通信,而任务并不知道什么时候全局变量被中断服务子程序修改了,除非中断服务子程序以信号量方式向任务发信号,或者是该任务以查询方式不断周期地查询变量的值。这样就不可避免地给程序设计带来了一定的难度,为避免这种情况,常用的解决方法是采用邮箱。
典型的消息邮箱(Message Mail Box)也称作交换消息,即用一个指针型变量,一个任务或一个中断服务子程序通过内核,可以把一则消息(一个指针)放到邮箱中。同样,一个或多个任务通过内核,可以接收这则消息。发送消息的任务和接收消息的任务约定,某个指针指向的内容就是它们要传送的消息,如发送消息用指针*Txmsg,而接收消息用指针*Rxmsg。这种消息传送的过程与通过邮箱收发邮件颇为相似,故称消息邮箱,或简称邮箱。
为了在μC/OS-Ⅲ中使用邮箱,必须将OS_CFG.H文件中相应的配置常数置1。具体配置项如表1所示。
需要说明的是,由于μC/OS-Ⅲ的邮箱管理必须有函数OSMboxCreate()和OSMboxPend()的参与,所以它们不能单独被屏蔽掉。但从表1中可以看出,将OS_MBOX_EN选项置0即可屏蔽所有邮箱函数,当然也可以屏蔽OSMboxCreate()和OSMboxPend()函数。 μC/OS-Ⅲ的邮箱支持任务与任务之间、任务与中断服务子程序之间进行消息传递,图1给出了邮箱支持的消息传递过程中所用到的函数和任务、中断服务子程序之间的关系。
从图1可以看出,任务或中断服务子程序都可以调用函数OSMboxPost()和OSMboxPostOpt(),但只有任务可以调用OSMboxCreate(),OSMbo xDel(),OSMboxPend()及OSMboxQuery()函数。此外,μC/OS-Ⅲ中应用程序可以使用多个邮箱,其最大数目由OS_CFG.H文件中的配置常数OS_MAX_EVENTS设定。
在表1中各选项配置完毕并了解图1中各邮箱函数的关系后,即可以使用邮箱进行消息的传递,其具体过程为:创建邮箱OSMboxCreate();邮箱内消息的内容初始化,此时邮箱内是否有消息并不重要;将消息放入邮箱OSMboxPost();等待有消息进入邮箱OSMboxPend();如果邮箱内有消息,则任务将消息从邮箱中取走;如果邮箱内没有消息,则内核不将该任务挂起,返回空指针。
下述代码给出了2个邮箱TxMbox和RxMbox的建立方法,同时TaskOne和TaskTwo两个任务使用邮箱实现了全双工的应答式通信。
从代码可以看出,使用内核提供的邮箱服务实现任务问通信方便、简单,这也是邮箱作为任务问通信最常用手段的原因。此外,在实际应用中,通过分析邮箱的功能特点,还可以将其应用到其他场合以实现一些灵活的功能。
3 邮箱的灵活应用
3
.
1 用邮箱作为二值信号量
邮箱可以当作二值信号量用,邮箱中有消息表示资源可以使用,而空邮箱表示资源已经被其他资源占用。首先,在初始化时将邮箱设置为一个非空指针(eg.void*1),这样,一个任务可以调用OSMboxPend()函数请求信号量,然后通过调用OSMboxPost()函数释放信号量。若只需要二值信号量和邮箱,采用这种方法可以节省代码空间。此时,需将OS_MBOX_EN置1,而将OS_SEM_EN清0,即只用邮箱,而不是同时使用邮箱和信号量。同样,给出了一个邮箱传递二值信号量的简单示例。
3.2 邮箱实现延时,而不使用OSTimeDly()
邮箱的超时等待功能可以用作延时,模仿OS-TimeDly()函数功能。示例代码如下:
在程序执行过程中,若在指定的时间TIMEOUT内没有消息到来,则TaskC继续执行,这显然与OSTimeDly(TIMEOUT)功能类似;但是,如果TaskD在指定的时间结束之前,向邮箱发送一个dummy消息,则可以中止任务1中的延时,使TaskC提前继续执行,这与调用函数OSTimeDly Res ume()的功能一致。
4 结语
本文基于嵌入式操作系统μC/OS-Ⅲ探讨了邮箱在任务间通信中的应用方法及注意事项,分析了各邮箱函数的关系及使能/屏蔽方法,并给出示例实现2个任务的全双工通信;在此基础上,还研究了邮箱在二值信号量和延时功能中的灵活应用,并给出实例代码验证,这在嵌入式系统开发过程中有一定的参考价值。
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议