• 11.FreeRTOS_事件组


    事件组概述

    事件组的作用:

    • 可以等待某一个事件发生
    • 可以等待若干个事件发生
    • 可以等待若干个事件中的某一个事件发生

    同步点是事件组的另一个使用方式,它可以让多个任务进行阻塞等待,当全部事件完成后,再一起解除任务的阻塞。常常用于合作关系的情况。

    相关函数

    创建事件组

    函数声明如下:

    EventGroupHandle_t xEventGroupCreate( void )

    返回值:事件组的句柄

    设置事件组

    函数声明如下:

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

    xEventGroup:事件组的句柄,设置哪一个事件组

    uxBitsToSet :设置哪一个事件,以bit传入,设置bit3就传入 (1<<3),设置多个可用 ‘ | ’实现

    等待事件组

    函数声明如下:

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

    xEventGroup:事件组的句柄,设置哪一个事件组

    uxBitsToWaitFor:要等待的事件,以bit传入

    xClearOnExit:当函数返回之前,是否清除这个事件。传入pdFALSE、pdTRUE

    xWaitForAllBits:是否等待全部

    • 传入pdFALSE代表有一个事件发生即可解除阻塞
    • 传入pdTRUE代表必须全部事件发生才可解除阻塞

    xTicksToWait :超时时间

    同步点

    函数声明如下:

    1. EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,
    2. const EventBits_t uxBitsToSet,
    3. const EventBits_t uxBitsToWaitFor,
    4. TickType_t xTicksToWait )

    xEventGroup:事件组的句柄,设置哪一个事件组

    uxBitsToSet:设置自己做完了哪一个事件,以bit传入

    uxBitsToWaitFor:要等待哪些事件完成,以bit传入,只有当全部等待的事件完成后才可退出阻塞

    xTicksToWait :超时

    uxBitsToWaitFor设置的事件都完成后,多个任务会同时从这个函数退出来,不再阻塞。退出函数之后,会自动清除uxBitsToWaitFor设置的事件的位

    验证实验

    现在有3个任务,任务1在做一件很长时间的事情,任务2也在做一个很长时间的事情,任务3在等待这两个任务中其中一个完成后,打印task finish字符串

    具体代码实现如下:

    1. EventGroupHandle_t xEventHandle_Test;/* 事件组句柄 */
    2. void TaskAFunction(void *param){
    3. int i=0;
    4. int j=0;
    5. while(1){
    6. /* 做一个很长时间的任务 */
    7. for(i=0;i<10000;i++){
    8. j++;
    9. }
    10. /* 设置事件0 */
    11. xEventGroupSetBits(xEventHandle_Test,1<<0);
    12. }
    13. }
    14. void TaskBFunction(void *param){
    15. int i=0;
    16. int j=0;
    17. while(1){
    18. /* 做一个很长时间的任务 */
    19. for(i=0;i<20000;i++){
    20. j++;
    21. }
    22. /* 设置事件1 */
    23. xEventGroupSetBits(xEventHandle_Test,1<<1);
    24. }
    25. }
    26. void TaskCFunction(void *param){
    27. while(1){
    28. /* 等待事件组,pdFALSE代表等待的事件有一个发生即可解除阻塞 */
    29. xEventGroupWaitBits(xEventHandle_Test,(1<<0)|(1<<1),pdTRUE,pdFALSE,portMAX_DELAY);
    30. printf("task finish\r\n");
    31. }
    32. }
    33. int main( void )
    34. {
    35. TaskHandle_t xHandleTask1;
    36. TaskHandle_t xHandleTask2;
    37. TaskHandle_t xHandleTask3;
    38. prvSetupHardware();
    39. SerialPortInit();
    40. printf("UART TEST\r\n");
    41. /* 创建事件组 */
    42. xEventHandle_Test = xEventGroupCreate();
    43. xTaskCreate(TaskAFunction,"TaskA",100,(void*)NULL,1,&xHandleTask1);
    44. xTaskCreate(TaskBFunction,"TaskB",100,(void*)NULL,1,&xHandleTask2);
    45. xTaskCreate(TaskCFunction,"TaskC",100,(void*)NULL,1,&xHandleTask3);
    46. vTaskStartScheduler();
    47. return 0;
    48. }
  • 相关阅读:
    测试技术:关于上下文驱动测试的总结
    (滑动窗口) 76. 最小覆盖子串 ——【Leetcode每日一题】
    Java面试题(外包公司)
    Java发送mail并更新日历信息及jar包冲突问题
    shopee店铺销量突然下降怎么办——扬帆志远
    测试工作3年还在基础岗?可能只是因为你的工作能力差
    方法参数调用-两种情况
    定制密钥管理系统的好处 安当加密
    数据挖掘技术-转换字符串时间为标准时间
    索引使用与注意事项
  • 原文地址:https://blog.csdn.net/Fresh_man111/article/details/140404917