信号 邮箱 消息队列都是需要先创建才能使用的,创建以上三者需要用到事件控制块这东西
什么是是事件控制块呢 可以这样理解,前面学习我们已经知道,创建一个任务需要给这个任务分配一个任务控制块,这个任务控制块存储
关于这个任务重要消息,那么事件控制块就好比任务里的任务控制块,它存储这个事件重要消息,我们说,创建一个事件,其本质的过程
就是初始化这个事件控制块,一个任务或中断服务子程序可以通过事件控制块ECB来向另外的任务发信号,这里所有的信号都被看成是事件(EVENT).
一个任务还可以等待另一个任务或中断服务子程序给它发送信号,这里要注意的是,只有任务可以等待事件发生,中断服务子程序是不能这样做的
对于处于等待的任务,还可以给它指定一个最长的等待事件,以此来防止因为等待的事件没有发生而无限等待下去。
多个任务可以同时等待同一个事件的发生,这种情况下,当该事件发生后,所有等待该事件的任务中,优先级最高的任务得到了该事件并进入就绪态,准备执行,上面
降到的事件,可以是信号量 邮箱或队列灯,当事件控制块是一个信号量时,任务可以等待它,它可以给它发送消息。
事件控制块是一个数据结构,其定义如下:
typedef struct{
void *OSEventPtr; //指向消息或消息队列指针
INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//等待任务表
INT16U OSEventCnt ; //计数器
INT8U OSEventType; //时间类型
INT8U OSEventGrp ;//等待任务在的组
}OS_EVENT;
OSEventPtr 指针,只有在定义的事件是邮箱或消息队列时才使用,当定义的事件是邮箱,它指向一个消息,当定义的是事件是消息队列时
它指向一个数据结构
OSEventTbl和OSEventGrp很像前面讲到的OSRdyTbl和OSRdyGrp,只不过前两部分的是等待事件的任务,后两者是包含的是系统中处于就绪的任务
OSEventCnt 当事件是一个信号量时,OSEventCnt是用于信号量的计数器。
OSEventType定义了事件的具体类型,它可以是信号量 邮箱 或消息队列