130 likes | 374 Views
事件控制块. 事件控制块. UCOS-II 把进程间通信机制(邮箱和消息队列)以及同步机制(信号量, Mutex) 都看作是 “ 事件 ” ,用一个统一的数据结构:事件控制块来管理,这样简化了代码。 在 os_core.c 中提供了几个对 ECB 操作的函数,这些函数为所有的进程间通信和同步机制提供一致的服务 而每个进程间通信和同步机制则在这个 ECB 的基础上扩展各自的功能;简单的说 ECB 把对于所有机制共同的东西封装在一起。 系统中所有的空闲 ECB 连成一个以 OSEventFreeList 为头的单链表
E N D
事件控制块 • UCOS-II把进程间通信机制(邮箱和消息队列)以及同步机制(信号量,Mutex)都看作是“事件”,用一个统一的数据结构:事件控制块来管理,这样简化了代码。 • 在os_core.c中提供了几个对ECB操作的函数,这些函数为所有的进程间通信和同步机制提供一致的服务 • 而每个进程间通信和同步机制则在这个ECB的基础上扩展各自的功能;简单的说ECB把对于所有机制共同的东西封装在一起。 • 系统中所有的空闲ECB连成一个以OSEventFreeList为头的单链表 • 但是与TCB不同,系统把所有已经分配的TCB也连成个链表(以OSTCBList为头);然而所有已经被分配的ECB并不连成链表 Lzp<bluefeynman@gmail.com>
事件控制块ECB的定义 Lzp<bluefeynman@gmail.com>
事件控制块的基本操作 • 初始化 • 因为一个事件发生,使一个任务进入就绪态 • 因为等待一个事件,使任务进入等待状态 • 因为等待超时而使任务进入就绪态 Lzp<bluefeynman@gmail.com>
初始化操作 • OS_EventWaitListInit()初始化一个空的等待任务列表,即设置.OSEventGrp和.OSEventTbl为0,表示当前没有任务等待这个事件 • 该函数被OSSemCreate(),OSMutexCreate(),OSMboxCreate(),OSQCreate()调用用来建立一个新的信号量,互斥体,邮箱或者队列 Lzp<bluefeynman@gmail.com>
使一个任务进入就绪态 • 如果一个任务先前因为等待一个事件而进入waiting状态,则当该事件发生时,应该唤醒这个任务,使其进入就绪状态 • 由OS_EventTaskRdy()函数实现 Lzp<bluefeynman@gmail.com>
等待事件 • OS_EventTaskWait()让一个任务等待某事件的发生,从而使得该任务进入等待状态 Lzp<bluefeynman@gmail.com>
OS_EventTO() • 如果一个任务等待某事件超时了,即该事件在指定的时间deadline前没有发生,则任务将不再继续等待,而是直接进入就绪态 • 该函数被OSSemPend等函数内部调用 Lzp<bluefeynman@gmail.com>
OSSemPend()对其的调用 ->OSTCBPendTO由OSTimeTick设置 Lzp<bluefeynman@gmail.com>
整体流程---以信号量为例 • OSSemPend设置一个timeout,并让一个任务进入等待状态OSSched切换到别的任务运行时钟节拍到来,OSTimeTick不断减小timeout如果timeout被减到0,该事件仍未发生,则OSTimeTick设置任务为就绪态,再做调度如果该任务被调度器选中运行,则回到OSSemPend里面OSSched 后面一条指令在这里调用OSEventTO把该任务从事件的等待任务列表中删除 Lzp<bluefeynman@gmail.com>