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 任务间同步源码分析(一)相关推荐

  1. Tomcat集群应用同步 —— 源码分析

    文章目录 前言 一.应用同步的配置与实现原理 二.应用同步源码分析 三.如何获取集群的节点列表 四.通讯模块Tribe 五.集群的Session同步 六.集群的Session共享 总结 前言 相信大家 ...

  2. Android SQLite多线程读写和线程同步源码分析

    没啥诀窍,只需保证几个线程都是用的一个SQLiteDataBase对象就行了. 如果我们非要在不同线程中用两个或更多的SQLiteDataBase对象呢,当然这些SQLiteDataBase对象所操作 ...

  3. Redis源码分析之PSYNC同步

    Redis master-slave 同步源码分析 (1)slave 流程分析 (2)master 流程分析 Slave 分析 当Redis 启动后,会每隔 1s 调用 replicationCron ...

  4. ffplay源码分析4-音视频同步

    ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放.本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下: https://gith ...

  5. OkHttpClient源码分析(一)—— 同步、异步请求分析和Dispatcher的任务调度

    OkHttpClient同步请求的执行流程和源码分析 同步请求示例 OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout ...

  6. linux内存源码分析 - 内存压缩(同步关系)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也 ...

  7. concurrent(六)同步辅助器CyclicBarrier 源码分析

    参考文档: Java多线程系列--"JUC锁"10之 CyclicBarrier原理和示例:https://www.cnblogs.com/skywang12345/p/35339 ...

  8. 【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  9. Okhttp同步请求源码分析

    进阶android,OKhttp源码分析--同步请求的源码分析 OKhttp是我们经常用到的框架,作为开发者们,我们不单单要学会灵活使用,还要知道他的源码是如何设计的. 今天我们来分析一下OKhttp ...

最新文章

  1. FFmpeg windows软件开发环境搭建
  2. 使用微型计算机的基础知识,计算机应用基础考试大纲基本要求1具有使用微型计算机的基础知识.DOC...
  3. windows 下Android的开发准备
  4. 关于多目标任务有趣的融合方式
  5. “低代码”开发管理应用,这家大型连锁企业也说好
  6. 钢琴块2电脑版_云上钢琴学生端电脑版|云上钢琴学生端 V2.3.1 最新PC版 下载_当下软件园...
  7. Oracle时间函数(转)
  8. 面试者应向公司问什么问题?
  9. docker常用命令
  10. 【vscode】MarkDown 插入视频标签
  11. 优维助力国内某省级商业银行同城异地灾备自动化建设
  12. 别傻了!不能只会给别人开热点,要尝试华为手机的WiFi分享功能
  13. Eclipes下载安装
  14. react native 使用阿里字体图标库
  15. 从easyui页面导出excel
  16. BBS 与 BLog(博客)的区别到底是什么?[转载]
  17. C语言函数:tolower()、toupper字符大小写转换函数。
  18. 关于养猫的简单经验教训
  19. 《论文笔记》Autonomous Robotic Exploration Based on Multiple Rapidly-exploring
  20. UVA11183 Teen Girl Squad —— 最小树形图

热门文章

  1. 基于 Workman 实现Web扫描登录
  2. Linux之cut命令
  3. 《机器学习系统设计:Python语言实现》一2.2 IPython控制台
  4. 1. 搭建scapy
  5. 让一个DIV对齐到底部
  6. 老李分享:《Java Performance》笔记1——性能分析基础
  7. 常用MySQL数据库命令总结
  8. FireWire笔记
  9. oracle把所有表查询权限赋与另一用户
  10. 动态ip软件win7_IPXE+ISCSI Target安装WIN7