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里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互. 这对于做更复杂的动作非常有用,比如悬停 ...
随机推荐
- org.apache.lucene.queryParser.ParseException: Encountered "<EOF>" at line 1, column 0.
如果出现了下列错误,那是因为用错了函数.把queryParser.Query改称queryParser.parse就通过了 org.apache.lucene.queryParser.ParseExc ...
- UVA - 12563 Jin Ge Jin Qu hao (01背包变形)
此题应该注意两个点,首先背包容量应该缩减为t-1,因为最长的歌不超过三分钟,而劲歌金曲有678s,所以肯定要留出这个时间来.其次注意优先级,保证唱的歌曲数目最多,在此前提下尽可能的延长时间. 处理方法 ...
- GB2312、Unicode编码等
抛出问题: 我在CPP文件中,打算输出一行阿拉伯字符:
- 简单实现contentOS下开机自动启动tomcat
看过网上很多写tomcat开机自启动的例子,很多都是写了一个比较复杂的脚步.找到一个比较简单的. 首先编辑 vi /etc/rc.d/rc.local 在尾部加入 export JDK_HOME=/u ...
- 用phpstudy搭建dedecms网站验证码出不来解决方案
验证码图片不显示,这应该是很多站长朋友们最长遇到的一个问题,本地测试明明好好的,为什么传上空间或者服务器上验证码就无法显示了呢,春哥分析这可能是由于没有加载gd库扩展所引起的,那么怎么解决呢?由于引起 ...
- 浅谈:html5和html的区别
什么是html5呢? html5最先由WHATWG(Web 超文本应用技术工作组)命名的一种超文本标记语言,随后和W3C的xhtml2.0(标准)相结合,产生现在最新一代的超文本标记语言.可以简单点理 ...
- DNS开源服务器BIND最小配置详解<转>
一,简介 相对于存储和大数据领域,CDN是一个相对小的领域,但行行出状元,BIND就是CDN领域的蝉联N届的状元郎.BIND是一款非常常用的DNS开源服务器,全球有90%的DNS用BIND实现.值得一 ...
- zf-关于表单不能提交的bug修改
因为使用onclick="submitForm();" 函数提交的 就表示 这里面有js代码 js代码 里面使用document.from1.submit()提交的 所以from ...
- angularJS在创建指令需要注意的问题(指令中使用ngRepeat)
现在发现,当初的自己真的是太菜了,为什么你在指令中更改数据,没有作用呢?这其实是原型链的问题. 详细的我就不在这里说了,有位大神早已发布了这个内容,在这里复制个地址给大家,有兴趣的可以看看 http: ...
- [转]读取assets目录下的数据库文件
在做Android应用的时候,不可避免要用到数据库.但是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的. (PS:这篇博客解决了我前面博客中 ...