本次实验是验证任务通知,一共分为两个实验。
任务通知是FreeRTOS的一种进程间的通讯技术。使用任务通知可以不用向之前那样创建中间变量,可以直接从任务到任务或者从ISR向任务发送通知。
本次实验采用STM32F103ZET6主芯片的开发板,使用HAL库开发。
任务通知的特点
优点
效率更高:使用任务通知来发送事件、数据给某个任务时,效率更高。比队列、信号量、事件组都有大的优势。
更节省内存:使用其他方法时都要先创建对应的结构体,使用任务通知时无需额外创建结构体。只使用一个uint32_t类型的变量。
缺点
不能发送数据给ISR:ISR并没有任务结构体,所以无法使用任务通知的功能给ISR发送数据。但是ISR可以使用任务通知的功能,发数据给任务。
数据只能给该任务独享:使用队列、信号量、事件组时,数据保存在这些结构体中,其他任务、ISR都可以访问这些数据。使用任务通知时,数据存放入目标任务中,只有它可以访问这些数据。
无法缓冲数据:使用任务通知时,任务结构体中只有一个任务通知值,只能保持一个数据。
无法广播给多个任务:使用事件组可以同时给多个任务发送事件。但是使用任务通知,只能发个一个任务。
如果发送受阻,发送方无法进入阻塞状态等待:使用任务通知时,即使对方无法接收数据,发送方也无法阻塞等待,只能即刻返回错误。
使用任务通知可以代替信号量和事件组,也可以代替只有一个uint32_t类型存储单元的队列。
任务通知相关函数
发送相关函数
| 函数 |
描述 |
| xTaskNotify() |
发送通知,带有通知值并且不保留接收任务原通知值,用在任务中。 |
| xTaskNotifyFromISR() |
发送通知,函数xTaskNotify()的中断版本。 |
| xTaskNotifyGive() |
发送通知,不带通知值并且不保留接收任务的通知值,此函数会将接收任务的通知值加一,用于任务中。 |
| vTaskNotifyGiveFromISR() |
发送通知,函数xTaskNotifyGive()的中断版本。 |
| xTaskNotifyAndQuery() |
发送通知,带有通知值并且保留接收任务的原通知值,用在任务中。 |
| XTaskNotiryAndQueryFromISR() |
发送通知,函数xTaskNotifyAndQuery() |

本文介绍了在STM32F103ZET6开发板上使用FreeRTOS的任务通知功能,对比了任务通知与其他通信机制如队列、信号量和事件组的优缺点。实验通过中断触发ADC转换,利用任务通知传递数据,展示了任务通知如何作为二值信号量和计数信号量的替代品。此外,还提供了相关函数的详细说明和实验代码,演示了任务通知在不同场景下的应用。

1362

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



