山东网站开发网络公司,营销型网站建设实战》,小程序制作需要什么条件,网页美工设计说明书目录
一、简介
二、 事件控制块
三、相关API
四、 应用场景 一、简介 在FreeRTOS中#xff0c;使用信号量可以实现同步#xff0c;但是使用信号量来同步的话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行同步#xff0c;此时信号量就无能为力。…目录
一、简介
二、 事件控制块
三、相关API
四、 应用场景 一、简介 在FreeRTOS中使用信号量可以实现同步但是使用信号量来同步的话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行同步此时信号量就无能为力。FreeRTOS为此提供了一个可选的解决方法那就是事件标志组。 FreeRTOS中的事件标志组Event Groups 是一种任务间同步机制允许多个任务通过设置或等待标志位来同步彼此的行为。每个事件标志组由一组32 位的二进制标志组成其中每一位标志位可以表示某个事件的状态0 或 1任务可以对这些标志进行设置、清除、等待进而实现更灵活的任务间通信和同步。 二、 事件控制块 在 FreeRTOS 中事件标志组Event Group 的控制块是对事件标志组进行管理和操作的核心数据结构。它存储了事件标志组的状态以及操作这些标志位所需的所有信息。每当创建事件标志组时FreeRTOS 会为其分配一个控制块即事件组的句柄该控制块负责管理事件标志组的标志位及其相关的任务同步信息。 三、相关API 事件标志组的使用一般包含创建事件、置位事件标志、等待事件标志、清除事件标志和删除事件。 1.创建事件
xEventGroupCreate() 无参数创建成功返回事件句柄创建失败返回 NULL。 2.置位事件置1 xEventGroupSetBits(xEventGroup, uxBitsToSet)参数为事件句柄xEventGroup和需要置位的位0x08置位位3000010000x09置位位8和位000001001。当位被置位之后阻塞在该位上的任务将会被解锁。 3.中断服务例程ISR中的置位事件 4.等待事件 等待时间xTicksToWait取0~portMAT_DELAY0表示不等待 portMAT_DELAY表示一直等待。 5.清除事件 置0 若在上述等待事件并获取事件标志位时没有选择清除相应的位复位置0则要使用这里的清除事件的函数来清除要清除的位。 6.删除事件
vEventGroupDelete(xEventGroup) 参数为事件句柄。该函数不允许在中断里面使用。当事件组被删除之后阻塞在该事件组上的任务都会被解锁并向等待事件的任务返回为0的事件组的值。 四、应用场景 同步多个任务 在这个场景中任务 A 必须等待任务 B 和任务 C 完成各自的操作然后再继续执行。如下 EventGroupHandle_t xEventGroup; //定义一个事件句柄
xEventGroup xEventGroupCreate(); //创建事件标志组
if (xEventGroup NULL) //判断是否创建成功
{//处理创建失败的情况
}void vTaskA(void *pvParameters) //任务A
{EventBits_t uxBits; //定义EventBits_t类型的变量uxBits xEventGroupWaitBits(xEventGroup,(1 0) | (1 1), //等待任务B、C完成位0、位1被置位pdTRUE, //清除标志位pdTRUE, //等待所有位portMAX_DELAY); //无限期等待//任务B和C完成后继续执行接下来的操作}void vTaskB(void *pvParameters) //任务B
{//执行某些操作xEventGroupSetBits(xEventGroup, (1 0)); //操作完成置位事件组的位0
}void vTaskC(void *pvParameters) //任务C
{//执行某些操作xEventGroupSetBits(xEventGroup, (1 1)); //操作完成置位事件组的位1
}2.等待任意一个事件发生 在这个场景中只需通过设置 xWaitForAllBits 参数为 pdFALSE 即可实现。