1 / 13

事件控制块

事件控制块. 事件控制块. UCOS-II 把进程间通信机制(邮箱和消息队列)以及同步机制(信号量, Mutex) 都看作是 “ 事件 ” ,用一个统一的数据结构:事件控制块来管理,这样简化了代码。 在 os_core.c 中提供了几个对 ECB 操作的函数,这些函数为所有的进程间通信和同步机制提供一致的服务 而每个进程间通信和同步机制则在这个 ECB 的基础上扩展各自的功能;简单的说 ECB 把对于所有机制共同的东西封装在一起。 系统中所有的空闲 ECB 连成一个以 OSEventFreeList 为头的单链表

Download Presentation

事件控制块

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 事件控制块

  2. 事件控制块 • UCOS-II把进程间通信机制(邮箱和消息队列)以及同步机制(信号量,Mutex)都看作是“事件”,用一个统一的数据结构:事件控制块来管理,这样简化了代码。 • 在os_core.c中提供了几个对ECB操作的函数,这些函数为所有的进程间通信和同步机制提供一致的服务 • 而每个进程间通信和同步机制则在这个ECB的基础上扩展各自的功能;简单的说ECB把对于所有机制共同的东西封装在一起。 • 系统中所有的空闲ECB连成一个以OSEventFreeList为头的单链表 • 但是与TCB不同,系统把所有已经分配的TCB也连成个链表(以OSTCBList为头);然而所有已经被分配的ECB并不连成链表 Lzp<bluefeynman@gmail.com>

  3. 事件控制块ECB的定义 Lzp<bluefeynman@gmail.com>

  4. 事件控制块的基本操作 • 初始化 • 因为一个事件发生,使一个任务进入就绪态 • 因为等待一个事件,使任务进入等待状态 • 因为等待超时而使任务进入就绪态 Lzp<bluefeynman@gmail.com>

  5. 初始化操作 • OS_EventWaitListInit()初始化一个空的等待任务列表,即设置.OSEventGrp和.OSEventTbl为0,表示当前没有任务等待这个事件 • 该函数被OSSemCreate(),OSMutexCreate(),OSMboxCreate(),OSQCreate()调用用来建立一个新的信号量,互斥体,邮箱或者队列 Lzp<bluefeynman@gmail.com>

  6. Lzp<bluefeynman@gmail.com>

  7. 使一个任务进入就绪态 • 如果一个任务先前因为等待一个事件而进入waiting状态,则当该事件发生时,应该唤醒这个任务,使其进入就绪状态 • 由OS_EventTaskRdy()函数实现 Lzp<bluefeynman@gmail.com>

  8. Lzp<bluefeynman@gmail.com>

  9. 等待事件 • OS_EventTaskWait()让一个任务等待某事件的发生,从而使得该任务进入等待状态 Lzp<bluefeynman@gmail.com>

  10. OS_EventTO() • 如果一个任务等待某事件超时了,即该事件在指定的时间deadline前没有发生,则任务将不再继续等待,而是直接进入就绪态 • 该函数被OSSemPend等函数内部调用 Lzp<bluefeynman@gmail.com>

  11. OSSemPend()对其的调用 ->OSTCBPendTO由OSTimeTick设置 Lzp<bluefeynman@gmail.com>

  12. Lzp<bluefeynman@gmail.com>

  13. 整体流程---以信号量为例 • OSSemPend设置一个timeout,并让一个任务进入等待状态OSSched切换到别的任务运行时钟节拍到来,OSTimeTick不断减小timeout如果timeout被减到0,该事件仍未发生,则OSTimeTick设置任务为就绪态,再做调度如果该任务被调度器选中运行,则回到OSSemPend里面OSSched 后面一条指令在这里调用OSEventTO把该任务从事件的等待任务列表中删除 Lzp<bluefeynman@gmail.com>

More Related