欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    RTOSuCOSII原理及应用.ppt

    • 资源ID:2337746       资源大小:1.49MB        全文页数:94页
    • 资源格式: PPT        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    RTOSuCOSII原理及应用.ppt

    山东科技大学 信息学院,1,2023/2/12,嵌入式实时操作系统 C/OS-II,2023/2/12,山东科技大学 信息学院,2,第4章 任务的同步与通信,山东科技大学 信息学院,3,2023/2/12,第4章 任务的同步与通信,一个应用系统通常是由多个任务组成,任务之间互相协作共同完成目标功能。例如任务对共享资源竞争,先采集数据才能处理数据等情况。(任务的同步控制,共享资源的竞争,任务间的通信等问题的解决方案-OS)任务间的同步-任务间的制约、合作运行机制。系统各任务之间通过“任务通信”的方式,实现任务的信息传递和同步控制,“任务通信”的载体就是-事件。常用的事件:信号量(计数型-SEM/互斥型-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 任务间的同步和事件控制块,任务间的同步-各任务运行的先后、触发等关系,备注:数据采集任务A 和数据处理任务B 之间存在同步关系。,山东科技大学 信息学院,7,2023/2/12,4.1 任务间的同步和事件控制块,任务间的互斥-共享资源的申请使用,备注:数据采集任务A 和数据处理任务B 之间存在互斥关系。,山东科技大学 信息学院,8,2023/2/12,4.1 任务间的同步和事件控制块,任务之间的这种相互制约、相互合作的运行机制称为“任务间的同步”系统中任务之间相互传递事件,来实现任务的同步、协作。,备注:用户自定义全局变量的方法,也可以编程实现程序间的信息传递。但如果想将信息传递的各项功能作完备,工作量是比较大的。况且,这类需求在应用系统设计中是很常用的。uC/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();,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 冲突竞争。,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 业务 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(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_ptr!=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 中将信号量、消息邮箱和消息队列的一个存在称为一个事件,事件操作:创建、发送、请求和删除等。(uC/OS的原作者将“事件-EVENT”理解为静态的数据结构。)发送事件-向信号量、消息邮箱和消息队列的一次信息发送(写-Post)操作。请求事件-对信号量、消息邮箱和消息队列的一次查询(读-Pend)操作。uC/OS-II 中以系统函数的方式向任务提供事件操作。,山东科技大学 信息学院,14,2023/2/12,4.1 任务间的同步和事件控制块,事件(1)-信号量(Sem/Mutex),两类信号量:互斥信号量-Mutex、计数型信号量-Sem;互斥信号量是一个二值信号量,主要用于“独占式共享资源”的管理(例如:打印机)。计数型信号量用以“多个同类型资源”的管理,通常用一个计数器实现(例如:存储块)。,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 业务 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,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 任务间的同步和事件控制块,事件(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),用于解决任务间的“多个数据”传送问题。在多任务OS中,采用“指针数组”的方式进行多数据的传送。这个指向“指针数组”的指针+“指针数组”+消息缓冲区 所构成的数据结构称为“消息队列”。,山东科技大学 信息学院,20,2023/2/12,4.1 任务间的同步和事件控制块,等待任务列表,当一个“事件”被占用时,其它请求该事件的任务暂时得不到事件的服务,处于等待状态。OS使用等待任务表管理“事件”;即使用等待任务表对那些等待该事件的各个任务进行管理(记录等待该事件的任务并排序,任务等待事件有限时等)。每个事件都有一个“等待任务表”,用于完成事件对任务的驱动、限时等管理,其原理类似于任务就续表。任务等待事件限时则记录在TCB的OSTCBDly成员中,每个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_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归还该链表。,山东科技大学 信息学院,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),山东科技大学 信息学院,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、有任务发送某信号量时,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)-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 信号量及其操作,信号量的操作-发送信号量,发送信号量也称为释放信号量。释放信号量系统函数的原型:,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 延时 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;当等待超时时,本任务被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,/信号量指针指示申请目标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-任务部分,void 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 信号量及其操作,信号量的操作-删除信号量,删除信号量系统函数的原型:,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_INVALID_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 信号量查询成功;在使用该函数前要先定义一个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 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 信号量及其操作,信号量的应用举例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/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、信号量及其操作3、互斥型信号量和任务优先级反转4、消息邮箱及其操作5、消息队列及其操作,山东科技大学 信息学院,44,2023/2/12,4.3 互斥型信号量和任务优先级反转,所谓的互斥型信号量是一个二值信号量,简称为“信号”,它是一种特殊的信号量,主要用于处理任务对共享资源独占问题。使用互斥型信号量时要注意任务优先级反转的问题。,山东科技大学 信息学院,45,2023/2/12,4.3 互斥型信号量和任务优先级反转,任务优先级的反转现象,是指在剥夺式OS中,当任务以独占方式使用共享资源时,低优先级的任务可能先于高优先级任务得到系统调度而运行的现象。,山东科技大学 信息学院,46,2023/2/12,4.3 互斥型信号量和任务优先级反转,任务优先级的反转现象分析,造成的结果:Task_B 优先于 Task_A 得到运行。问题的严重性:如果Task_B之类的任务较多时,甚至会影响系统的设计目标。原因:低优先级的任务独占共享资源,迫使高优先级任务因等待资源而让出CPU。解决办法:暂时提升获得共享资源任务的优先级别,尽快释放共享资源,之后再恢复其原有的优先级别。,备注:决定任务得到运行的条件不仅仅是优先级,还有任务所需的资源。,山东科技大学 信息学院,47,2023/2/12,4.3 互斥型信号量和任务优先级反转,互斥型信号量(Mutex),互斥型信号量是一个二值信号量,是一种处理“任务优先级反转”现象的特殊信号量,主要用于处理任务对共享资源独占问题。为此,“事件”数据结构上有一些特约:将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*OSEventPtr;/消息(消息队列)指针 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,并将其初始化(初始化后的数据情况见前页插图);用户查看*err 可知道本函数的执行结果(OS_NO_ERR);用户通过本函数返回的事件指针来使用该“信号”。,山东科技大学 信息学院,50,2023/2/12,4.2 信号量及其操作-(临时参考),信号量的操作-创建信号量,信号量操作系统函数定义在 OS_SEM.C 文件。在使用信号量之前,必须创建信号量。创建信号量系统函数的原型:,OS_EVENT*OSSemCreate(INT16U cnt/信号量计数初值),功能:从OSEventFreeList中申请一个ECB,并进行初始化(用cnt初始化ECB(Sem)-OSEventCnt);返回一个已初始化的 ECB 的指针。,山东科技大学 信息学院,51,2023/2/12,4.3 互斥型信号量和任务优先级反转,创建互斥型信号量,调用系统函数OSMutexCreate()创建互斥型信号量注意事项:,1、不支持在ISR中创建互斥信号量;否则,创建失败且返回出错信息*err=OS_ERR_CREATE_ISR2、指定的互斥信号量优先级不能与其它任务冲突;否则,创建失败且返回出错信息*err=OS_PRIO_EXIST3、指定的优先级要合法,否则,创建失败且返回出错信息*err=OS_PRIO_INVALID4、如果信号量创建失败,创建函数返回事件的指针为空(即=Null)5、正确创建了互斥信号量,函数返回一个 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 OSSemPend(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状态并执行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、如果信号量未申请到,本任务则进入“等待”状态。,山东科技大学 信息学院,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_ERR_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/函数结果状态信息);,备注:函数返回删除事件的“事件指针”;当删除一个不存在的事件时,返回 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_PEVENT_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,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 个时钟节拍,互斥信号量的应用举例-任务部分,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),它的主要功能就是用于在任务间传递一个数据;还要为操作系统管理事件和任务提供一些参数。结构如下:,消息邮箱使用传递变量指针的手段在任务之间进行通信。,山东科技大学 信息学院,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 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-不能向不存在的消息邮箱发送消息;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();可能消息未准备好,

    注意事项

    本文(RTOSuCOSII原理及应用.ppt)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开