FreeRTOS--事件组

事件组:利用队列标记前置任务,通过检查标记拉触发条件任务的机制。

例:存在任务A、B、C、D,C任务需要A或B完成后才可以触发,D任务需要A和B任务都完成才触发。
xEventGroupSetBits()函数可在A、B的对应位置(事件位)写1 or 0(事件标志)用来标记是否完成。

事件组的流程
创建事件组
等待(事件位,所有/任一,超时)
a.关闭调度器 (不会再ISR使用Event Group)
b.当前uxEventBits是否满足:
满足:返回ok,
不满足:
1.返回ERR
2.休眠:放入event_group.xTaskWaitForBits,并将该任务放进DelayList
设置事件
a.设置任务的事件位
b.唤醒所有满足条件的任务

Q:为什么等待时使用关闭调度器而不是关闭中断?
A:xEventGroupSetBits()和xEventGroupSetBitsFromISR()是有区别的,前者可以不受其他任务的影响设置事件标志,后者不会直接设置事件标志,而是将操作推迟到RTOS守护程序任务中,不会立即执行

### STM32 FreeRTOS 事件组使用教程 #### 定义与初始化事件组 事件组是一种用于同步多个任务的机制,在FreeRTOS中非常有用。为了定义并初始化一个事件组,可以使用`xEventGroupCreate()`函数[^2]。 ```c // 创建一个新的事件组 EventGroupHandle_t xCreatedEventGroup; void setup() { // 初始化事件组 xCreatedEventGroup = xEventGroupCreate(); } ``` 如果内存不足无法创建新的事件组,则返回NULL;否则返回新创建的事件组句柄。 #### 设置事件位 当某个条件满足或者特定事件发生时,可以通过调用`xEventGroupSetBits()`来设置指定位置上的比特位。 ```c void set_event_bit(void){ // 假设要设置第0位和第2位 EventBits_t uxBits = (1 << 0) | (1 << 2); // 设置这些位 xEventGroupSetBits(xCreatedEventGroup, uxBits); } ``` 此操作是非阻塞式的,意味着它会立即返回而不会等待任何其他事情的发生。 #### 等待事件位 为了让某些任务在特定条件下继续运行,可利用`xEventGroupWaitBits()`让该任务挂起直到所需的一系列事件被触发。 ```c void wait_for_events(void){ const TickType_t xTicksToWait = pdMS_TO_TICKS(100); // 超时时间设定为100ms // 等待第0位和第2位都被置位 EventBits_t uxBitWaitingFor = (1 << 0) | (1 << 2); while(true){ EventBits_t bits = xEventGroupWaitBits( xCreatedEventGroup, uxBitWaitingFor, // 所需的所有位都应处于已设置状态 pdTRUE, // 清除匹配后的相应位 pdFALSE, // 不要求所有请求的位都要就绪才能解除阻塞 xTicksToWait // 如果没有全部所需的位可用则在此时间内保持阻塞 ); if(bits & (1 << 0)){ // 处理第0位已被设置的情况... } if(bits & (1 << 2)){ // 处理第2位已被设置的情况... } // 继续循环监听更多事件... } } ``` 上述代码片段展示了如何在一个无限循环里持续监视两个不同的事件标志,并分别针对它们采取行动。 #### 删除事件组 不再需要使用的事件组应当及时释放资源,这可通过调用`vEventGroupDelete()`实现。 ```c void cleanup(){ // 删除之前创建的事件组以回收其占用的RAM空间 vEventGroupDelete(xCreatedEventGroup); } ``` 一旦删除了一个事件组,所有正在等待它的成员都会自动唤醒并且收到零作为结果值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉山有客不自赏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值