ucos事件邮箱信号量队列详解
Ucos的事件分为时钟,信号量,互斥性信号量,消息队列,以及消息邮箱
首先说信号量
信号量在ucos中的类型定义为OS_EVENT_TYPE_SEM,在任务控制块ecb中,主要是用到的是信号量计数器OSEventCnt,当有任务申请信号量的时候,如果信号量OSEventCnt的值大于0,则将OSEventCnt-1是任务继续运行,如果OSEventCnt已经为0,那么任务将会被挂到任务等代表中,当别的任务发送信号量的时候,被挂起的任务得到信号量,并设置为ready准备进行下一次调度,如果这时候任务等待表中没有了等待任务,那么信号量计数器OSEventCnt只是简单地+1
信号量是不使用事件控制块的OSEventPtr成员
使用信号量之前必须先创建信号量,并在程序内部通过变量保存下来
OSSemCreate,参数为信号量的初始值,返回得到的信号量ecb指针
请求信号量
OSSemPend,参数为信号量指针,超时事件以及错误代码指针,当超时时间为0说明等待时间无限长
当一个任务请求信号量时,如果希望能够允许一个任务在信号量不够的情况下继续执行不进入等待状态,可以使用函数OSSemAccept
发送信号量使用OSSemPost,参数为事件结构体指针
删除信号量OSSemDel,参数为信号量ECB指针,删除条件以及错误信息指针,其中删除的条件为选择不论任务等待表是否为空都删除和等待为空删除
查询信号量状态OSSemQuery,返回错误信息,里面地各个参数为OS_SEM_DATA的函数,用于存放当前查询的信号量的数量
互斥型信号量与信号量的区别是互斥信号量只有0和1两种选择,而信号量可以很多选择(类似于只能两个人使用的东西和很多人可以使用的东西)
使用互斥型信号量会造成优先级反转的问题,也就是低优先级的任务占有了信号量,造成高优先级的任务等待信号量,反而不能抢断低优先级任务的情况
Ucos为了解决这种问题,策略是在任务在获得信号量的时候将任务的优先级提升到所有任务最高优先级上,从而尽快的用完共享资源并释放信号,释放信号之后恢复任务原来的优先级别
互斥型信号量在事件类型上为OS_EVENT_TYPE_MUTEX,他将OSEventCnt分为了高八位和低八位,低八位存放信号值,高八位存放为了避免优先级反转而要将任务提升道德高优先级prio
创建互斥型信号量OSMutexCreate,参数一个是优先级别一个是错误信息,其中,优先级别标识要提升的高优先级信号量,低八位一般是0xff
请求互斥型信号量, OSMutexPend,参数为互斥型信号量的指针,等待时间,以及错误信息指针,
if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; pevent->OSEventPtr = (void *)OSTCBCur;
if (OSTCBCur->OSTCBPrio <= pip) { OS_EXIT_CRITICAL();
*perr = OS_ERR_PIP_LOWER;
} else {
OS_EXIT_CRITICAL();
*perr = OS_ERR_NONE;
}
return;
}
首先检测当前事件的低八位,为0xff进入if选择,将低八位设置为系统当前任务(也就是时间请求任务)的优先级,事件指针指针指向当前任务tcb,然后检测任务的优先级和pip的比对.设置错误,比pip大,申请成功,pip的来源是当前事件ECB计数器的高八位.在创建互斥信号量的时候有这样的操作
pevent->OSEventCnt = (INT16U)((INT16U)prio << 8u) | OS_MUTEX_AVAILABLE;
也就是创建的互斥信号量的提升优先级,当前任务优先级比提升优先级高(数值低一点),就可以直接获取信号量.
如果低于,后面会进行一次正在运行的任务的优先级的提升,让当前占有信号量的的任务的权限提升,还涉及到ready表的切换等
发送互斥型信号量
OSMutexPost,参数为信号量指针
获取互斥型信号量的状态
OSMutexQuery,参数中有一个是用来保存互斥型信号量状态的结构OS_MUTEX_DATA
删除互斥型信号量
OSMutexDel
关于互斥型信号量任务处理过程中的权限提升问题后面在单独写文章讨论
消息邮箱,用于适应不同数据的传送需求,其实质就是讲数据缓冲区关联到时间控制块ECB的OSEventPrt,同时时间控制块的OSEventType为常数OS_EVENT_TYPE_MBOX,具体操作如下
OSMboxCreate,创建消息邮箱
OSMboxPend请求消息邮箱,返回消息邮箱指针,注意查看peerr指针是否成功返回
OSMboxPost发送消息邮箱
OSMboxPostOpt 以广播的形式事件等待任务表中全部任务发送消息
OSMboxQuery 查询邮箱状态
OSMboxDel 删除邮箱
最后还有一个消息队列
ucos事件邮箱信号量队列详解的更多相关文章
- 数据结构图文解析之:队列详解与C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- Java自带线程池和队列详解
Java线程池使用说明 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后 ...
- 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码
详解C#泛型(二) 一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...
- Ucos系统任务间的通信详解
物联网开发中,ucos系统任务间的通信是指,两个任务之间有数据的交互,具体的一起来看看吧. 1)消息邮箱 我们还是提供两个任务Task1和Task2,假设我们还是解决刚刚的问题,Task1进行按键扫描 ...
- 【转】windows消息和消息队列详解
转载出处:http://blog.csdn.net/bichenggui/article/details/4677494 windows消息和消息队列 与基于MS - DOS的应用程序不同,Wind ...
- Uploadify 3.2 参数属性、事件、方法函数详解
一.属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 . buttonClass ” 按钮样式 buttonCursor ‘ ...
- IPC之消息队列详解与使用
一. 概念 消息队列就是一个消息的链表.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权限的进程可以从消息队列中读出消息.消息队列是随内核持续的.下面介绍三个概念: ...
- (转)Uploadify 3.2 参数属性、事件、方法函数详解
转自http://blog.sina.com.cn/s/blog_5079086b0101fkmh.html Hallelujah博客 一.属性 属性名称 默认值 说明 auto true 设置为tr ...
- selenium+python自动化94-行为事件(ActionChains)源码详解
ActionChains简介 actionchains是selenium里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互. 这对于做更复杂的动作非常有用,比如悬停 ...
随机推荐
- 基于Sublime Text搭建Python IDE
http://loosky.net/2967.html(包括SublimeREPL插件的安装和设置快捷键) SublimeCodeIntel,智能提示功能,查找自定义函数引用的快捷键--Alt+鼠标左 ...
- jenkins插件 build-name-setter
#${BUILD_NUMBER}-${PROJECT_NAME}-${ENV,var="VARIABLENAME"}-${ENV,var="BUILD_USER" ...
- http协议--笔记
HTTP协议的缺点:1.通信使用明文(不加密),内容可能会被窃听2.不验证通信方的身份,因此有可能遭遇伪装3.无法证明报文的完整性,所以有可能已遭篡改 防止窃听保护信息的几种对策:加密技术通信的加密H ...
- JS 新浪API获取IP归属地
http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 返回值数据格式:var remote_ip_info = {“ret”:1,” ...
- Lucene入门教程(转载)
http://blog.csdn.net/tianlincao/article/details/6867127 Lucene教程 1 lucene简介 1.1 什么是lucene Lucene ...
- Map 根据value 排序
总是有特殊的需求 ,呵呵 ,一起看看Map 根据value 排序的一个例子吧,还用到了泛型 很不错 此文仅供自己记录笔记. /** * hashmap 根据值排序 */ public static & ...
- 【Qt开发】修改源码文件的编码格式的小技巧 .
默认情况下,代码文件应该以utf-8的格式来存储的.而如果在代码文件的转移或者上传下载过程中,弄乱了文件的编码格式,一般会出现乱码的情况. 例如windows系统下,中文就很容易出现乱码,如下图,文件 ...
- POJ - 2336 Wireless Network
Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have ...
- hahah
ۣۣۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖ ...
- HDU 2444 The Accomodation of Students
首先是要构造二分图,然后二分图的最大匹配. 还有没完全证明过我的方法的正确性,但是AC了..... #include<cstdio> #include<cstring> #in ...