FreeRTOS学习:12.直达任务通知

一、基本介绍

        任务通知,是利用任务控制块(TCB)中的结构体成员变量ulNotifiedValue进行任务通知。相对于队列、信号量和事件标志组这几种通信方式,任务通知不需要创建一个结构体,直接就可以进行任务间的通信。

        任务通知值的更新方式主要分为四种:1.不覆盖接受任务的通知值;2覆盖接受任务的通知值;3.更新接受任务通知值的一个或多个bit;4.增加接受任务的通知值。、

        任务通知既有其优势也存在劣势,

优势:

        1.效率更高,可以在任务间直接通信。

        2.内存消耗更小,在创建任务时就创建了任务通知值,不需要额外内存空间。

劣势:

        1.无法在中断和任务间通信,因为中断没有TCB。

        2.无法进行广播,任务通知只能单对单通信。

        3.无法缓存多个数据(其实也可以,不过FreeRTOS源码对用户进行了屏蔽)。

        4.发送时不能进入阻塞态,但接收可以。

任务通知的结构体变量如下所示:

typedef struct tskTaskControlBlock
{
... ...
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
    volatile uint32_t ulNotifiedValue [ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
    volatile uint8_t ucNotifyState [ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
#endif
... ...
} tskTCB;
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 /* 定义任务通知数组的大小 ,

一个uint32_t类型,用来标表示通知值,另一个是uint8_t类型,表示当前通知状态

通知状态主要有三种:

#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) /* 任务未等待通知 */
#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) /* 任务在等待通知 */
#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) /* 任务在等待接收*/

第一个是默认的初始化状态;第二个表示接收方准备就绪,等待发送方发送;第三个表示发送方已经发送,等待接收方接收

二、函数介绍

任务通知函数主要分为两类:1.发送通知;2.接收通知。

详细函数说明请参考官网:RTOS 任务通知 - FreeRTOS™

1.发送通知相关函数

xTaskNotify()和xTaskNotifyAndQuery()多用于模拟队列和事件标志组。xTaskNotifyGive()多用于模拟信号量(二值和计数)。

2.接收通知相关函数

对应的,ulTaskNotifyTake()用于接收模拟信号量。

三、问题和总结

暂无~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值