(uC/OS-II学习笔记)关于共享资源与信号量
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学习笔记)关于共享资源与信号量相关推荐
- UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机
UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...
- jmh学习笔记-State共享对象
系列文章目录 jmh学习笔记-源代码编译与bench mode jmh学习笔记-State共享对象 jmh学习笔记-State共享对象前后置方法 jmh学习笔记-代码清除 jmh学习笔记-常量折叠 j ...
- uC/OS-II系统学习笔记(4)—— uC/OS-II概述上篇
1 临界段 uC/OS-II在处理临界段代码时,是需要关闭中断的,处理完毕之后再开中断,这使得uC/OS-II能够避免同时有其他任务或中断服务进入临界代码段. uC/OS-II定义了两个宏(macro ...
- Lab 6:uC/OS II
为什么80%的码农都做不了架构师?>>> 目标: 移植uC/OS II到RPi上,实现两个任务的调度.这两个任务能轮流点亮LED,并通过串口发送消息表明自己正在运行 具体步骤: ...
- uc/OS II——多任务设计
uc/OS II--多任务设计 (1)设计 开始任务 [1]/声明 开始任务 任务块 static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; ...
- Windows事件等待学习笔记(四)—— 事件信号量互斥体
Windows事件等待学习笔记(四)-- 事件&信号量&互斥体 要点回顾 事件 实验:验证SignalState 第一步:编译并运行以下代码 第二步:观察结果 第三步:修改代码并执行 ...
- SilverLight学习笔记--关于Silverlight资源文件(如:图片)的放置位置及其引用
Silverlight中有许多资源文件,例如:图片,音频.视频,甚至XML和XAML等非执行数据文件,在Silverlight中根据资源所处位置的不同而有所区别. 资源文件可分布在我们Silve ...
- linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机
一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来接收数据. 2.在进行串行通信时,双方遵循相同的通信 ...
- 工程师的NIOS II学习笔记(转)
来源:嵌入式在线 作者:山城棒棒儿军 发布时间:2009-09-22 12:29:31 Nios Development Board Reference Manual, Stratix II Edit ...
最新文章
- After paper reading.......
- 分享-利用VPC防止病毒软件的进入你的windows电脑
- Linux: 系统文件权限总结
- Internet路由结构学习心得二:通告汇聚和具体路由影响AS入流量
- Python 语法糖
- 0宽字符加密_vulnhub实战靶场攻略:Breach 1.0
- 基于表征(Representation)的文本匹配、信息检索、向量召回的方法总结
- YASKAWA 安川变频器调试软件支持多种机型
- 2012最热门软件游戏下载Top搜集(热门影音,游戏,办公软件大集合)
- 低密度奇偶校验码(LDPC)GMSK调制解调器 毕业设计
- interspeech2021论文集下载地址
- ArduinoUNO实战-第一章-LED闪烁实验
- Axure如何实现标签切换功能
- 天融信EDR或企业安全终端卸载需要密码解决办法
- 如何通过简历推销自己
- 【转载】阿里面试回来,想和Java程序员谈一谈
- 通达信股票支撑点选股公式主图/副图 无未来
- application.yaml配置详解
- Coredata的版本升级
- 蓝牙配对不弹配对框_人工智能和字体配对