提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
&esmp;任务通知功能允许我们可以在不创建任务队列、信号量的前提下为任务发送信息,但这种发送只能发送给一个任务,且只有等待的任务被阻塞。
一、任务通知是什么
1.1 任务通知的引入
从Free RTOS的V8.2.0版本开始,增加了任务通知这一功能,每一个任务都有32位的通知值,在大多数情况下,任务通知可以代替二值信号量、计数信号量、长度为1的队列已经事件组,但是不可以代替互斥量。任务控制块中的成员变量 ulNotifiedValue就是这个通知值。任务通知是一个事件,假如某个任务通知的接收任务因为等待任务通知而阻塞的话,向这个接收任务发送任务通知以后就会解除这个任务的阻塞状态。也可以更新接收任务的任务通知值,任务通知可以通过如下方法更新接收任务的通知值:
● 不覆盖接收任务的通知值(如果上次发送给接收任务的通知还没被处理)。
● 覆盖接收任务的通知值。
● 更新接收任务通知值的一个或多个 bit。
● 增加接收任务的通知值
1.2 任务通知与队列/信号量的区别
1.3 任务通知的运行机制
- 无需创建、任务和中断都可以发送但是中断不可以等待通知。
- 发送通知: 其他任务或中断发送通知时,会修改目标任务的通知值。如果任务当前正在等待通知,接收到通知后它会立即从阻塞状态恢复执行。如果不阻塞,通知值会累积或替换,具体取决于发送通知时设置的操作模式。
- 等待通知: 任务可以通过ulTaskNotifyTake()或xTaskNotifyWait()等待通知值到来。在调用这些 API 时,任务可以选择:
● 阻塞直到接收到通知。
● 超时等待一段时间,若超时仍未收到通知则继续执行其他操作。
● 不阻塞直接检查通知值是否可用。 - 通知值的处理: 当任务收到通知时,它可以检查通知值,并根据值的变化(例如增加或减少)做出相应动作。任务的通知值可以代表任务的进度、状态或者某些计数。
二、相关API函数
2.1 通知发送
xTaskNotify()
向目标任务发送通知,可以选择更新通知值(例如增加、设定或替换)。
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify,
uint32_t ulValue, eNotifyAction eAction )
-
参数:
- xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
- ulValue: 任务通知值。
- eAction: 任