第八讲任务同步与通信.ppt
《第八讲任务同步与通信.ppt》由会员分享,可在线阅读,更多相关《第八讲任务同步与通信.ppt(47页珍藏版)》请在三一办公上搜索。
1、第八讲(4)任务同步与通信,授课教师:李英祥电邮地址:,2023/6/25,2,主要内容,1.事件控制块ECB 2.信号量 3.邮箱4.消息队列,2023/6/25,3,1.事件控制块ECB,事件控制块ECB初始化一个ECB块 OSEVENTWAITLISTINIT()使一个任务进入就绪状态 OSEVENTTASKRDY()使一个任务进入等待状态 OSEVENTTASKWAIT()由于等待超时将一个任务置为就绪状态 OSEVENTTO(),2023/6/25,4,事件控制块ECB,C/OS-II通过定义的OS_EVENT数据结构(事件控制块ECB)来维护一个事件控制块的所有信息;该结构中除了包
2、含了:事件本身的定义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等;等待该事件的所有任务的列表;,2023/6/25,5,OSEventType定义了事件的具体类型,可以是:信号量(OS_EVENT_SEM);邮箱(OS_EVENT_TYPE_MBOX);或消息队列(OS_EVENT_TYPE_Q)中的一种;,2023/6/25,6,与任务就绪列表类似!,等待事件任务列表,2023/6/25,7,事件控制块的总数由用户所需要的信号量、邮箱和消息队列的总数决定;该值由OS_CFG.H 中的#define OS_MAX_EVENTS定义;在调用OSInit()时,所有事件
3、控制块被链接成一个单向链表空闲事件控制块链表;每当建立一个信号量、邮箱或者消息队列时,就从该链表中取出一个空闲事件控制块,并对它进行初始化;因为信号量、邮箱和消息队列一旦建立就不能删除,所以事件控制块也不能放回到空闲事件控制块链表中;,2023/6/25,8,2023/6/25,9,对于事件控制块进行的一些通用操作包括:初始化一个事件控制块使一个任务进入就绪态使一个任务进入等待该事件的状态因为等待超时而使一个任务进入就绪态C/OS-II将上面的操作用4个系统函数实现,它们是:OSEventWaitListInit()OSEventTaskRdy()OSEventWait()OSEventTO(
4、),2023/6/25,10,初始化一个事件控制块OSEventWaitListInit(),当建立一个信号量、邮箱或者消息队列时,相应的建立函数OSSemCreate(),OSMboxCreate(),或者OSQCreate()通过调用OSEventWaitListInit()对事件控制块中的等待任务列表进行初始化;该函数的调用参数只有一个,就是指向需要初始化的事件控制块的指针pevent。,2023/6/25,11,使一个任务进入就绪态OSEventTaskRdy(),当发生了某个事件,该事件对应的OSSemPost(),OSMboxPost(),OSQPost(),和OSQPostFro
5、nt()函数调用OSEventTaskRdy();该函数从等待任务队列中删除HPT任务(Highest Priority Task),并把该任务置于就绪态;,2023/6/25,12,使一个任务进入等待某事件发生状态 OSEventTaskWait(),当某个任务要等待一个事件的发生时,相应事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用该函数OSEventTaskWait();该函数将当前任务从就绪任务表中删除,并放到相应事件的事件控制块的等待任务表中;,2023/6/25,13,等待超时而将任务置为就绪态 OSEventTO(),当在预先指定的时间内任
6、务等待的事件没有发生时,OSTimeTick()函数会因为等待超时而将任务的状态置为就绪;在这种情况下,事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用OSEventTO()来完成这项工作;该函数负责从事件控制块中的等待任务列表里将任务删除,并把它置成就绪状态;,2023/6/25,14,信号量建立信号量OSSemCreate()等待信号量 OSSemPend()发送信号量 OSSemPost()无等待地请求信号量 OSSemAccept()查询信号量的当前状态 OSSemQuery(),2.信号量,2023/6/25,15,C/OS-II中的信号量由两部
7、分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表;如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。最后,如果该信号量是用来表示允许任务访问n个相同的资源,那么该初始值显然应该是n,并把该信号量作为一个可计数的信号量使用;,2023/6/25,16,C/OS-II提供了5个对信号量进行操作的函数:OSSemCreate(),OSSemPend(),OSSemPost(),OSSemAccept()和OSSemQuery(),2023/6/25,17,建立信号量OSSem
8、Create(),OSSemCreate()函数建立并初始化一个信号量。信号量的作用如下:允许一个任务和其他任务或者中断同步取得设备的使用权标志事件的发生参数value 参数是建立的信号量的初始值,可以取0到65535之间的任何值。返回值 OSSemCreate()返回给调用函数一个指向任务控制块的指针。如果没有可用的事件控制块,OSSemCreate()函数返回空指针。,2023/6/25,18,等待信号量 OSSemPend(),OSSemPend()函数用于任务试图取得设备的使用权。如果任务调用OSSemPend()函数时,信号量的值大于零,OSSemPend()函数递减该值并返回该值。
9、如果调用时信号量等于零,OSSemPend()函数将任务加入该信号量的等待队列。OSSemPend()函数挂起当前任务直到其他的任务或中断置起信号量或超出等待的预期时间。如果在预期的时钟节拍内信号量被置起,C/OS-默认最高优先级的任务取得信号量恢复执行。一个被OSTaskSuspend()函数挂起的任务也可以接受信号量,但这个任务将一直保持挂起状态直到通过调用OSTaskResume()函数恢复任务的运行。,2023/6/25,19,参数pevent 是指向信号量的指针。该指针的值在建立该信号量时可以得到。(参考OSSemCreate()函数)。Timeout 允许一个任务在经过了指定数目的
10、时钟节拍后还没有得到需要的信号量时恢复运行状态。如果该值为零表示任务将持续的等待信号量。最大的等待时间为65535个时钟节拍。这个时间长度并不是非常严格的,可能存在一个时钟节拍的误差,因为只有在一个时钟节拍结束后才会减少定义的等待超时时钟节拍。Err 是指向包含错误码的变量的指针。OSSemPend()函数返回的错误码可能为下述几种:OS_NO_ERR:信号量不为零。OS_TIMEOUT:信号量没有在指定的周期数内置起。OS_ERR_PEND_ISR:从中断调用该函数。虽然规定了不允许从中断调用该函数,但C/OS-仍然包含了检测这种情况的功能。OS_ERR_EVENT_TYPE:pevent
11、不是指向信号量的指针;,2023/6/25,20,2023/6/25,21,发送信号量 OSSemPost(),OSSemPost()函数置起指定的信号量:如果指定的信号量是零或大于零,OSSemPost()函数递增该信号量并返回。如果有任何任务在等待信号量,最高优先级的任务将得到信号量并进入就绪状态。参数pevent 是指向信号量的指针。该指针的值在建立该信号量时可以得到。返回值OSSemPost()函数的返回值为下述之一:OS_NO_ERR:信号量成功的置起OS_SEM_OVF:信号量的值溢出OS_ERR_EVENT_TYPE:pevent 不是指向信号量的指针。,2023/6/25,22
12、,无等待地请求信号量 OSSemAccept(),当一个任务请求一个信号量时,如果该信号量暂时无效,也可以让该任务简单地返回,而不是进入睡眠等待状态,这种情况下的操作是由OSSemAccept()函数完成的;参数pevent 是指向需要查询的设备的信号量;返回值当调用OSSemAccept()函数时,设备信号量的值大于零,说明设备就绪,这个值被返回调用者,设备信号量的值减一;当调用OSSemAccept()函数时,设备信号量的值等于零,说明设备没有就绪,返回零;,2023/6/25,23,查询信号量的当前状态 OSSemQuery(),OSSemQuery()函数用于获取某个信号量的信息:可以
13、得知是否有,以及有多少任务位于信号量的任务等待队列中;使用OSSemQuery()之前,应用程序需要先创立类型为OS_SEM_DATA的数据结构,用来保存从信号量的事件控制块中取得的数据;参数pevent是一个指向信号量的指针。该指针在信号量建立后返回调用程序;Pdata是一个指向数据结构OS_SEM_DATA的指针;返回值 OSSemQuery()函数有下述两个返回值:OS_NO_ERR 表示调用成功。OS_ERR_EVENT_TYPE 表示未向信号量传递指针。,2023/6/25,24,2.邮箱,邮箱建立一个邮箱OSMboxCreate()等待一个邮箱中的消息OSMboxPend()发送一
14、个消息到邮箱中OSMboxPost()无等待地从邮箱中得到一个消息OSMboxAccept()查询一个邮箱的状态OSMboxQuery(),2023/6/25,25,邮箱,邮箱是C/OS-II中另一种通讯机制;它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量;该指针指向一个包含了特定“消息”的数据结构;C/OS-II提供了5种对邮箱的操作:OSMboxCreate()OSMboxPend()OSMboxPost()OSMboxAccept()OSMboxQuery(),2023/6/25,26,建立一个邮箱OSMboxCreate(),OSMboxCreate()建立并初始化
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 任务 同步 通信
链接地址:https://www.31ppt.com/p-5315002.html