FreeRTOS学习笔记(10)---- 任务通知

任务通知在 FreeRTOS 中是一个可选的功能,要使用任务通知的话就需要将宏configUSE_TASK_NOTIFICATIONS 定义为 1。FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue就是这个通知值。任务通知是一个事件,假如某个任务通知的接收任务因为等待任务通知而阻
塞的话,向这个接收任务发送任务通知以后就会解除这个任务的阻塞状态。
也可以更新接收任务的任务通知值,任务通知可以通过如下方法更新接收任务的通知值:
● 不覆盖接收任务的通知值(如果上次发送给接收任务的通知还没被处理)。
● 覆盖接收任务的通知值。
● 更新接收任务通知值的一个或多个 bit。
● 增加接收任务的通知值。
灵活、合理的使用这些更改任务通知值的方法在一些场合可以替代队列、二值信号量,计数信号量和事件标志组

API函数
发送任务通知:
在这里插入图片描述
获取任务通知:
在这里插入图片描述
xTaskNotify函数原型

BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, 
						uint32_t ulValue, 
						eNotifyAction eAction );

xTaskNotifyFromISR函数原型

BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, 
							   uint32_t ulValue, 
							   eNotifyAction eAction,
							   BaseType_t *pxHigherPriorityTaskWoken );

参数eAction指定通知更新的方法,有如下方法

typedef enum
{
	eNoAction = 0,				/* Notify the task without updating its notify value. */
	eSetBits,					/* Set bits in the task's notification value. */
	eIncrement,					/* Increment the task's notification value. */
	eSetValueWithOverwrite,		/* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */
	eSetValueWithoutOverwrite	/* Set the task's notification value if the previous value has been read by the task. */
} eNotifyAction;

利用任务通知模拟二值信号量、计数型信号量
发送使用vTaskNotifyGivevTaskNotifyGiveFromISR
接收使用ulTaskNotifyTake
ulTaskNotifyTake函数原型:

uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );

当参数xClearCountOnExitpdFALSE时在退出函数前任务通知值会减1,可以用来模拟计数型信号量;
当参数xClearCountOnExitpdTRUE时在退出函数前任务通知值会清零,可以用来模拟二值信号量;

利用任务通知模拟队列、事件
发送使用xTaskNotifyxTaskNotifyFromISR
接收使用xTaskNotifyWait

xTaskNotifyWait函数原型

BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, 
							uint32_t ulBitsToClearOnExit, 
							uint32_t *pulNotificationValue, 
							TickType_t xTicksToWait )

xTaskNotifyWait函数将获取到的任务通知值保存在pulNotificationValue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值