1 FreeRTOS数据类型
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()
3.1 任务通知代替二值信号量(pdTRUE,任务通知值清零
)
- 任务句柄
- Main
- 为了方便管理,所有的任务创建函数都放在这个函数里面
- Receive1_Task
- Receive2_Task
- Send_Task
- 实验结果
3.2 任务通知代替计数信号量(pdFALSE,任务通知值减一
)
- 任务句柄
- Main
- 为了方便管理,所有的任务创建函数都放在这个函数里面
- Take_Task(通知值减一,类似计数型信号量)
- Give_Task
- 实验结果
4 函数说明:xTaskNotify()与xTaskGenericNotify()
- xTaskNotify()
- xTaskNotifyWait()
4.1 任务通知代替消息队列
- 任务句柄
- Main
- 为了方便管理,所有的任务创建函数都放在这个函数里面
- Receive1_Task
- Receive2_Task
- Send_Task
- 实验效果
4.2 任务通知代替事件组
- 任务句柄
- Main
- AppTaskCreate
- LED_Task(按下KEY1与KEY2都发生的时候,开发板的 LED会进行翻转。并打印
Key1与Key2都按下
) - KEY_Task
- 实验现象