欢迎来到天天文库
浏览记录
ID:27407685
大小:336.01 KB
页数:47页
时间:2018-12-01
《任务同步与通信2》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第八讲(4)任务同步与通信授课教师:李英祥电邮地址:drliyingxiang@163.com主要内容1.事件控制块ECB2.信号量3.邮箱4.消息队列2021/8/62www.cuit.edu.cn1.事件控制块ECB事件控制块ECB初始化一个ECB块OSEVENTWAITLISTINIT()使一个任务进入就绪状态OSEVENTTASKRDY()使一个任务进入等待状态OSEVENTTASKWAIT()由于等待超时将一个任务置为就绪状态OSEVENTTO()2021/8/63www.cuit.edu.cn事件控制块ECBµC/OS-II通过定
2、义的OS_EVENT数据结构(事件控制块ECB)来维护一个事件控制块的所有信息;该结构中除了包含了:事件本身的定义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等;等待该事件的所有任务的列表;2021/8/64www.cuit.edu.cnOSEventType定义了事件的具体类型,可以是:信号量(OS_EVENT_SEM);邮箱(OS_EVENT_TYPE_MBOX);或消息队列(OS_EVENT_TYPE_Q)中的一种;2021/8/65www.cuit.edu.cn与任务就绪列表类似!等待事件任务列表2021/8
3、/66www.cuit.edu.cn事件控制块的总数由用户所需要的信号量、邮箱和消息队列的总数决定;该值由OS_CFG.H中的#defineOS_MAX_EVENTS定义;在调用OSInit()时,所有事件控制块被链接成一个单向链表——空闲事件控制块链表;每当建立一个信号量、邮箱或者消息队列时,就从该链表中取出一个空闲事件控制块,并对它进行初始化;因为信号量、邮箱和消息队列一旦建立就不能删除,所以事件控制块也不能放回到空闲事件控制块链表中;2021/8/67www.cuit.edu.cn2021/8/68www.cuit.edu.cn对于事件
4、控制块进行的一些通用操作包括:初始化一个事件控制块使一个任务进入就绪态使一个任务进入等待该事件的状态因为等待超时而使一个任务进入就绪态µC/OS-II将上面的操作用4个系统函数实现,它们是:OSEventWaitListInit()OSEventTaskRdy()OSEventWait()OSEventTO()2021/8/69www.cuit.edu.cn初始化一个事件控制块OSEventWaitListInit()当建立一个信号量、邮箱或者消息队列时,相应的建立函数OSSemCreate(),OSMboxCreate(),或者OSQCre
5、ate()通过调用OSEventWaitListInit()对事件控制块中的等待任务列表进行初始化;该函数的调用参数只有一个,就是指向需要初始化的事件控制块的指针pevent。2021/8/610www.cuit.edu.cn使一个任务进入就绪态OSEventTaskRdy()当发生了某个事件,该事件对应的OSSemPost(),OSMboxPost(),OSQPost(),和OSQPostFront()函数调用OSEventTaskRdy();该函数从等待任务队列中删除HPT任务(HighestPriorityTask),并把该任务置于就绪
6、态;2021/8/611www.cuit.edu.cn使一个任务进入等待某事件发生状态OSEventTaskWait()当某个任务要等待一个事件的发生时,相应事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用该函数OSEventTaskWait();该函数将当前任务从就绪任务表中删除,并放到相应事件的事件控制块的等待任务表中;2021/8/612www.cuit.edu.cn等待超时而将任务置为就绪态OSEventTO()当在预先指定的时间内任务等待的事件没有发生时,OSTimeTick()函数会因为等待超
7、时而将任务的状态置为就绪;在这种情况下,事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用OSEventTO()来完成这项工作;该函数负责从事件控制块中的等待任务列表里将任务删除,并把它置成就绪状态;2021/8/613www.cuit.edu.cn信号量建立信号量OSSemCreate()等待信号量OSSemPend()发送信号量OSSemPost()无等待地请求信号量OSSemAccept()查询信号量的当前状态OSSemQuery()2.信号量2021/8/614www.cuit.edu.cnµC/O
8、S-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0到65,535之间);另一个是由等待该信号量的任务组成的等待任务表;如果信号量是
此文档下载收益归作者所有