任务通知(Task Notifications)

任务通知简介

相对于以前使用 FreeRTOS 内核通信的资源, 必须创建队列、 二进制信号量、计数信号量或事件组的情况, 使用任务通知显然更灵活。 按照 FreeRTOS 官方的说法, 使用任务通知比通过信号量等 IPC 通信方式解除阻塞的任务要快 45%,并且更加省 RAM 内存空间( 使用 GCC 编译器, -o2 优化级别) , 任务通知的使用无需创建队列。 想要使用任务通知, 必须将FreeRTOSConfig.h 中的宏定义configUSE_TASK_NOTIFICATIONS 设置为 1, 其实 FreeRTOS 默认是为 1 的, 所以任务通知是默认使能的

FreeRTOS 提供以下几种方式发送通知给任务 :
● 发送通知给任务, 如果有通知未读, 不覆盖通知值。
● 发送通知给任务, 直接覆盖通知值。
● 发送通知给任务, 设置通知值的一个或者多个位, 可以当做事件组来使用。
● 发送通知给任务, 递增通知值, 可以当做计数信号量使用。
通过对以上任务通知方式的合理使用, 可以在一定场合下替代 FreeRTOS 的信号量, 队列、 事件组等。

当然, 凡是都有利弊, 不然的话 FreeRTOS 还要内核的 IPC 通信机制干嘛,消息通知虽然处理更快, RAM 开销更小, 但也有以下限制 :

⚫ 不能发送数据给 ISR:

ISR 并没有任务结构体,所以无法使用任务通知的功能给 ISR 发送数据。但是

ISR 可以使用任务通知的功能,发数据给任务。

⚫ 数据只能给该任务独享

使用队列、信号量、事件组时,数据保存在这些结构体中,其他任务、 ISR 都可以访问这些数据。使用任务通知时,数据存放入目标任务中,只有它可以访问这
些数据。

在日常工作中,这个限制影响不大。因为很多场合是从多个数据源把数据发给某个任务,而不是把一个数据源的数据发给多个任务。

⚫ 无法缓冲数据

使用队列时,假设队列深度为 N,那么它可以保持 N 个数据。

使用任务通知时,任务结构体中只有一个任务通知值,只能保持一个数据。

⚫ 无法广播给多个任务

使用事件组可以同时给多个任务发送事件。

使用任务通知,只能发个一个任务。

⚫ 如果发送受阻,发送方无法进入阻塞状态等待

假设队列已经满了,使用 xQueueSendToBack()给队列发送数据时,任务可以进入阻塞状态等待发送完成。

使用任务通知时,即使对方无法接收数据,发送方也无法阻塞等待,只能即刻返回错误

通知状态和通知值

每个任务都有一个结构体: TCB(Task Control Block),里面有 2 个成员:

 

 

 常用任务通知 API 函数

 

函数的原型


 

 

 

ulTaskNotifyTake函数的参数说明如下: 

 

 

 

 

 

 

 

 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值