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里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互. 这对于做更复杂的动作非常有用,比如悬停 ...
随机推荐
- frame、bounds表示大小和位置的属性以及center、position、anchorPosition
在iOS开发开发过程中经常会用到界面元素的frame.bounds表示大小和位置的属性以及center.position.anchorPosition等单纯表示位置的属性.这些属性究竟什么含义?彼此间 ...
- POJ 1236 Network of Schools(tarjan算法 + LCA)
这个题目网上有很多答案,代码也很像,不排除我的.大家的思路应该都是taijan求出割边,然后找两个点的LCA(最近公共祖先),这两个点和LCA以及其他点构成了一个环,我们判断这个环上的割边有几条,我们 ...
- Itext简绍及操作PDF文件
iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转 ...
- redis 持久化与备份策略 【转载】
本文转载自 http://blog.csdn.net/is_zhoufeng/article/details/10210353 持久化(persistence) 本文是 Redis 持久化文档 的中文 ...
- edittext判断获取焦点 有焦点显示clear
mPhoneEt.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange( ...
- 关于自定义jar包(tomcat)的添加
1 鼠标右击工程 选择 properties 或者 Ait + Enter 2 选择Libraries 3 点击Add Library... 4 选择User Library 点击 Next 5 如 ...
- Asp获取网址相关参数大全
Asp获取网址相关参数大全 代码一:[获取地址中的文件名,不包含扩展名]<%dim Url,FileName,File Url=split(request.servervariables(& ...
- vs2005中分割线怎么插入
用Label控件,将Label控件的AutoSize设为False,然后清除Text属性,再将BorderStyle属性设为Fixed3D,宽度设为2个像素,就可以成为分割线. 效果:
- apache服务器中设置目录不可访问
<Directory "d:/amp/apache/htdocs/images"> Allow from all Options None</Dire ...
- git分支综述
对git不是很熟悉,有个问题要弄清楚一下. 假如远程仓库有 dev 和 master 两个分支,master 作为一个稳定版分支,可用于直接发布产品,日常的开发则 push 到 dev 分支,那我本地 ...