FreeRTOS之任务通知综合

340 阅读2分钟

1 FreeRTOS数据类型

image.png

2 任务通知基本概念

  • FreeRTOS 从V8.2.0版本开始提供任务通知这个功能,每个任务都有一个 32位的通知 值,在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件组,也可以替代 长度为 1 的队列(可以保存一个32位整数或指针值)。
  • 对于以前使用 FreeRTOS 内核通信的资源,必须创建队列、二进制信号量、计数信 号量或事件组的情况,使用任务通知显然更灵活。按照 FreeRTOS 官方的说法,使用任务 通知比通过信号量等 ICP 通信方式解除阻塞的任务要快 45%,并且更加省 RAM 内存空间 (使用 GCC 编译器,-o2 优化级别)
  • 想要使用任务通知, 必须将 FreeRTOSConfig.h 中的宏定义 configUSE_TASK_NOTIFICATIONS 设置为 1,其实 FreeRTOS默认是为 1的,所以任务通知是默认使能的。

3 函数说明:xTaskNotifyGive()与ulTaskNotifyTake()

image.png image.png

3.1 任务通知代替二值信号量(pdTRUE,任务通知值清零

  • 任务句柄 image.png image.png
  • Main image.png
  • 为了方便管理,所有的任务创建函数都放在这个函数里面 image.png
  • Receive1_Task image.png
  • Receive2_Task image.png
  • Send_Task image.png
  • 实验结果
  • image.png

3.2 任务通知代替计数信号量(pdFALSE,任务通知值减一

  • 任务句柄 image.png image.png
  • Main image.png
  • 为了方便管理,所有的任务创建函数都放在这个函数里面 image.png
  • Take_Task(通知值减一,类似计数型信号量) image.png
  • Give_Task image.png
  • 实验结果
  • image.png

4 函数说明:xTaskNotify()与xTaskGenericNotify()

  • xTaskNotify() image.png image.png image.png
  • xTaskNotifyWait() image.png image.png

4.1 任务通知代替消息队列

  • 任务句柄 image.png image.png
  • Main image.png
  • 为了方便管理,所有的任务创建函数都放在这个函数里面 image.png
  • Receive1_Task image.png
  • Receive2_Task image.png
  • Send_Task image.png image.png
  • 实验效果
  • image.png

4.2 任务通知代替事件组

  • 任务句柄 image.png
  • Main image.png image.png
  • AppTaskCreate image.png
  • LED_Task(按下KEY1与KEY2都发生的时候,开发板的 LED会进行翻转。并打印Key1与Key2都按下image.png
  • KEY_Task image.png
  • 实验现象
  • image.png