RTOSuCOSII原理及应用.ppt

上传人:文库蛋蛋多 文档编号:2337746 上传时间:2023-02-12 格式:PPT 页数:94 大小:1.49MB
返回 下载 相关 举报
RTOSuCOSII原理及应用.ppt_第1页
第1页 / 共94页
RTOSuCOSII原理及应用.ppt_第2页
第2页 / 共94页
RTOSuCOSII原理及应用.ppt_第3页
第3页 / 共94页
RTOSuCOSII原理及应用.ppt_第4页
第4页 / 共94页
RTOSuCOSII原理及应用.ppt_第5页
第5页 / 共94页
点击查看更多>>
资源描述

《RTOSuCOSII原理及应用.ppt》由会员分享,可在线阅读,更多相关《RTOSuCOSII原理及应用.ppt(94页珍藏版)》请在三一办公上搜索。

1、山东科技大学 信息学院,1,2023/2/12,嵌入式实时操作系统 C/OS-II,2023/2/12,山东科技大学 信息学院,2,第4章 任务的同步与通信,山东科技大学 信息学院,3,2023/2/12,第4章 任务的同步与通信,一个应用系统通常是由多个任务组成,任务之间互相协作共同完成目标功能。例如任务对共享资源竞争,先采集数据才能处理数据等情况。(任务的同步控制,共享资源的竞争,任务间的通信等问题的解决方案-OS)任务间的同步-任务间的制约、合作运行机制。系统各任务之间通过“任务通信”的方式,实现任务的信息传递和同步控制,“任务通信”的载体就是-事件。常用的事件:信号量(计数型-SEM/

2、互斥型-MUTEX)、消息邮箱(MBOX)、消息队列(Q)、事件标志组等。事件用“事件控制块”(ECB)来描述。,山东科技大学 信息学院,4,2023/2/12,第4章 目录,1、任务间的同步和事件控制块2、信号量及其操作3、互斥型信号量和任务优先级反转4、消息邮箱及其操作5、消息队列及其操作,山东科技大学 信息学院,5,2023/2/12,第4章 目录,1、任务间的同步和事件控制块2、信号量及其操作3、互斥型信号量和任务优先级反转4、消息邮箱及其操作5、消息队列及其操作,山东科技大学 信息学院,6,2023/2/12,4.1 任务间的同步和事件控制块,任务间的同步-各任务运行的先后、触发等关

3、系,备注:数据采集任务A 和数据处理任务B 之间存在同步关系。,山东科技大学 信息学院,7,2023/2/12,4.1 任务间的同步和事件控制块,任务间的互斥-共享资源的申请使用,备注:数据采集任务A 和数据处理任务B 之间存在互斥关系。,山东科技大学 信息学院,8,2023/2/12,4.1 任务间的同步和事件控制块,任务之间的这种相互制约、相互合作的运行机制称为“任务间的同步”系统中任务之间相互传递事件,来实现任务的同步、协作。,备注:用户自定义全局变量的方法,也可以编程实现程序间的信息传递。但如果想将信息传递的各项功能作完备,工作量是比较大的。况且,这类需求在应用系统设计中是很常用的。u

4、C/OS-II 中将此类工作以系统功能方式提供与用户-事件操作。,山东科技大学 信息学院,9,2023/2/12,举例:任务间的共享资源竞争问题及处理方式。,某一分布式系统,需要主设备(M_Dev)使用同一个UART 资源分别与从设备1(S_Dev1)和从设备2(S_Dev2)以不同的“串行通信模式”进行通信。,山东科技大学 信息学院,10,2023/2/12,void main(void)/系统主函数 OSInit();.;OSTaskCreate(Task_A,(void*)pdata,.);OSTaskCreate(Task_B,(void*)pdata,.);.;OSStart();,

5、void Task_A(void*pdata).;/Task_A环境初始化 for(;).;/Task_A 业务 OSTaskCreate(UART_S1_Task,(void*)US1,.);.;/Task_A 业务 OSTimeDly(xxx);,void Task_B(void*pdata).;/Task_B环境初始化 for(;).;/Task_B 业务 OSTaskCreate(UART_S2_Task,(void*)US2,.);.;/Task_B 业务 OSTimeDly(yyy);,说明:如此设计未对共享资源作任何约束,实际运行中可能发生Task_A与Task_B 冲突竞争。,

6、BOOLEAN uart_key;void main(void)/系统主函数 OSInit();.;uart_key=TRUE;OSTaskCreate(Task_A,(void*)pdata,.);OSTaskCreate(Task_B,(void*)pdata,.);.;OSStart();,void Task_A(void*pdata).;/Task_A环境初始化 for(;).;/Task_A 业务 if(uart_key)uart_key=FALSE;OSTaskCreate(UART_S1_Task,(void*)US1,.);uart_key=TRUE;.;/Task_A 业务

7、OSTimeDly(xxx);,void Task_B(void*pdata).;/Task_B环境初始化 for(;).;/Task_B 业务 if(uart_key)uart_key=FALSE;OSTaskCreate(UART_S2_Task,(void*)US2,.);uart_key=TRUE;.;/Task_B 业务 OSTimeDly(yyy);,(互斥型任务处理)说明:通过用户定义全局变量uart_key 对任务使用共享资源作约束,可以避免Task_A与Task_B 冲突竞争,但其管理性能支持较弱。,void*msg_ptr;INT16U AD_Value;void main

8、(void)/系统主函数 OSInit();.;OSTaskCreate(Task_A,(void*)pdata,.);OSTaskCreate(Task_B,(void*)pdata,.);.;OSStart();,void Task_A(void*pdata).;/Task_A环境初始化 for(;).;/Task_A 业务 if(msg_ptr=NULL)Signal_Capture(AD_Value);/采集数据 msg_ptr=,void Task_B(void*pdata).;/Task_B环境初始化 INT16U AD_B;for(;).;/Task_B 业务 if(msg_pt

9、r!=NULL)AD_B=*msg_ptr;/数据处理 msg_ptr=NULL;.;/Task_B 业务 OSTimeDly(yyy);,(带数据传递的协作型任务处理)说明:Task_A数据采集任务,Task_B数据处理任务;通过用户定义全局指针变量msg_ptr 对(采集、处理数据)任务作约束,可以协调Task_A与Task_B,但其管理性能支持较弱。,山东科技大学 信息学院,13,2023/2/12,4.1 任务间的同步和事件控制块,事件,汉语中所谓的“事件”,是指一个事情的发生。在 uC/OS-II 中将信号量、消息邮箱和消息队列的一个存在称为一个事件,事件操作:创建、发送、请求和删除

10、等。(uC/OS的原作者将“事件-EVENT”理解为静态的数据结构。)发送事件-向信号量、消息邮箱和消息队列的一次信息发送(写-Post)操作。请求事件-对信号量、消息邮箱和消息队列的一次查询(读-Pend)操作。uC/OS-II 中以系统函数的方式向任务提供事件操作。,山东科技大学 信息学院,14,2023/2/12,4.1 任务间的同步和事件控制块,事件(1)-信号量(Sem/Mutex),两类信号量:互斥信号量-Mutex、计数型信号量-Sem;互斥信号量是一个二值信号量,主要用于“独占式共享资源”的管理(例如:打印机)。计数型信号量用以“多个同类型资源”的管理,通常用一个计数器实现(例

11、如:存储块)。,BOOLEAN uart_key;/互斥标志void main(void)/系统主函数 OSInit();.;uart_key=TRUE;OSTaskCreate(Task_A,(void*)pdata,.);OSTaskCreate(Task_B,(void*)pdata,.);.;OSStart();,void Task_A(void*pdata).;/Task_A环境初始化 for(;).;/Task_A 业务 if(uart_key)uart_key=FALSE;OSTaskCreate(UART_S1_Task,(void*)US1,.);uart_key=TRUE;

12、.;/Task_A 业务 OSTimeDly(xxx);,void Task_B(void*pdata).;/Task_B环境初始化 for(;).;/Task_B 业务 if(uart_key)uart_key=FALSE;OSTaskCreate(UART_S2_Task,(void*)US2,.);uart_key=TRUE;.;/Task_B 业务 OSTimeDly(yyy);,(互斥型任务处理)说明:通过用户定义全局变量uart_key 对任务使用共享资源作约束,可以避免Task_A与Task_B 冲突竞争,但其管理性能支持较弱。,山东科技大学 信息学院,16,2023/2/12,

13、4.1 任务间的同步和事件控制块,事件(2)-消息邮箱(Mbox),用于解决任务间的数据传送问题。,在多任务OS中采用消息传送的方式实现任务间的“单批次数据”通信,这个数据称为“消息”。,例如:Task_A 采集一个数据,Task_B 要使用 Task_A 采集的数据。,原理:在内存中创建数据传送缓冲区(消息缓冲区),通过传送该缓冲区的地址指针传递数据。,这个缓冲区指针的数据结构称为“消息邮箱”。,山东科技大学 信息学院,17,2023/2/12,4.1 任务间的同步和事件控制块,事件(2)-消息邮箱(Mbox),山东科技大学 信息学院,18,2023/2/12,4.1 任务间的同步和事件控制

14、块,事件(2)-消息邮箱(Mbox),试验:1、(传统的全局变量方式-数据传送)Task_A 每次按键“计数”+1,并传送“计数”数据,Task_B 在LED 或 LCD 显示收到的该数据。2、用消息邮箱方式-数据传送;Task_A 每次按键“计数”+1,并传送“计数”数据,Task_B 在LED 或 LCD 显示收到的该数据。比较两种程序设计风格,分析代码执行效率;E_RTOS uC/OS-II 任哲 Page 107 Exp 4-3,山东科技大学 信息学院,19,2023/2/12,4.1 任务间的同步和事件控制块,事件(3)-消息队列(Q),用于解决任务间的“多个数据”传送问题。在多任务

15、OS中,采用“指针数组”的方式进行多数据的传送。这个指向“指针数组”的指针+“指针数组”+消息缓冲区 所构成的数据结构称为“消息队列”。,山东科技大学 信息学院,20,2023/2/12,4.1 任务间的同步和事件控制块,等待任务列表,当一个“事件”被占用时,其它请求该事件的任务暂时得不到事件的服务,处于等待状态。OS使用等待任务表管理“事件”;即使用等待任务表对那些等待该事件的各个任务进行管理(记录等待该事件的任务并排序,任务等待事件有限时等)。每个事件都有一个“等待任务表”,用于完成事件对任务的驱动、限时等管理,其原理类似于任务就续表。任务等待事件限时则记录在TCB的OSTCBDly成员中

16、,每个Tick都会对其进行维护,当限时到时uC/OS-II强行将其转入就续状态。,山东科技大学 信息学院,21,2023/2/12,4.1 任务间的同步和事件控制块,事件控制块(ECB),uC/OS-II 使用ECB的数据结构统一描述三类事件(信号量、消息邮箱、消息队列)。uC/OS-II 中的ECB数据结构如下:,typedef struct INT8U OSEventType;/事件类型 INT16U OSEventCnt;/计数信号量的计数器 void*OSEventPtr;/消息(消息队列)指针 INT8U OSEventGrp;/等待事件的任务组 INT8U OSEventTblOS

17、_EVENT_TBL_SIZE;/任务等待表 OS_EVENT;,山东科技大学 信息学院,22,2023/2/12,4.1 任务间的同步和事件控制块,事件控制块(ECB)的结构,OSEventType取值含义,OSEventTbl,任务等待表,山东科技大学 信息学院,23,2023/2/12,4.1 任务间的同步和事件控制块,空事件控制块(ECB)链表,uC/OS-II 初始化(OSInit())时,按OS_CFG.H中OS_MAX_EVENTS 定义的系统事件总数创建该链表。使用中应用系统每创建一个事件,都会从此链表中申请一个空ECB,并填写相关成员初值;删除一个事件时,会将相应事件的ECB

18、归还该链表。,山东科技大学 信息学院,24,2023/2/12,4.1 任务间的同步和事件控制块,事件控制块(ECB)操作函数,uC/OS-II 有三类事件(信号量-Sem/互斥信号量-Mutex、消息邮箱-Mbox、消息队列-Q)。uC/OS-II 中对每种事件提供5个基本操作函数,供用户管理事件。,这些系统函数定义在相应的“事件”文件中。,OSxxxCreate()-创建事件;OSxxxPost()-发送事件;OSxxxPend()-请求事件;OSxxxDel()-删除事件;OSxxxQuery()-查看事件;,备注:其中 xxx 为事件名(Sem、Mutex、Mbox、Q),山东科技大学

19、 信息学院,25,2023/2/12,第4章 目录,1、任务间的同步和事件控制块2、信号量及其操作3、互斥型信号量和任务优先级反转4、消息邮箱及其操作5、消息队列及其操作,山东科技大学 信息学院,26,2023/2/12,4.2 信号量及其操作,信号量(Sem),1、信号量事件的数据成员 OSEventType=OS_EVENT_TYPE_SEM,OSEventPtr=Null2、有任务申请某信号量时,if(The ECB-OSEventCnt 0)then OSEventCnt-;The Task Goon;else Set the Task at WAIT_STATE;3、有任务发送某信号

20、量时,if(no Task Waitting the SEM)then The ECB-OSEventCnt+;else Set the H_Prio_TASk at READY;OS_Sched();,山东科技大学 信息学院,27,2023/2/12,4.2 信号量及其操作,信号量的操作-创建信号量,信号量操作系统函数定义在 OS_SEM.C 文件。在使用信号量之前,必须创建信号量。创建信号量系统函数的原型:,OS_EVENT*OSSemCreate(INT16U cnt/信号量计数初值),功能:从OSEventFreeList中申请一个ECB,并进行初始化(用cnt初始化ECB(Sem)-

21、OSEventCnt);返回一个已初始化的 ECB 的指针。,山东科技大学 信息学院,28,2023/2/12,OS_EVENT*UART_Flag;/声明事件指针变量INT8U err;/声明全局状态变量void main(void)OSInit();UART_Flag=OSSemCreate(1);/创建信号量 OSTaskCreate(Task_A,);/创建任务A OSTaskCreate(Task_B,);/创建任务B OSStart();,信号量的应用举例1-主函数部分,山东科技大学 信息学院,29,2023/2/12,4.2 信号量及其操作,信号量的操作-发送信号量,发送信号量也

22、称为释放信号量。释放信号量系统函数的原型:,INT8U OSSemPost(OS_EVENT*pevent/信号量指针指示释放目标),操作:检查是否还有等待该信号量的任务,若有则OS_Sched()调度优先级最高的任务运行,否则OSEventCnt+;函数返回值解释:OS_NO_ERR 释放成功;OS_ERR_EVENT_TYPE 释放的不是信号量事件;OS_SEM_OVF 信号量(个数 65535)溢出;,山东科技大学 信息学院,30,2023/2/12,void Task_A(void*pdata);for(;)/任务体A OSSemPend(UART_Flag,0,/Task_A 延时

23、nnnn 个时钟节拍,信号量的应用举例1-任务部分,void Task_B(void*pdata);for(;)/任务体B OSSemPend(UART_Flag,0,/Task_B 延时 mmm 个时钟节拍,山东科技大学 信息学院,31,2023/2/12,4.2 信号量及其操作,信号量的操作-请求信号量,请求信号量系统函数的原型:,void OSSemPend(OS_EVENT*pevent,/信号量指针指示申请目标INT16U timeout,/等待限时,OS Tick 数INT8U*err);/函数执行情况,备注:参数 timeout 用于约定本任务等待申请信号量的时限,单位是Tick

24、;当等待超时时,本任务被uC/OS-II直接转入就续状态。当该参数为 0 时,含义为无限时等待。通过查阅*err 参数可知函数的执行情况。,操作:如果信号量有效(ECB(Sem)-OSEventCnt 0),则OSEventCnt-,本任务goon;否则,将申请的事件的ECB-OSEventGrp及OSEventTbl 相应位置1,本Task转入Wait状态并执行OS_Sched()。,山东科技大学 信息学院,32,2023/2/12,4.2 信号量及其操作,信号量的操作-请求信号量,请求信号量系统函数的原型:,void OSSemPend(OS_EVENT*pevent,/信号量指针指示申请

25、目标INT16U timeout,/等待限时INT8U*err);/函数执行情况,函数返回值解释:OS_NO_ERR 信号量申请成功;OS_ERR_EVENT_TYPE 申请的不是信号量事件;OS_ERR_EVENT_NULL 申请的信号量不存在;OS_ERR_PEND_ISR 不能在 ISR 中申请信号量;OS_TIMEOUT 申请信号量超时退出;,山东科技大学 信息学院,33,2023/2/12,void Task_A(void*pdata);for(;)/任务体A OSSemPend(UART_Flag,0,/Task_A 延时 nnnn 个时钟节拍,信号量的应用举例1-任务部分,voi

26、d Task_B(void*pdata);for(;)/任务体B OSSemPend(UART_Flag,0,/Task_B 延时 mmm 个时钟节拍,山东科技大学 信息学院,34,2023/2/12,4.2 信号量及其操作,信号量的操作-无等待请求信号量,无等待请求信号量系统函数的原型:,INT16U OSSemAccept(OS_EVENT*pevent,/信号量指针指示申请目标);,该函数无等待地申请指定的信号量。函数返回值解释:0 信号量申请成功;0 信号量申请不成功;,山东科技大学 信息学院,35,2023/2/12,4.2 信号量及其操作,信号量的操作-删除信号量,删除信号量系统函

27、数的原型:,OS_EVENT*OSSemDel(OS_EVENT*pevent,/信号量指针指示删除目标INT8U opt,/删除条件、方式INT8U*err);/函数执行情况,备注:(信号量不能在ISR中删除)1、删除系统不再使用的信号量,归还事件资源;2、参数opt 用于约定删除信号量的条件,其可有两个取值:,OS_DEL_NO_PEND-若事件无等待任务时,删除该事件且*err=OS_NO_ERR;否则直接返回,且*err=OS_ERR_TASK_WAITING;OS_DEL_ALLWAYS-直接删除,且*err=OS_NO_ERR;错误的 opt 参数时,*err=OS_ERR_INV

28、ALID_OPT;,山东科技大学 信息学院,36,2023/2/12,4.2 信号量及其操作,信号量的操作-查询信号量的状态,查询信号量系统函数的原型:,INT8U OSSemQuery(OS_EVENT*pevent,/信号量指针指示申请目标OS_SEM_DATA*pdata);/信号量查询结果数据结构指针,Typedef struct INT16U OSCnt;INT8U OSEventTblOS_EVENT_TBL_SIZE;INT8U OSEventGrp;OS_SEM_DATA;,备注:(该数据类型在 uCOS_II.H文件中定义)OS_NO_ERR 信号量查询成功;在使用该函数前要

29、先定义一个OS_SEM_DATA类型的变量;,山东科技大学 信息学院,37,2023/2/12,4.2 信号量及其操作,信号量的应用举例1,某系统中有 Task_A、Task_B 两个任务都要使用公共资源(例如UART),他们可以分别使用,但不能同时使用。可用信号量的方法解决此问题。,山东科技大学 信息学院,38,2023/2/12,OS_EVENT*UART_Flag;/声明事件指针变量INT8U err;/声明全局状态变量void main(void)OSInit();UART_Flag=OSSemCreate(1);/创建信号量 OSTaskCreate(Task_A,);/创建任务A

30、OSTaskCreate(Task_B,);/创建任务B OSStart();,信号量的应用举例1-主函数部分,山东科技大学 信息学院,39,2023/2/12,void Task_A(void*pdata);for(;)/任务体A OSSemPend(UART_Flag,0,/Task_A 延时 nnnn 个时钟节拍,信号量的应用举例1-任务部分,void Task_B(void*pdata);for(;)/任务体B OSSemPend(UART_Flag,0,/Task_B 延时 mmm 个时钟节拍,山东科技大学 信息学院,40,2023/2/12,4.2 信号量及其操作,信号量的应用举例

31、2,某系统中有 Task_A、Task_B 两个任务,若想执行Task_B,必须首先经过Task_A。可用信号量的方法,将Task_B作为Task_A的后续功能,解决此问题。,山东科技大学 信息学院,41,2023/2/12,OS_EVENT*Task_Flag;/声明信号量void main(void)OSInit();Task_Flag=OSSemCreate(0);/创建信号量 OSTaskCreate(Task_A,);/创建任务A OSTaskCreate(Task_B,);/创建任务B OSStart();,信号量的应用举例2-主函数部分,山东科技大学 信息学院,42,2023/2

32、/12,void Task_A(void*pdata);for(;)/任务体A OSSemPost(Task_Flag);/发送信号量Task_Flag;/Task_A 业务功能代码 OSTimeDly(nnnn);/Task_A 延时 nnnn 个时钟节拍,信号量的应用举例2-任务部分,void Task_B(void*pdata);for(;)/任务体B OSSemPend(Task_Flag,0,/Task_B 延时 mmm 个时钟节拍*/,备注:Task_B 一直等待 Task_A 而运行。,山东科技大学 信息学院,43,2023/2/12,第4章 目录,1、任务间的同步和事件控制块2

33、、信号量及其操作3、互斥型信号量和任务优先级反转4、消息邮箱及其操作5、消息队列及其操作,山东科技大学 信息学院,44,2023/2/12,4.3 互斥型信号量和任务优先级反转,所谓的互斥型信号量是一个二值信号量,简称为“信号”,它是一种特殊的信号量,主要用于处理任务对共享资源独占问题。使用互斥型信号量时要注意任务优先级反转的问题。,山东科技大学 信息学院,45,2023/2/12,4.3 互斥型信号量和任务优先级反转,任务优先级的反转现象,是指在剥夺式OS中,当任务以独占方式使用共享资源时,低优先级的任务可能先于高优先级任务得到系统调度而运行的现象。,山东科技大学 信息学院,46,2023/

34、2/12,4.3 互斥型信号量和任务优先级反转,任务优先级的反转现象分析,造成的结果:Task_B 优先于 Task_A 得到运行。问题的严重性:如果Task_B之类的任务较多时,甚至会影响系统的设计目标。原因:低优先级的任务独占共享资源,迫使高优先级任务因等待资源而让出CPU。解决办法:暂时提升获得共享资源任务的优先级别,尽快释放共享资源,之后再恢复其原有的优先级别。,备注:决定任务得到运行的条件不仅仅是优先级,还有任务所需的资源。,山东科技大学 信息学院,47,2023/2/12,4.3 互斥型信号量和任务优先级反转,互斥型信号量(Mutex),互斥型信号量是一个二值信号量,是一种处理“任

35、务优先级反转”现象的特殊信号量,主要用于处理任务对共享资源独占问题。为此,“事件”数据结构上有一些特约:将OSEventCnt拆为了高8位(prio事件优先级)和低8位(资源标志)两个成员。,山东科技大学 信息学院,48,2023/2/12,4.1 任务间的同步和事件控制块-(临时参考),事件控制块(ECB),uC/OS-II 使用ECB的数据结构统一描述三类事件(信号量、消息邮箱、消息队列)。uC/OS-II 中的ECB数据结构如下:,typedef struct INT8U OSEventType;/事件类型 INT16U OSEventCnt;/计数信号量的计数器 void*OSEven

36、tPtr;/消息(消息队列)指针 INT8U OSEventGrp;/等待事件的任务组 INT8U OSEventTblOS_EVENT_TBL_SIZE;/任务等待表 OS_EVENT;,山东科技大学 信息学院,49,2023/2/12,4.3 互斥型信号量和任务优先级反转,创建互斥型信号量,调用系统函数OSMutexCreate()创建互斥型信号量,其原型如下:,OS_EVENT*OSMutexCreate(INT8U prio,/信号量优先级别INT8U*err/函数结果状态信息);,函数操作说明:该函数从空事件控制块队列(OSEventFreeList)获得一个ECB,并将其初始化(初

37、始化后的数据情况见前页插图);用户查看*err 可知道本函数的执行结果(OS_NO_ERR);用户通过本函数返回的事件指针来使用该“信号”。,山东科技大学 信息学院,50,2023/2/12,4.2 信号量及其操作-(临时参考),信号量的操作-创建信号量,信号量操作系统函数定义在 OS_SEM.C 文件。在使用信号量之前,必须创建信号量。创建信号量系统函数的原型:,OS_EVENT*OSSemCreate(INT16U cnt/信号量计数初值),功能:从OSEventFreeList中申请一个ECB,并进行初始化(用cnt初始化ECB(Sem)-OSEventCnt);返回一个已初始化的 EC

38、B 的指针。,山东科技大学 信息学院,51,2023/2/12,4.3 互斥型信号量和任务优先级反转,创建互斥型信号量,调用系统函数OSMutexCreate()创建互斥型信号量注意事项:,1、不支持在ISR中创建互斥信号量;否则,创建失败且返回出错信息*err=OS_ERR_CREATE_ISR2、指定的互斥信号量优先级不能与其它任务冲突;否则,创建失败且返回出错信息*err=OS_PRIO_EXIST3、指定的优先级要合法,否则,创建失败且返回出错信息*err=OS_PRIO_INVALID4、如果信号量创建失败,创建函数返回事件的指针为空(即=Null)5、正确创建了互斥信号量,函数返回

39、一个 ECB 指针,且*err=OS_NO_ERR,山东科技大学 信息学院,52,2023/2/12,4.3 互斥型信号量和任务优先级反转,请求互斥型信号量,当任务要访问一个独占共享资源时,要先调用系统函数OSMutexPend()函数申请相应的互斥信号量;其原型如下:,void OSMutexPend(OS_EVENT*pevent,/信号量指针INT16U timeout,/等待时间INT8U*err/函数结果状态信息);,山东科技大学 信息学院,53,2023/2/12,4.2 信号量及其操作-(临时参考),信号量的操作-请求信号量,请求信号量系统函数的原型:,void OSSemPen

40、d(OS_EVENT*pevent,/信号量指针指示申请目标INT16U timeout,/等待限时,OS Tick 数INT8U*err);/函数执行情况,备注:参数 timeout 用于约定本任务等待申请信号量的时限,单位是Tick;当等待超时时,本任务被uC/OS-II直接转入就续状态。当该参数为 0 时,含义为无限时等待。通过查阅*err 参数可知函数的执行情况。,操作:如果信号量有效(ECB(Sem)-OSEventCnt 0),则OSEventCnt-,本任务goon;否则,将申请的事件的ECB-OSEventGrp及OSEventTbl 相应位置1,本Task转入Wait状态并执

41、行OS_Sched()。,山东科技大学 信息学院,54,2023/2/12,4.3 互斥型信号量和任务优先级反转,请求互斥型信号量,调用系统函数OSMutexPend()申请互斥型信号量注意事项:,1、不支持在ISR中申请互斥信号量;否则,申请失败且返回出错信息*err=OS_ERR_PEND_ISR2、申请的互斥信号量必须存在;否则,申请失败且返回出错信息*err=OS_ERR_PEVENT_NULL3、指定的事件要是互斥信号量,否则,申请失败且返回出错信息*err=OS_ERR_EVENT_TYPE4、申请到了互斥信号量,*err=OS_NO_ERR5、如果信号量未申请到,本任务则进入“等

42、待”状态。,山东科技大学 信息学院,55,2023/2/12,4.3 互斥型信号量和任务优先级反转,发送互斥型信号量,调用系统函数OSMutexPost()发送(释放)互斥型信号量,其原型如下:,INT8U OSMutexPost(OS_EVENT*pevent/信号量指针);,山东科技大学 信息学院,56,2023/2/12,4.3 互斥型信号量和任务优先级反转,发送互斥型信号量,调用系统函数OSMutexPost()释放互斥型信号量注意事项:,1、不支持在ISR中释放互斥信号量;否则释放失败且函数返回OS_ERR_POST_ISR2、释放的互斥信号量必须存在;否则释放失败且函数返回OS_E

43、RR_PEVENT_NULL3、释放的事件要是互斥信号量,否则释放失败且函数返回OS_ERR_EVENT_TYPE4、只能释放自己的信号,否则释放失败且函数返回OS_ERR_NOT_MUTEX_OWNER5、正确释放了互斥信号量,函数返回 OS_NO_ERR,山东科技大学 信息学院,57,2023/2/12,4.3 互斥型信号量和任务优先级反转,删除互斥型信号量,可以调用系统函数OSMutexDel()函数删除不再使用的互斥信号量;其原型如下:,OS_EVENT*OSMutexDel(OS_EVENT*pevent,/信号量指针INT8U opt,/删除方式选项INT8U*err/函数结果状态

44、信息);,备注:函数返回删除事件的“事件指针”;当删除一个不存在的事件时,返回 Null。,山东科技大学 信息学院,58,2023/2/12,4.3 互斥型信号量和任务优先级反转,删除互斥型信号量,系统函数OSMutexDel()删除互斥型信号量注意事项:,1、opt 参数含义:,2、返回信息*err 的含义:,OS_NO_ERR Mutex删除成功;OS_ERR_DEL_ISR 不允许在ISR中进行删除OS_ERR_INVALID_OPT 删除方式参数非法OS_ERR_TASK_WAITING 还有等待该信号的任务OS_ERR_EVENT_TYPE 指定的事件不是MutexOS_ERR_PE

45、VENT_NULL 事件指针为空了,OS_DEL_NO_PEND-无申请等待任务时方删除。OS_DEL_ALWAYS-无条件直接删除,所有的等待任务皆转 入到ready 状态。,山东科技大学 信息学院,59,2023/2/12,4.3 互斥型信号量和任务优先级反转,互斥型信号量应用举例,某系统中有 Task_A、Task_B 两个任务都要使用公共资源(例如UART),他们可以分别使用,但不能同时使用;Task_A、Task_B 两任务的优先级之间还存在许多中间优先级的任务;例如:Prio(Task_A)=3,Prio(Task_B)=20,优先级在 3,20 之间还存在5个任务 Task_1,

46、Task_2,Task_5,有可能引起优先级反转。使用互斥信号量的方法解决此问题。,山东科技大学 信息学院,60,2023/2/12,OS_EVENT*UART_Flag;/声明信号量INT8U err;/声明全局状态变量void main(void)OSInit();UART_Flag=OSMutexCreate(2,互斥信号量的应用举例-主函数部分,山东科技大学 信息学院,61,2023/2/12,void Task_A(void*pdata);for(;)/任务体A OSMutexPend(UART_Flag,0,/Task_A 延时 nnnn 个时钟节拍,互斥信号量的应用举例-任务部分

47、,void Task_B(void*pdata);for(;)/任务体B OSMutexPend(UART_Flag,0,/Task_B 延时 mmm 个时钟节拍,山东科技大学 信息学院,62,2023/2/12,第4章 目录,1、任务间的同步和事件控制块2、信号量及其操作3、互斥型信号量和任务优先级反转4、消息邮箱及其操作5、消息队列及其操作,山东科技大学 信息学院,63,2023/2/12,4.4 消息邮箱及其操作,消息邮箱(Mbox),它的主要功能就是用于在任务间传递一个数据;还要为操作系统管理事件和任务提供一些参数。结构如下:,消息邮箱使用传递变量指针的手段在任务之间进行通信。,山东科

48、技大学 信息学院,64,2023/2/12,4.4 消息邮箱及其操作,消息邮箱的操作-创建消息邮箱,可以调用系统函数OSMboxCreate()函数创建消息邮箱;其原型如下:,OS_EVENT*OSMboxCreate(void*msg/消息指针);,备注:1、形参 msg 是一个要在任务间传递的变量指针;2、当创建消息邮箱成功时,返回消息邮箱指针;3、消息邮箱创建失败时,返回一个 Null。,山东科技大学 信息学院,65,2023/2/12,4.4 消息邮箱及其操作,消息邮箱的操作-向消息邮箱发送消息,可以调用系统函数OSMboxPost()函数向消息邮箱发送消息;其原型如下:,INT8U

49、OSMboxPost(OS_EVENT*pevent,/消息邮箱指针 void*msg/消息指针);,备注:1、形参 msg 是一个要在任务间传递的变量指针;2、形参 pevent 是消息邮箱指针;,山东科技大学 信息学院,66,2023/2/12,4.4 消息邮箱及其操作,消息邮箱的操作-向消息邮箱发送消息,向消息邮箱发送消息系统函数OSMboxPost()返回值含义:,1、OS_NO_ERR-消息发送成功;2、OS_MBOX_FULL-不能向满邮箱在发送消息;3、OS_ERR_EVENT_TYPE-指定的事件不是消息邮箱类型;4、OS_ERR_PEVENT_NULL-不能向不存在的消息邮箱

50、发送消息;5、OS_ERR_POST_NULL_PTR-消息缓冲区不能为空;,山东科技大学 信息学院,67,2023/2/12,4.4 消息邮箱及其操作,消息邮箱的操作-请求消息邮箱,void*OSMboxPend(OS_EVENT*pevent,/消息邮箱指针INT16U timeout,/等待时限INT8U*err/函数执行信息);,所谓的“请求消息邮箱”就是等待一个消息传送到消息邮箱,或取得一个消息数据。请求消息邮箱函数原型:,当返回值!=Null 时,返回值就是一个预期消息的指针;当返回值=Null 时,意味着未得到消息,此时uC/OS-II执行OS_Sched();可能消息未准备好,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号