1、事件标志组
事件标志组是一种轻量级的同步原语,用于在任务之间传递信息。每个标志组实际上是一个32位的整数,其中每一位都可以作为一个单独的标志位。这些标志位可以被任务设置、清除和等待。
虽然是32位,但是高8位用于存储事件标志组的控制信息,余下的24位用于存储事件标志!!!
本次
创建一个事件标志组,在任务1中进行串口接收,检测到串口调试助手发送A、B,任务2运行。
2、相关API
xEventGroupCreate() //使用动态方式创建事件标志组
xEventGroupCreateStatic() //使用静态方式创建事件标志组
xEventGroupClearBits() //清零事件标志位
xEventGroupClearBitsFromISR() //在中断中清零事件标志位
xEventGroupSetBits() //设置事件标志位
xEventGroupSetBitsFromISR() //在中断中设置事件标志位
xEventGroupWaitBits() //等待事件标志位
2.1 事件标志组创建
EventGroupHandle_t xEventGroupCreate( void );
/*
参数:
无
返回值:
成功,返回对应事件标志组的句柄;
失败,返回 NULL 。
*/
2.2 事件标志位设置
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet );
/*
参数:
xEventGroup:对应事件组句柄。
uxBitsToSet:指定要在事件组中设置的一个或多个位的按位值。
返回值:
设置之后事件组中的事件标志位值。
*/
2.3 事件标志位清除
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToClear );
/*
参数:
xEventGroup:对应事件组句柄。
uxBitsToClear:指定要在事件组中清除的一个或多个位的按位值。
返回值:
清零之前事件组中事件标志位的值。
*/
2.4 事件标志位等待
EventBits_t xEventGroupWaitBits(
const EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToWaitFor,
const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
TickType_t xTicksToWait );
/*
xEventGroup:对应的事件标志组句柄
uxBitsToWaitFor:指定事件组中要等待的一个或多个事件位的按位值
xClearOnExit:pdTRUE——清除对应事件位,pdFALSE——不清除
xWaitForAllBits:pdTRUE——所有等待事件位全为1(逻辑与),pdFALSE——等待的事件位有一个为1
(逻辑或)
xTicksToWait:超时
返回值:
等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位
其他值:等待事件标志位失败,返回事件组中的事件标志位
*/
3、STM32CubeMX配置
如果使用的是V1版本的freertos则不用STM32CubeMX配置,直接在软件添加设计!
将上次创建的三个任务删除避免对本次教程造成干扰!
删除后仅剩下任务1、2!

4、Keil 5程序设计
4.1 设置标志位任务
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
uint16_t buf = 100;
EventBits_t status;
EventBits_t status2;
/* Infinite loop */
for(;;)
{
if(sign_1==1){
status = xEventGroupSetBits(myEvent01Handle, 0x01);
sign_1=0;
}
else if(sign_1==2){
status2 = xEventGroupSetBits(myEvent01Handle, 0x02);
sign_1=0;
}
osDelay(1);
}
/* USER CODE END StartDefaultTask */
}
4.2等待事件标志位任务
void StartTask02(void *argument)
{
/* USER CODE BEGIN StartTask02 */
EventBits_t event_flag = 0;
/* Infinite loop */
for(;;)
{
event_flag = xEventGroupWaitBits( myEvent01Handle, 0x01 | 0x02, pdTRUE, pdTRUE, portMAX_DELAY );
printf("返回值:%#x,OK!\r\n",event_flag);
osDelay(1);
}
/* USER CODE END StartTask02 */
}
4.3 测试
上文如有错误,恳请各位大佬指正!

事件标志组&spm=1001.2101.3001.5002&articleId=142159897&d=1&t=3&u=77f4ef650a5640d89942f34b006adc96)
1万+

被折叠的 条评论
为什么被折叠?



