今天说一下uCOS的事件。
事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。与信号量不同的是,它可以实现一对多,多对多的同步。即一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。同样,也可以是多个任务同步多个事件。
任务可以通过设置事件位来实现事件的触发和等待操作。uCOS 的事件仅用于同步,不提供数据传输功能。
其实事件有点像是一个标志位,某件事情发生了,就将相应的标志位置1,查看标志位就可以知道事件有没有发生。
在 uCOS 的等待事件中,用户可以选择感兴趣的事件,并且选择等待事件的选项,它有 4 个属性,分别是逻辑与、逻辑或、等待所有事件清除或者等待任意事件清除。当任务等待事件同步时,可以通过任务感兴趣的事件位和事件选项来判断当前获取的事件是否满足要求,如果满足则说明任务等待到对应的事件,系统将唤醒等待的任务;否则,任务会根据用户指定的阻塞超时时间继续等待下去。
接下来说一下事件的几个函数。
1、事件创建函数 OSFlagCreate()
OSFlagCreate ((OS_FLAG_GRP *)&flag_grp, //指向事件标志组的指针
(CPU_CHAR *)"FLAG For Test", //事件标志组的名字
(OS_FLAGS )0, //事件标志组的初始值
(OS_ERR *)&err); //返回错误类型
2、事件删除函数 OSFlagDel()
OS_OBJ_QTY OSFlagDel (OS_FLAG_GRP *p_grp,//事件标志组指针
OS_OPT opt, //选项
OS_ERR *p_err)//返回错误类型
3、事件设置函数 OSFlagPost()
OS_FLAGS OSFlagPost (OS_FLAG_GRP *p_grp,//事件标志组指针
OS_FLAGS flags,//选定要操作的标志位
OS_OPT opt, //选项
OS_ERR *p_err)//返回错误类型
4、事件等待函数 OSFlagPend()
OS_FLAGS OSFlagPend (OS_FLAG_GRP *p_grp, //事件标志组指针
OS_FLAGS flags, //选定要操作的标志位
OS_TICK timeout,//等待期限(单位:时钟节拍)
OS_OPT opt, //选项
CPU_TS *p_ts, //返回等到事件标志时的时间戳
OS_ERR *p_err) //返回错误类型
这个稍微注意一下选项这里,我们可以看一下他的代码
switch(opt){ //根据选项分类处理
case OS_OPT_PEND_FLAG_CLR_ALL: //如果选项在预期内
case OS_OPT_PEND_FLAG_CLR_ANY:
case OS_OPT_PEND_FLAG_SET_ALL:
case OS_OPT_PEND_FLAG_SET_ANY:
case OS_OPT_PEND_FLAG_CLR_ALL | OS_OPT_PEND_FLAG_CONSUME:
case OS_OPT_PEND_FLAG_CLR_ANY | OS_OPT_PEND_FLAG_CONSUME:
case OS_OPT_PEND_FLAG_SET_ALL | OS_OPT_PEND_FLAG_CONSUME:
case OS_OPT_PEND_FLAG_SET_ANY | OS_OPT_PEND_FLAG_CONSUME:
case OS_OPT_PEND_FLAG_CLR_ALL | OS_OPT_PEND_NON_BLOCKING:
case OS_OPT_PEND_FLAG_CLR_ANY | OS_OPT_PEND_NON_BLOCKING:
case OS_OPT_PEND_FLAG_SET_ALL | OS_OPT_PEND_NON_BLOCKING:
case OS_OPT_PEND_FLAG_SET_ANY | OS_OPT_PEND_NON_BLOCKING:
case OS_OPT_PEND_FLAG_CLR_ALL | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_NON_BLOCKING:
case OS_OPT_PEND_FLAG_CLR_ANY | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_NON_BLOCKING:
case OS_OPT_PEND_FLAG_SET_ALL | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_NON_BLOCKING:
case OS_OPT_PEND_FLAG_SET_ANY | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_NON_BLOCKING:
break; //直接跳出
可以选择清除或者是设置任何一件(any)事情发生就触发,也可以选择等待所有(all)事件都发生的时候再触发,还可以选择等待事件是否要阻塞。
总的来说,和之前的操作相似。