任务或中断服务程序可以通过事件控制块(ECB)向另外的任务发信号,这里的信号被看成是事件。(1)中断服务程序不能等待事件控制块给它发送信号;(2)处于等待状态状态的任务可以设置等待超时;(3)多个任务同时等待一事件的发生,当事件发生时,只有优先级最高的任务得到该事件并进入就绪状态;
Ucosii通过ucos_ii.h中定义的OS_EVENT数据结构,维护一个事件控制块ECB的所有信息。该结构中除了包含事件本身的定义外,还定义了等待该事件的所有任务列表。 每个信号量、互斥型信号量、消息邮箱、消息队列都应分配到一个事件控制块。
600 将任务置于等待事件的任务列表
Pevent->OSEventGrp |= OSMapTbl[prio>>3];
Pevent->OSEventTbl[prio>>3] |= OSMapTbl[prio&0x07];
601 从等待事件的任务列表中使任务脱离等待状态
清除任务在OSEventTbl[]中的相应位,并且如果其所在组中没有其他处于等待事件的任务,OSEventGrp中的相应位也要清除掉。
602 在等待事件的任务列表中查找优先级最高的任务
和查找处于就绪状态的任务列表一样,通过查OSUnMapTbl[]得出。
603 空余事件控制块链表
事件控制块的总数由应用程序所需要的信号量、互斥型信号量、邮箱、消息队列的总数决定。所有事件控制块ECB被链接成一个单向链表---空余事件控制块链表。
604 初始化一个事件控制块 OS_EventWaitListInit()
当建立一个信号量、邮箱、消息队列时,相应的建立函数OS??Create()通过调用OS_EventWaitListInit(),对事件控制块中的等待任务列表进行初始化。该函数初始化一个空的等待任务列表,初始化完成时,表中没有任何等待事件的任务。函数传递一个指针变量给事件控制块,这个指针变量就是创建信号量、邮箱等时分配的事件控制块指针pevent.
605 使一个任务进入就绪态 OS_EventTaskRdy()
当某个事件发生了,要将等待该事件任务列表中最高优先级任务置于就绪态时,信号量、邮箱等所对应的POST函数调用OS_EventTaskRdy(),以实现该操作。
606 使一个任务进入等待某事件发生状态 OS_EventTaskWait()
当某任务须等待一个事件的发生时,信号量、邮箱等会通过相应的PEND函数调用函数OSEventTaskWait(),使当前任务从就绪任务列表中脱离就绪态,并放到相应事件的事件控制块ECB的等待任务表中。
607 由于等待超时而将任务置为就绪态 OS_EventTO()
如果在预先指定的等待时限内任务等待的事件没有发生,那么OSTimeTick()函数会因为等待超时而将任务的状态置为就绪态。这种情况下,信号量、邮箱等通过PEND函数调用OS_EventTO()函数,以完成这项工作。
第七章 信号量管理
信号量有2部分组成:(1)16位的无符号整型信号量的计数值(0-65535);(2)由等待该信号量的任务组成的等待任务表。
Ucosii提供了6个对信号量进行操作的函数,当OS_CFG.H中OS_SEM_EN设为0时,所有的信号量函数都不能用,若配置为1时,OSSemCreate(),OSSemPend(),OSSemPost()必须有。
700 建立一个信号量 OSSemCreate()
该函数用来建立一个信号量,并对它付初值。中断服务程序不能调用该函数
701 删除一个信号量 OSSemDel()
当OS_CFG.H中的OS_SEM_DEL_EN=1时,该函数才被编译。在删除信号量之前,必须首先删除操作该信号量的所有任务。中断服务程序不能调用该函数。
702 等待一个信号量 OSSemPend()
真正将任务置入睡眠状态的操作在OS_EventTaskWait()函数中执行;由于得不到信号量,当前任务就不能再处于就绪态了,于是调用任务调度函数让下一个处于最高优先级的任务运行,这样调用OSSempend()函数的任务被挂起了,直到信号量出现才能继续运行。中断服务程序不能调用该函数。
703 发出一个信号量 OSSemPost()
因为这个函数使更重要的任务进入了就绪态,故调用这个函数的任务就不能继续执行了。当中断服务子程序调用这个函数时,不会发生任务切换,要等到最外层的中断服务程序调用了OSIntExit()后才能进行。
704 无等待的请求一个信号量 OSSemAccept()
当任务请求一个信号量时,如果该信号量暂时无效,也可以让该任务简单的返回,而不是进入睡眠等待状态。
705 查询一个信号量的当前状态 OSSemQuery()
在应用程序中,随时可以调用函数OSSemQuery()来查询一个信号量的当前状态。该函数有2个参数:(1)指向信号量对应的事件控制块的指针pevent ;(2)指向用于记录信号量信息的数据结构OS_SEM_DATA的指针pdata.
第八章 互斥型信号量管理
任务可以用互斥型信号量实现对共享资源的独占式处理,互斥型信号量也称作mutex,mutex是二值信号量,除了有普通信号量的机制外,还有些其他特性(如降解优先级反转的问题)。
互斥型信号量由3个元素组成:
(1)1个标志,指示mutex是否可以使用(0或1);
(2)1个优先级,准备一旦高优先级的任务需要这个mutex,赋给占有mutex的任务; (3)一个等待该mutex的任务列表。
800 建立一个互斥型信号量 OSMutexCreate()
801 删除一个互斥型信号量 OSMutexDel()
802 等待一个互斥型信号量 OSMutexPend()
803 释放一个互斥型信号量 OSMmtexPost()
804 无等待的获取互斥型信号量(任务不挂起) OSMutexAccept()
805 获取互斥型信号量的当前状态 OSMutexQuery()
这章里变得6个函数和上一章的主要区别就在于: 互斥型信号量主要用于对共享资源进行独占式处理;并且增加了一个用于解决优先级反转的优先级。