在前面的学习中例如信号量、队列中经常会出现提示:在许多情况下,“任务通知”可以提供二进制信号量的轻量级替代方案。

那么本期内容着重于介绍什么是任务通知以及如何使用。

首先我们去FreeRTOS的官网,阅读开发者文档中关于“任务通知”的介绍。

我们可以了解到,任务通知是由一条(或多条)任务"通知状态"以及一个通知值 组成。

任务通知是直接发送给任务的,传递通知值以及改变通知状态。任务通知如同任务一样也可以进入阻塞状态进行等待。

灵活的运用任务通知可以快捷的替代信号量、队列以及事件组等任务间的通讯。

使用任务通知

FreeRTOS中有好几个发送任务通知的函数,我们一一介绍他们的用处以及区别。

首先是xTaskNotify和xTaskNotifyIndexed,它们分别用来发送任务通知和像任务通知数组发送通知(自V10.4.0一条任务可以有多条任务通知) xTaskToNotify是需要通知的任务句柄,uxIndexToNotify在 xTaskNoti fy是没有的,用在任务通知数组中的,ulValue则是我们需要传递的32位通知值,最后eAction是用来确定我们传递通知值的方式。

例如xTaskNotifyGive,可以用来替代二进制信号量使用,也等效于eAction设置为 eIncre ment,通知值自增1。

下面我们来看一下等待任务通知的函数。

测试代码

测试代码非常简单,我们定义一个轮询按钮按下的函数,如果按钮按下,我们就用任务通知向我们的任务函数发送一个通知值。任务函数则一直等待任务值,如果收到通知,就打印通知值。、


void Mid_Task(void * pvParameters)//发送任务通知函数
{
  int i = 0; 
  while(1)
  {
    if(KEY_Scan(0)==1)
    {
      printf("Key_Press\r\n");
      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 : %d\r\n",NotifyNumber);
    }
    vTaskDelay(10);
  }
}

效果展示

嘉立创PCB

还没有评论,抢个沙发!