uCOS-II之邮箱
多任务操作系统中,常常需要再任务与任务之间通过传递一个数据(注意这里是1个数据,而不是多个数据)的方式进行通信,为了达到这个目的,可以在内存中创建一个存储空间作为该数据的缓冲区,如果把这个缓冲区称为消息缓冲器,这样在任务间传递数据(消息)的最简单的办法就是传递消息缓冲区的指针,我们把用来传递消息缓冲区指针的数据结构叫做邮箱(消息邮箱)。
在ucos中,我们通过事件控制块的OSEventPrt来传递消息缓冲区指针(在信号量中,不需要该指针),同时使实践控制块的成员OSEventType设定为常数OS_EVENT_TYPE_MBOX,则该事件控制块ECB就叫做消息邮箱。
与消息邮箱相关的几个函数分别为:
1、创建邮箱函数:OS_EVENT *OSMboxCreate(void *msg),函数中的参数msg为消息的指针,函数的返回值为消息邮箱的指针。该函数的实现方法是:先判断是否在中断中调用该函数,如果是则无效返回;定义一个空ECB,类型为消息邮箱,将OSEventPrt赋初值为某个指针。返回一个指向上述ECBB的指针。
2、向邮箱发送消息函数:INT8U OSMboxPost(OS_EVENT *pevent,void *pmsg),函数实现过程:检查了事件控制块是否是一个邮箱后[L6.16(1)],OSMboxPost()函数还要检查是否有任务在等待该邮箱中的消息[L6.16(2)]。如果事件控制块中的OSEventGrp域包含非零值,就暗示着有任务在等待该消息。这时,调用OSEventTaskRdy()将其中的最高优先级任务从等待列表中删除[见6.02节,使一个任务进入就绪状态,OSEventTaskRdy()][L6.16(3)],加入系统的就绪任务列表中,准备运行。然后,调用OSSched()函数[L6.16(4)],检查该任务是否是系统中最高优先级的就绪任务。如果是,执行任务切换[仅当OSMboxPost()函数是由任务调用时],该任务得以执行。如果该任务不是最高优先级的任务,OSSched()返回,OSMboxPost()的调用函数继续执行。如果没有任何任务等待该消息,指向消息的指针就被保存到邮箱中[L6.16(6)](假设此时邮箱中的指针不是非NULL的[L6.16(5)])。这样,下一个调用OSMboxPend()函数的任务就可以立刻得到该消息了。
注意:在OSMboxPost函数中,有判断邮箱中是否已经有了消息,如果已经有消息,则返OS_ERR_MBOX_FULL,这就代表,ucos中的邮箱一次只能发送1个指针,即1个数据,这在使用上就有些局限。
3、等待一个邮箱中的消息函数:OSMboxPend(OS_EVENT *pevent,INT32U timeout,INT8U *perr),函数的实现过程:它和OSSemPend()也很相似,因此,在这里只讲述其中的不同之处。OSMboxPend()首先检查该事件控制块是由OSMboxCreate()函数建立的[L6.15(1)]。当.OSEventPtr域是一个非NULL的指针时,说明该邮箱中有可用的消息[L6.15(2)]。这种情况下,OSMboxPend()函数将该域的值复制到局部变量msg中,然后将.OSEventPtr置为NULL[L6.15(3)]。这正是我们所期望的,也是执行OSMboxPend()函数最快的路径。如果没有消息可用,则等待。
uCOS-II之邮箱相关推荐
- 用C语言写ucos中断服务程序,在ARM处理器上移植uCOS II的中断处理
uCOS II是一个源码公开.可移植.可固化.可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写.总量约200行的汇编语言部分被压缩到最低限度 ...
- 51单片机中使用ucos ii的优缺点(好文)
摘要:近年来,在单片机系统中嵌入操作系统已经成为人们越来越关心的一个话题.本文通过对一种源码公开的嵌入式实时操作系统ucos ii的分析,以51系列单片机为例,阐述了在单片机中使用该嵌入式操作系统的优 ...
- lwip协议栈在linux运行,LwIP协议栈在uCOS II下的实现
1.概述: LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件.OS.编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下.因此LwIP在 ...
- UCOS II移植到STM32F103开发板
早期嵌入式开发没有嵌入式操作系统的概念 ,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念.通常把程序分为两部分:前台系统和后台系统. 简单的小系统通常是前后台系统,这样的程序包 ...
- ucos II任务管理之一:挂起任务
Ucos II 任务管理之一 创建好了任务之后,就已经初步跨进了ucos II 的编程了.随着进一步的编程,发现学会创建了任务还是不够的. 在我的项目里,需要实现485通信功能,我创建了任务1用于串口 ...
- ucos II任务管理之三:删除任务
ucos II任务管理之三:删除任务 有了前面的经历之后,mcu21决定全面地学习了任务的管理.这样在项目编程中才能做到"信手拈来". 在ucos II 里,创建一个任务之后,可以 ...
- ucos II 创建第一个任务之一
Ucos II创建第一个任务 我们已经从远处欣赏过ucos II 的身材,现在可以近距离地欣赏Ucos II性感的局部了. 任务是什么? 有一句话:CPU不同的时刻段总是在执行着优先级最高的任务.所以 ...
- 基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现
基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现 在基于STM32的示波器的实现的基础上,在STM32上移植UCOS II嵌入式实时操作系统. 在UCOS II操作系统中将各个功能分发 ...
- ucos ii堆栈大小检测
在使用ucos ii时经常会有疑问,这个堆栈该给多大,虽然ucos ii 自带了任务堆栈检测,但是我觉得太麻烦了,而且还会占用资源,我投机取巧的使用内存是否为0来判断堆栈是否使用过,进而检测出堆栈的最 ...
- IAR中移植UCOS II系统以及sourceInsight 使用
ucos 学习笔记 1 sourceInsight 使用 CSDN参考链接 新建工程 第一步:project中new project 第二步:在高亮部分输入工程的地址,工程文件夹与IAR工程文件夹放在 ...
最新文章
- 计算机网络协议分层体系结构
- STM32开发 -- 无线网络协议
- 【排序算法】计数排序
- php代码导入sql,php导入SQL文件(示例代码)
- std::set作为一个有序集合
- python代码规范准则_Python编码规范
- Redis面试 - redis 的雪崩和穿透?
- unity 打开vs没有解决方案_VS找不到UnityEngine、UnityEngine.UI等引用的解决办法
- Linux使用rostopic echo将rosbag文件转换成csv或txt文件以及sh脚本批量化操作
- 某IT公司的面试题,难度系数“爆表”。。。
- 语音信号处理入门入籍和课程推荐
- mysql查询排序(asc,desc)
- 安卓Activity的生命周期函数详解
- 利用node爬取王者荣耀英雄信息,并存入数据库
- 麻雀租房App 作品展示
- 安卓如何实现动态广告栏
- 台积电:3纳米芯片工厂地址首选台湾 美国次之
- 配置了Maven环境变量后,cmd中mvn -v一直报“mvn不是内部命令”
- Tribal项目介绍
- 判断平面图的库拉托夫斯基定理
热门文章
- Bentley 软件公司发起 2021 基础设施数字化光辉大奖赛项目征集活动
- 2034——人见人爱A-B
- 192、如何查询局域网内在线的监控设备IP
- unraid应用_unraid 篇三:unraid docker之网页文件管理,强迫症的福音
- 医院陪诊小程序怎么开发-医院陪诊小程序源码功能
- 用mission planner或者3drradioconfig软件配置X-ROCK数传电台
- c语言文件被认为是木马,为啥我用c语言写成的exe文件会被360当做木马?
- opc ua 用哪种语言编写_什么是OPC UA?
- 解决安卓手机H5页面input获得焦点时页面挤压或者底部上移
- linux库函数pthread.h------pthread_rwlock_t读写锁说明