ucos-II 任务间同步源码分析(一)
ucos-II 任务间的同步主要有三个部分,信号量、互斥性信号量和事件标志组,前两者都基于事件机制完成(见ucos-II 事件控制块)。本文主要记录信号量和互斥信号量的分析。
1. 信号量SEM的主要接口函数
- 建立一个信号量:OS_EVENT *OSSemCreate(INT16U cnt);创建一个OS_EVENT_TYPE_SEM类型的事件块,将cnt赋值给OSEventCnt,可表示共享资源的数量;
- 删除一个信号量:OSSemDel();在删除一个信号量时需要考虑当前是否有任务因为该信号量而挂起,此时有两种删除方式,一种是OS_DEL_NO_PEND,它要求删除该信号量时没有任务因为该信号量被挂起,否则会返回错误;另外一种是OS_DEL_ALWAYS,这个时候信号量一定被删除,但删除前所有的等待任务都会被加入就绪队列,如下:
case OS_DEL_ALWAYS: /* Always delete the semaphore */while (pevent->OSEventGrp != 0u) { /* Ready ALL tasks waiting for semaphore */(void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);}
- 等待一个信号量:OSSemPend():首先判断当前的信号量是否存在(if(pevent -> OSEventCnt > 0)),如果存在则减去一个资源量返回;否则调用该函数的任务将置状态为OS_STAT_SEM,调用OS_EventTaskWait和OS_Sched后进入等待状态。
- 发出一个信号量:OSSemPost();通过EVENT机制,选择等待该信号量的优先级最高的任务进入就绪队列并调度;信号量增加 pevent -> OSEventCnt ++;
2. 互斥信号量(Mutex)的主要接口函数
mutex的目的在于解决共享资源的独占处理,为了解决该共享过程中的优先级翻转问题。mutex是所有任务间同步、通信手段中唯一不采用改变任务状态(挂起),而是通过调整任务优先级的形式触发调度。
- 建立一个mutex OS_EVENT *OSMutexCreate(INT8U prio, INT8U *err); mutex在创建时需要赋给一个优先级,函数处理如下:删除一个mutex,OSMutexDel(),该函数的机制与OSSemDel几乎一模一样,此处不做赘述;
- 确认该mutex的优先级是唯一的,不存在任务已经占用该优先级;否则返回错误;
- 更新OSTCBPrioTbl相应位,表示该优先级已被占用;
- 建立一个OS_EVNET_TYPE_MUTEX的事件;并在OSEventCnt中保存这个优先级(高8位保存优先级,低8位保存mutex有效标志);
pevent->OSEventType = OS_EVENT_TYPE_MUTEX;pevent->OSEventCnt = (INT16U)((INT16U)prio << 8u) | OS_MUTEX_AVAILABLE; /* Resource is avail. */pevent->OSEventPtr = (void *)0;
- 等待一个mutex挂起:OSMutexPend(), 函数处理如下:
- 如果当前mutex有效,即未被占用,则 1.置该mutex为无效;2.在OSEventCnt中保存当前任务的优先级;3.在mutex的OSEventPtr中保存当前任务的TCB地址;否则
- 获取mutex的优先级,如果当前任务的优先级小与占用该mutex任务的优先级,则该任务的优先级被设置为mutex的优先级并挂起;
- 释放一个互斥信号量 OSMutexPost(),函数处理如下:
- 如果当前任务的优先级等于mutex的优先级(即在上次OSMutexPend时被提升了优先级),则恢复该任务原本优先级;
- 若当前存在等待该mutex的任务则调用OS_EventTaskRdy和OS_Sched唤醒;
例子:优先级反转的情况,低优先级占用mutex后,被中优先级抢断挂起,高优先级需要mutex则必须等待中优先级任务结束。在ucos-II 中 高优先级需要mutex时,即调用OSMutexPend时,原本占用mutex的低优先级任务会调整优先级至mutex的优先级。然后再OSMutexPost时再把优先级调整回原来的优先级。
转载于:https://www.cnblogs.com/Fredric-2013/archive/2013/01/25/2875684.html
ucos-II 任务间同步源码分析(一)相关推荐
- Tomcat集群应用同步 —— 源码分析
文章目录 前言 一.应用同步的配置与实现原理 二.应用同步源码分析 三.如何获取集群的节点列表 四.通讯模块Tribe 五.集群的Session同步 六.集群的Session共享 总结 前言 相信大家 ...
- Android SQLite多线程读写和线程同步源码分析
没啥诀窍,只需保证几个线程都是用的一个SQLiteDataBase对象就行了. 如果我们非要在不同线程中用两个或更多的SQLiteDataBase对象呢,当然这些SQLiteDataBase对象所操作 ...
- Redis源码分析之PSYNC同步
Redis master-slave 同步源码分析 (1)slave 流程分析 (2)master 流程分析 Slave 分析 当Redis 启动后,会每隔 1s 调用 replicationCron ...
- ffplay源码分析4-音视频同步
ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放.本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下: https://gith ...
- OkHttpClient源码分析(一)—— 同步、异步请求分析和Dispatcher的任务调度
OkHttpClient同步请求的执行流程和源码分析 同步请求示例 OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout ...
- linux内存源码分析 - 内存压缩(同步关系)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也 ...
- concurrent(六)同步辅助器CyclicBarrier 源码分析
参考文档: Java多线程系列--"JUC锁"10之 CyclicBarrier原理和示例:https://www.cnblogs.com/skywang12345/p/35339 ...
- 【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )
OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...
- Okhttp同步请求源码分析
进阶android,OKhttp源码分析--同步请求的源码分析 OKhttp是我们经常用到的框架,作为开发者们,我们不单单要学会灵活使用,还要知道他的源码是如何设计的. 今天我们来分析一下OKhttp ...
最新文章
- FFmpeg windows软件开发环境搭建
- 使用微型计算机的基础知识,计算机应用基础考试大纲基本要求1具有使用微型计算机的基础知识.DOC...
- windows 下Android的开发准备
- 关于多目标任务有趣的融合方式
- “低代码”开发管理应用,这家大型连锁企业也说好
- 钢琴块2电脑版_云上钢琴学生端电脑版|云上钢琴学生端 V2.3.1 最新PC版 下载_当下软件园...
- Oracle时间函数(转)
- 面试者应向公司问什么问题?
- docker常用命令
- 【vscode】MarkDown 插入视频标签
- 优维助力国内某省级商业银行同城异地灾备自动化建设
- 别傻了!不能只会给别人开热点,要尝试华为手机的WiFi分享功能
- Eclipes下载安装
- react native 使用阿里字体图标库
- 从easyui页面导出excel
- BBS 与 BLog(博客)的区别到底是什么?[转载]
- C语言函数:tolower()、toupper字符大小写转换函数。
- 关于养猫的简单经验教训
- 《论文笔记》Autonomous Robotic Exploration Based on Multiple Rapidly-exploring
- UVA11183 Teen Girl Squad —— 最小树形图