在前面的学习中例如信号量、队列中经常会出现提示:在许多情况下,“任务通知”可以提供二进制信号量的轻量级替代方案。
那么本期内容着重于介绍什么是任务通知以及如何使用。
首先我们去FreeRTOS的官网,阅读开发者文档中关于“任务通知”的介绍。
我们可以了解到,任务通知是由一条(或多条)任务"通知状态"以及一个通知值 组成。
任务通知是直接发送给任务的,传递通知值以及改变通知状态。任务通知如同任务一样也可以进入阻塞状态进行等待。
灵活的运用任务通知可以快捷的替代信号量、队列以及事件组等任务间的通讯。
使用任务通知
FreeRTOS中有好几个发送任务通知的函数,我们一一介绍他们的用处以及区别。
首先是xTaskNotify和xTaskNotifyIndexed,它们分别用来发送任务通知和像任务通知数组发送通知(自V10.4.0一条任务可以有多条任务通知)
参数作用如上,xTaskToNotify是需要通知的任务句柄,uxIndexToNotify在xTaskNotify是没有的,用在任务通知数组中的,ulValue则是我们需要传递的32位通知值,最后eAction是用来确定我们传递通知值的方式。
除了上述的指定*eAction * 以外还有一些发送任务通知的函数。
例如xTaskNotifyGive,可以用来替代二进制信号量使用,也等效于eAction设置为eIncrement,通知值自增1。
任务通知函数还有好几个函数,在此不一一介绍,感兴趣的观众可以去FreeRTOS的官网查看文档手册。·
下面我们来看一下等待任务通知的函数。
测试代码
测试代码非常简单,我们定义一个轮询按钮按下的函数,如果按钮按下,我们就用任务通知向我们的任务函数发送一个通知值。任务函数则一直等待任务值,如果收到通知,就打印通知值。、
void Mid_Task(void * pvParameters)//发送任务通知函数
{
int i = 0;
while(1)
{
if(KEY_Scan(0)==1)
{
printf("Key_Pressrn");
xTaskNotify( (TaskHandle_t) High_Handler,//任务函数的句柄
(uint32_t) i,//通知值
(eNotifyAction) eSetValueWithOverwrite );//用覆盖的方式传递
i++;
}
}
vTaskDelay(10);
}
void High_Task(void * pvParameters)//接收任务通知函数
{
uint32_t NotifyNumber;//存放任务通知值
BaseType_t err;
while(1)
{
err = xTaskNotifyWait( (uint32_t) 0,//不清除位
(uint32_t) 0,//不清除位
(uint32_t * ) &NotifyNumber,
(TickType_t) 10 );//等待10
if(err == pdTRUE)
{
printf("Recieve Notify is : %drn",NotifyNumber);
}
vTaskDelay(10);
}
}
-
二进制
+关注
关注
2文章
705浏览量
41250 -
代码
+关注
关注
30文章
4555浏览量
66772 -
FreeRTOS
+关注
关注
12文章
473浏览量
61347 -
数组
+关注
关注
1文章
409浏览量
25595 -
信号量
+关注
关注
0文章
53浏览量
8257
发布评论请先 登录
相关推荐
评论