FREERTOS学习笔记,任务通知

简介

在之前的应用中我们通过一系列独立的任务来使用FREERTOS。但有时我们也需要任务之间相互交流。

通过中间项目交流

之前章节我们都是通过中间相来进行交流。例如信号量,队列等,中断或任务先将信号量或数据放入队列,然后等待其他任务的使用。

任务通知(直接交流)

任务通知,使得任务间可以直接交流,或使任务与中断同步。通过任务通知,中断或任务可直接将事件传递给需要的任务。
任务通知功能是可选功能,若要使用,需要将 FreeRTOSConfig.h中的configUSE_TASK_NOTIFICATIONS置为1。
当将configUSE_TASK_NOTIFICATIONS置为1后,每个任务都有一个通知状态,(挂起(Pending)或没挂起(Not-Pending))以及一个32位无符号整形的通知值,当一个任务接收到一个通知,它的通知状态会变为挂起,当任务读取了通知值后,其状态转为未挂起状态。一个任务可以阻塞等待其通知状态挂起。

任务通知的优点与限制

任务通知的性能优点

使用任务通知相比于信号量与队列可以更快传递数据。

任务通知的内存消耗优点

任务通知由于不用创建队列,信号量或事件组,因此消耗内存较小。

任务通知的限制

任务通知也有许多首先地方,例如:
1,给中断函数发送数据或事件,信号量等可以将事件或数据从任务传递给中断,也可从中断传递给任务,而任务通知只能从中断传递给任务,不能从任务传递给中断。
2,使能超过一个接受任务,中间交流相可以通过它的句柄被任意一个中断和任务所获取。而任务通知只能传递给一个任务。
3,多重数据,队列同一时间可以传递包含多个数据的项目,多个数据会保存在队列中等待使用,而任务通知一次性只能传递一个。
4等等。

使用任务通知

任务通知可选接口函数

任务通知非常灵活可以替换二进制信号量,计数信号量,,一个事件组或甚至一个队列。这个广泛的应用可通过 xTaskNotify() 来实现发送一个任务通知,通过 xTaskNotifyWait() 来接收一个任务通知。
然大多数情况下一个完整功能的xTaskNotify() 和 xTaskNotifyWait() 并不需要,因此我们可以采用 功能稍微受限的xTaskNotifyGive()来代替xTaskNotify(),通过功能受限的ulTaskNotifyTake()来代替xTaskNotifyWait() 。

xTaskNotifyGive()

将任务通知传递给任务,这将使得被传递的任务的任务通知状态进入挂起态,并且使任务通知的值加一。函数原型如下:

BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );

参数:
xTaskToNotify :任务句柄。
返回值,由于该函数是一个调用xTaskNotify() 的宏,故其返会值只有pdTRUE.

vTaskNotifyGiveFromISR()

中断安全函数,函数原型:

void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify,
						BaseType_t *pxHigherPriorityTaskWoken )
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值