uC/os-ii中任务间相互通信的媒介叫做事件。

关于OS_EVENT数据结构

#if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u)typedef struct os_event{INT8U    OSEventType;                    /* Type of event control block (see OS_EVENT_TYPE_xxxx)    */void    *OSEventPtr;                     /* Pointer to message or queue structure                   */INT16U   OSEventCnt;                     /* Semaphore Count (not used if other EVENT type)          */OS_PRIO  OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */OS_PRIO  OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur                */#if OS_EVENT_NAME_EN > 0uINT8U   *OSEventName;
#endif} OS_EVENT;
#endif

OSEventType:事件类型(信号量、互斥信号量、邮箱、消息列队)
OSEventCnt:计数器
OSEventPtr:指向一个消息
OSEventGrp与OSEventTbl[OS_EVENT_TBL_SIZE]:等待事件任务(类似于OSRdyTbl[]和OSRdyGrp)

事件块实质是一个链表

不同的任务如果使用共享资源,可能会出错。信号量类似于共享资源访问的一个标志。比如……我们把串口终端当做一个资源。TASK_1与TASK_2(TASK1优先级高于TASK_2)
OS_EVENT MyFirstSem;
char * CommonzSoure = "";void Task_1(void *pdata)
{U32 i;#if OS_CRITICAL_METHOD == 3   //关中断的方法为3OS_CPU_SR cpu_sr;
#endifOS_ENTER_CRITICAL();OS_CPU_SysTickInit(100000000/OS_TICKS_PER_SEC);OS_EXIT_CRITICAL();OSStatInit();   //统计任务 优先级最低
       MyFirstSem = *(OSSemCreate(1));//PIT0_Init(50000000);UART4_Init(115200);init_LED();pdata = pdata;                                while(1){CommonzSoure = "TASK1 Using Common source ";for(i=0;CommonzSoure[i];i++)Uart4_SendByte(CommonzSoure[i]);OSTimeDly(1);       }}void Task_2(void *pdata)
{U32 i;pdata = pdata;                                while(1){CommonzSoure = "TASK2 Using Common source ";for(i=0;CommonzSoure[i];i++)Uart4_SendByte(CommonzSoure[i]);  }}

任务1发送数据“TASK1 Using Common source”

任务2发送数据“TASK2 Using Common source”

任务切换的时候 数据发送会出错。(比如我们把串口终端当做一个实体的打印机)

如果加入信号量(标记共享资源)

OS_EVENT MyFirstSem;
char * CommonzSoure = "";void Task_1(void *pdata)
{U32 i;U8 err;#if OS_CRITICAL_METHOD == 3   //关中断的方法为3OS_CPU_SR cpu_sr;
#endifOS_ENTER_CRITICAL();OS_CPU_SysTickInit(100000000/OS_TICKS_PER_SEC);OS_EXIT_CRITICAL();OSStatInit();   //统计任务 优先级最低
       MyFirstSem = *(OSSemCreate(1));//PIT0_Init(50000000);UART4_Init(115200);init_LED();pdata = pdata;                                while(1){OSSemPend(&MyFirstSem,0,&err);CommonzSoure = "TASK1 Using Common source ";for(i=0;CommonzSoure[i];i++)Uart4_SendByte(CommonzSoure[i]);OSSemPost(&MyFirstSem);OSTimeDly(1);       }}void Task_2(void *pdata)
{U32 i;U8 err;    pdata = pdata;                                while(1){OSSemPend(&MyFirstSem,0,&err); CommonzSoure = "TASK2 Using Common source ";for(i=0;CommonzSoure[i];i++)Uart4_SendByte(CommonzSoure[i]); OSSemPost(&MyFirstSem);}}

OSSemAccept()可以无等待请求一个信号量。

该函数只简单返回OSEventCnt的值,并在OSEventCnt值为真的时候做OSEventCnt--;

调用OSSemAccept()函数,……不过目测资源都被TASK_2独占了。→_→

同样,信号量也可以用于限制某个资源的任务个数。

关于优先级反转与互斥信号量。

信号量的使用可能会导致优先级反转。

比如……

由于任务C(低)得到信号量,任务A等待。任务B的优先级高于任务C,故任务B先运行。直到任务B,C运行完,任务C释放信号量,优先级最高的任务A才得到CPU资源。

防止优先级反转的方法,在任务C得到信号量时把任务C的优先级升高,结束后再恢复。

uC/OS-II,互斥信号量机制可以防止优先级反转。

由于uC/OS-II不支持相同优先级,互斥信号量机制,可以使某个人物得到信号量时,优先级提到共享相同资源任务最高。

OSMutexCreate(INT8U prio,INT8U *error)

创建互斥信号量。

uC/OS-II互斥信号量支持六种操作:创建、删除、等待、释放、无条件等待获取互斥信号量、获取互斥信号量当前状态。

转载于:https://www.cnblogs.com/hebaichuanyeah/p/3244962.html

(uC/OS-II学习笔记)关于共享资源与信号量相关推荐

  1. UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机

    UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...

  2. jmh学习笔记-State共享对象

    系列文章目录 jmh学习笔记-源代码编译与bench mode jmh学习笔记-State共享对象 jmh学习笔记-State共享对象前后置方法 jmh学习笔记-代码清除 jmh学习笔记-常量折叠 j ...

  3. uC/OS-II系统学习笔记(4)—— uC/OS-II概述上篇

    1 临界段 uC/OS-II在处理临界段代码时,是需要关闭中断的,处理完毕之后再开中断,这使得uC/OS-II能够避免同时有其他任务或中断服务进入临界代码段. uC/OS-II定义了两个宏(macro ...

  4. Lab 6:uC/OS II

    为什么80%的码农都做不了架构师?>>>    目标: 移植uC/OS II到RPi上,实现两个任务的调度.这两个任务能轮流点亮LED,并通过串口发送消息表明自己正在运行 具体步骤: ...

  5. uc/OS II——多任务设计

    uc/OS II--多任务设计 (1)设计 开始任务 [1]/声明 开始任务 任务块 static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; ...

  6. Windows事件等待学习笔记(四)—— 事件信号量互斥体

    Windows事件等待学习笔记(四)-- 事件&信号量&互斥体 要点回顾 事件 实验:验证SignalState 第一步:编译并运行以下代码 第二步:观察结果 第三步:修改代码并执行 ...

  7. SilverLight学习笔记--关于Silverlight资源文件(如:图片)的放置位置及其引用

    Silverlight中有许多资源文件,例如:图片,音频.视频,甚至XML和XAML等非执行数据文件,在Silverlight中根据资源所处位置的不同而有所区别.    资源文件可分布在我们Silve ...

  8. linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机

    一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来接收数据. 2.在进行串行通信时,双方遵循相同的通信 ...

  9. 工程师的NIOS II学习笔记(转)

    来源:嵌入式在线 作者:山城棒棒儿军 发布时间:2009-09-22 12:29:31 Nios Development Board Reference Manual, Stratix II Edit ...

最新文章

  1. After paper reading.......
  2. 分享-利用VPC防止病毒软件的进入你的windows电脑
  3. Linux: 系统文件权限总结
  4. Internet路由结构学习心得二:通告汇聚和具体路由影响AS入流量
  5. Python 语法糖
  6. 0宽字符加密_vulnhub实战靶场攻略:Breach 1.0
  7. 基于表征(Representation)的文本匹配、信息检索、向量召回的方法总结
  8. YASKAWA 安川变频器调试软件支持多种机型
  9. 2012最热门软件游戏下载Top搜集(热门影音,游戏,办公软件大集合)
  10. 低密度奇偶校验码(LDPC)GMSK调制解调器 毕业设计
  11. interspeech2021论文集下载地址
  12. ArduinoUNO实战-第一章-LED闪烁实验
  13. Axure如何实现标签切换功能
  14. 天融信EDR或企业安全终端卸载需要密码解决办法
  15. 如何通过简历推销自己
  16. 【转载】阿里面试回来,想和Java程序员谈一谈
  17. 通达信股票支撑点选股公式主图/副图 无未来
  18. application.yaml配置详解
  19. Coredata的版本升级
  20. 蓝牙配对不弹配对框_人工智能和字体配对

热门文章

  1. VMware 克隆虚拟机后网卡无法启动
  2. linux web服务器,防火墙iptables最简配置
  3. zTree的拖拽排序
  4. 关于MVC4项目从32位机移到64位机编译报错解决方案
  5. 判断变量定义和变量为空问题
  6. leetcode处女作
  7. [数字图像处理]图像去噪初步(2)--非线性滤波器
  8. 10款人气暴涨的PHP开源工具
  9. 『原创』再谈用 php 实现域名 whois 信息查询
  10. 发现了一个很好的做excel、ppt 水晶易表、spss的好网站