事件
事件是一种任务间通信的技术,和信号量不同,可以实现一对多,多对多的通信,但是不涉及数据的传输。
configUSE_16_BIT_TICKS
开启后,uxEventBits
为16位,8位存储事件组;未开启时,uxEventBits
为32位,24位存储事件组。- 事件只与任务相关联,事件之间彼此独立。
- 事件只同于同步,不涉及数据传输。
- 事件无队列消息性质,多次向同一任务发送事件,若未被读取,则视为一次事件。
- 支持事件等待超时机制。
事件运行机制
1 | //中断事件组 |
- 事件接收成功后,需要使用
xClearOnExit()
来清除事件类型,否则不会清除已接收的事件,需要手动显示清除。 - 24位存储事件中,
1
表示事件已发生,0
表示事件未发生
- 任务唤醒遵循事件的或与逻辑
事件常见函数
xEventGroupCreate()
创建事件组,返回一个句柄xEventGroupDelete()
删除事件xEventGroupSetBits()
置位事件组中指定的位,置位后,阻塞该位的任务会被解锁。xEventGroupSetBitsFromISR()
中断置位事件组,需要开启configUSE_TIMERS 1
和INCLUDE_xTimerPendFunctionCall 1
宏定义xEventGroupWaitBits()
等待事件,获取事件标志位。xEventGroupClearBits()
清除事件组置位xEventGroupClearBitsFromISR()
中断清除事件组置位
创建事件
创建2个Btn
任务控制LED
任务,当只按下BTN1
时,不亮,接着按下BTN2
后,亮。此时相当于标志位变得和设定相同。
开启宏定义
1 | //中断事件组 |
事件句柄,创建一个引用,并不是创建一个真实的事件
1 | //事件句柄 |
创建一个真实的事件
1 | //创建事件句柄 |
LED任务
1 | static void LED0_Event_Task(void *paramter) |
Key任务
1 | static void KEY_Event_Task(void *paramter) |
当BTN1和BTN2都按下后,才会翻转信号