您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > μCOS Ⅱ嵌入式操作系统及开发课件-4
page12020/2/27嵌入式操作系统及开发page2020/2/272第4章任务的同步与通信page32020/2/27第4章任务的同步与通信一个应用系统通常是由多个任务组成,任务之间互相协作共同完成目标功能。例如任务对共享资源竞争,先采集数据才能处理数据等情况。(任务的同步控制,共享资源的竞争,任务间的通信等问题的解决方案---OS)任务间的同步----任务间的制约性的合作运行机制。系统各任务之间通过“任务通信”的方式,实现任务的信息传递和同步控制,“任务通信”的载体就是----事件。常用的事件:信号量(计数型---SEM/互斥型---MUTEX)、消息邮箱(MBOX)、消息队列(Q)、事件标志组等。事件用“事件控制块”(ECB)来描述。page42020/2/27第4章目录1、任务间的同步和事件控制块2、信号量及其操作3、互斥型信号量和任务优先级反转4、消息邮箱及其操作5、消息队列及其操作page52020/2/27第4章目录1、任务间的同步和事件控制块2、信号量及其操作3、互斥型信号量和任务优先级反转4、消息邮箱及其操作5、消息队列及其操作page62020/2/274.1任务间的同步和事件控制块任务间的同步---各任务运行的先后、触发等关系Task_AData_BufferTask_BTask_AWriteDataintoData_BufferTask_BReadDatafromData_Buffer备注:数据采集任务A和数据处理任务B之间存在同步关系。page72020/2/274.1任务间的同步和事件控制块任务间的互斥---共享资源的申请使用备注:数据采集任务A和数据处理任务B之间存在互斥关系。Task_APrtinterTask_BTask_AwouldprintTask_Bwouldprintpage82020/2/274.1任务间的同步和事件控制块任务之间的这种相互制约、相互合作的运行机制称为“任务间的同步”系统中任务之间相互传递事件,来实现任务的同步、协作。备注:用户自定义全局变量的方法,也可以编程实现程序间的信息传递。但如果想将信息传递的各项功能作完备,工作量是比较大的。况且,这类需求在应用系统设计中是很常用的。uC/OS-II中将此类工作以系统功能方式提供与用户----事件操作。page92020/2/27举例:任务间的共享资源竞争问题及处理方式。M_DevS_Dev1S_Dev2TxRxTxTxRxRxUARTUARTUART某一分布式系统,需要主设备(M_Dev)使用同一个UART资源分别与从设备1(S_Dev1)和从设备2(S_Dev2)以不同的“串行通信模式”进行通信。page102020/2/27voidmain(void)//系统主函数{OSInit();......;OSTaskCreate(Task_A,(void*)pdata,......);OSTaskCreate(Task_B,(void*)pdata,......);......;OSStart();}voidTask_A(void*pdata){......;//Task_A环境初始化for(;;){......;//Task_A业务OSTaskCreate(UART_S1_Task,(void*)US1,......);......;//Task_A业务OSTimeDly(xxx);}}voidTask_B(void*pdata){......;//Task_B环境初始化for(;;){......;//Task_B业务OSTaskCreate(UART_S2_Task,(void*)US2,......);......;//Task_B业务OSTimeDly(yyy);}}说明:如此设计未对共享资源作任何约束,实际运行中可能发生Task_A与Task_B冲突竞争。BOOLEANuart_key;voidmain(void)//系统主函数{OSInit();......;uart_key=TRUE;OSTaskCreate(Task_A,(void*)pdata,......);OSTaskCreate(Task_B,(void*)pdata,......);......;OSStart();}voidTask_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);}}voidTask_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;INT16UAD_Value;voidmain(void)//系统主函数{OSInit();......;OSTaskCreate(Task_A,(void*)pdata,......);OSTaskCreate(Task_B,(void*)pdata,......);......;OSStart();}voidTask_A(void*pdata){......;//Task_A环境初始化for(;;){......;//Task_A业务if(msg_ptr==NULL){Signal_Capture(AD_Value);//采集数据msg_ptr=&AD_Value;}......;//Task_A业务OSTimeDly(xxx);}}voidTask_B(void*pdata){......;//Task_B环境初始化INT16UAD_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,但其管理性能支持较弱。page132020/2/274.1任务间的同步和事件控制块事件汉语中所谓的“事件”,是指一个事情的发生。在uC/OS-II中将信号量、消息邮箱和消息队列的一个存在称为一个事件,事件操作:创建、发送、请求和删除等。(uC/OS的原作者将“事件---EVENT”理解为静态的数据结构。)发送事件----向信号量、消息邮箱和消息队列的一次信息发送(写---Post)操作。请求事件----对信号量、消息邮箱和消息队列的一次查询(读---Pend)操作。uC/OS-II中以系统函数的方式向任务提供事件操作。page142020/2/274.1任务间的同步和事件控制块事件(1)----信号量(Sem/Mutex)两类信号量:互斥信号量---Mutex、计数型信号量---Sem;互斥信号量是一个二值信号量,主要用于“独占式共享资源”的管理(例如:打印机)。计数型信号量用以“多个同类型资源”的管理,通常用一个计数器实现(例如:存储块)。BOOLEANuart_key;//互斥标志voidmain(void)//系统主函数{OSInit();......;uart_key=TRUE;OSTaskCreate(Task_A,(void*)pdata,......);OSTaskCreate(Task_B,(void*)pdata,......);......;OSStart();}voidTask_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);}}voidTask_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冲突竞争,但其管理性能支持较弱。page162020/2/274.1任务间的同步和事件控制块事件(2)----消息邮箱(Mbox)用于解决任务间的数据传送问题。在多任务OS中采用消息传送的方式实现任务间的“单批次数据”通信,这个数据称为“消息”。例如:Task_A采集一个数据,Task_B要使用Task_A采集的数据。原理:在内存中创建数据传送缓冲区(消息缓冲区),通过传送该缓冲区的地址指针传递数据。这个缓冲区指针的数据结构称为“消息邮箱”。page172020/2/274.1任务间的同步和事件控制块事件(2)----消息邮箱(Mbox)Task_APointer(消息邮箱)Task_BMessageBuffer(消息缓冲区)Task_A通过指针将消息写入到缓冲区(发送消息)Task_B通过指针将消息从缓冲区读出(请求消息)page182020/2/274.1任务间的同步和事件控制块事件(3)----消息队列(Q)用于解决任务间的“多个数据”传送问题。在多任务OS中,采用“指针数组”的方式进行多数据的传送。这个指向“指针数组”的指针+“指针数组”+消息缓冲区所构成的数据结构称为“消息队列”。page192020/2/274.1任务间的同步和事件控制块等待任务列表当一个“事件”被占用时,其它请求该事件的任务暂时得不到事件的服务,处于等待状态。OS使用《等待任务表》管理“事件”;即使用《等待任务表》对那些等待该事件的各个任务进行管理(记录等待该事件的任务并排序,任务等待事件有限时等)。每个事件都有一个“等待任务表”,用于完成事件对任务的驱动、限时等管理,其原理类似于任务就绪表。任务等待事件限时则记录在TCB的OSTCBDly成员中,每个Tick都会对其进行维护,当限时到时uC/OS-II强行将其转入就绪状态。page202020/2/274.1任务间的同步和事件控制块事件控制块(ECB)uC/OS-II使用ECB的数据结构统一描述三类事件(信号量、消息邮箱、消息队列)。uC/OS-II中的ECB数据结构如下:typedefstruct{INT8UOSEventType;//事件类型INT16UOSEventCnt;//计数信号量的计数器void*OSEventPtr;//消息(消息队列)指针INT8UOSEventGrp;//等待事件的任务组INT8UOSEventTbl[OS_EVENT_TBL_SIZE];//任务等待表}OS_EVENT;page212020/2/274.1任务间的同步和事件控制块事件控制块(E
本文标题:μCOS Ⅱ嵌入式操作系统及开发课件-4
链接地址:https://www.777doc.com/doc-4041611 .html