RTOSuCOSII原理及应用.ppt
《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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RTOSuCOSII 原理 应用

链接地址:https://www.31ppt.com/p-2337746.html