• FreeRTOS 事件标志组 详解


    目录

    什么是事件标志组?

    事件标志位

    事件标志组

    事件标志组相关 API 函数

    1. 创建事件标志组

    2. 设置事件标志位

    3. 清除事件标志位

    4. 等待事件标志位

    事件标志组实操


    什么是事件标志组?

    事件标志位

    表明某个事件是否发生,联想:全局变量 flag。通常按位表示,每一个位表示一个事件(高8位不算)

    事件标志组

    是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。

    事件标志组本质是一个 16 位或 32 位无符号的数据类型 EventBits_t ,由 configUSE_16_BIT_TICKS 决定。

    虽然使用了 32 位无符号的数据类型变量来存储事件标志, 但其中的高8位用作存储事件标志组的 控制信息,低 24 位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志!

    事件标志组相关 API 函数

                                    函数                                描述
    xEventGroupCreate()使用动态方式创建事件标志组
    xEventGroupCreateStatic()使用静态方式创建事件标志组
    xEventGroupClearBits()清零事件标志位
    xEventGroupClearBitsFromISR()在中断中清零事件标志位
    xEventGroupSetBits()设置事件标志位
    xEventGroupSetBitsFromISR()在中断中设置事件标志位
    xEventGroupWaitBits()等待事件标志位

    1. 创建事件标志组

    EventGroupHandle_t xEventGroupCreate( void );

    参数:

    返回值:

    成功,返回对应事件标志组的句柄;

    失败,返回 NULL 。

    2. 设置事件标志位

    1. EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
    2. const EventBits_t uxBitsToSet );

    参数:

    xEventGroup:对应事件组句柄。 uxBitsToSet:指定要在事件组中设置的一个或多个位的按位 值。

    返回值:

    设置之后事件组中的事件标志位值。

    3. 清除事件标志位

    1. EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,
    2. const EventBits_t uxBitsToClear );

    参数:

    xEventGroup:对应事件组句柄。 uxBitsToClear:指定要在事件组中清除的一个或多个位的按位 值。

    返回值:

    清零之前事件组中事件标志位的值。

    4. 等待事件标志位

    1. EventBits_t xEventGroupWaitBits(
    2. const EventGroupHandle_t xEventGroup,
    3. const EventBits_t uxBitsToWaitFor,
    4. const BaseType_t xClearOnExit,
    5. const BaseType_t xWaitForAllBits,
    6. TickType_t xTicksToWait );

    参数:

    xEventGroup:

    • 对应的事件标志组句柄

    uxBitsToWaitFor:

    • 指定事件组中要等待的一个或多个事件位的按位值

    xClearOnExit:

    • pdTRUE——清除对应事件位,
    • pdFALSE——不清除

    xWaitForAllBits:

    • pdTRUE——所有等待事件位全为1(逻辑与),
    • pdFALSE——等待的事件位有一个为1(逻辑或)

    xTicksToWait:

    • 超时时间,0 表示不超时,
    • portMAX_DELAY表示卡死等待

    返回值:

    等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位

    其他值:等待事件标志位失败,返回事件组中的事件标志位

    事件标志组实操

    创建一个事件标志组和两个任务( task1 和 task2),task1 检测按键,如果检测到 KEY1 和 KEY2 都按过,则执行 task2 。

    1.打开CubeMX,将FreeRTOS移植到STM32F103C8T6,具体看我之前写过的文章

    将FreeRTOS移植到STM32F103C8T6

    2.增加两个任务,配置两个输入引脚给按键Key1和Key2,导出代码

    3.在代码中创建一个事件标志组

    1. EventGroupHandle_t eventgroup_handle; // 事件标志组句柄
    2. eventgroup_handle = xEventGroupCreate(); // 创建一个事件标志组

    4.task1 检测按键,如果检测到 KEY1 和 KEY2 都按过,则执行 task2

    freertos.c

    1. void StartTaskKey1(void const * argument)
    2. {
    3. for(;;)
    4. {
    5. if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
    6. {
    7. osDelay(20);
    8. if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
    9. {
    10. xEventGroupSetBits(eventgroup_handle, 0x01);
    11. }
    12. while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);
    13. }
    14. if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET)
    15. {
    16. osDelay(20);
    17. if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET)
    18. {
    19. xEventGroupSetBits(eventgroup_handle, 0x02);
    20. }
    21. while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET);
    22. }
    23. osDelay(10);
    24. }
    25. }
    26. void StartTaskKey2(void const * argument)
    27. {
    28. for(;;)
    29. {
    30. event_bit = xEventGroupWaitBits(eventgroup_handle,0x01|0x02,pdTRUE,pdTRUE,portMAX_DELAY);
    31. printf("返回值:%#x,按键都按下,任务2可以执行了\r\n",event_bit); // %#x是带格式输出, 效果为在输出前加0x.
    32. osDelay(1);
    33. }
    34. }

    5.打开串口助手看运行结果

  • 相关阅读:
    flutter系列之:深入理解布局的基础constraints
    Mann-Kendall 检验
    jdk 11 自带的HttpClient
    【EI会议征稿】第五届大数据与信息化教育国际学术会议(ICBDIE 2024)
    信息登记小程序怎么做_扫码等级小程序制作步骤
    Mybatis Plus 多租户id使用
    MySQL限制登陆失败次数配置
    阿里云使用https获取git地址注意事项
    Mock笔记
    阿里p8扫地僧最新分享的“Redis深度笔记”,全程精点无废话
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/134015054