stm32 freertos 任务通知

FreeRTOS 从 V8.2.0 版本开始提供任务通知这个功能,每个任务都有一个 32 位的通知值,在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件组,也可以替代长度为 1的队列(可以保存一个 32 位整数或指针值)。

代替消息队列

/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "limits.h"
​
void sent (){
    uint32_t send2 = 2;
    while(1)
    {
      /* 原型:BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, 
                                      uint32_t ulValue, 
                                      eNotifyAction eAction ); 
       * eNoAction = 0,通知任务而不更新其通知值。
       * eSetBits,     设置任务通知值中的位。
       * eIncrement,   增加任务的通知值。
       * eSetvaluewithoverwrite,覆盖当前通知
       * eSetValueWithoutoverwrite 不覆盖当前通知
       * 
       * pdFAIL:当参数eAction设置为eSetValueWithoutOverwrite的时候,
       * 如果任务通知值没有更新成功就返回pdFAIL。
       * pdPASS: eAction 设置为其他选项的时候统一返回pdPASS。
      */
         xTaskNotify(app_handle,send2,eSetValueWithOverwrite );
    }
}
void rec(){
    int rec = 0;
    while(1)
    {
    /* BaseType_t xTaskNotifyWait(uint32_t ulBitsToClearOnEntry, 
                                  uint32_t ulBitsToClearOnExit, 
                                  uint32_t *pulNotificationValue, 
                                  TickType_t xTicksToWait ); 
     * ulBitsToClearOnEntry:当没有接收到任务通知的时候将任务通知值与此参数的取
       反值进行按位与运算,当此参数为Oxfffff或者ULONG_MAX的时候就会将任务通知值清零。
     * ulBits ToClearOnExit:如果接收到了任务通知,在做完相应的处理退出函数之前将
       任务通知值与此参数的取反值进行按位与运算,当此参数为0xfffff或者ULONG MAX的时候
       就会将任务通知值清零。
     * pulNotification Value:此参数用来保存任务通知值。
     * xTick ToWait:阻塞时间。
     *
     * 返回值:pdTRUE:获取到了任务通知。pdFALSE:任务通知获取失败。
     */
    //获取任务通知 ,没获取到则一直等待
       xTaskNotifyWait(0x00,ULONG_MAX,&rec,portMAX_DELAY);
    }
}

代替二值信号量

/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "limits.h"

void sent (){
    uint32_t send2 = 2;
    while(1)
    {
              /* 原型:BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); */
			/* 释放一个任务通知 */
         xTaskNotifyGive(app_handle);
    }
}
void rec(){
    int rec = 0;
    while(1)
    {
       /* uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ); 
       * xClearCountOnExit:pdTRUE 在退出函数的时候任务任务通知值清零,类似二值信号量
       * 				: pdFALSE 在退出函数ulTaskNotifyTakeO的时候任务通知值减一,类似计数型信号量。
       */
       ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
    }
}

代替计数信号

/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "limits.h"

void sent (){
    uint32_t send2 = 2;
    while(1)
    {
              /* 原型:BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); */
			/* 释放一个任务通知 */
         xTaskNotifyGive(app_handle);
    }
}
void rec(){
    int rec = 0;
    while(1)
    {
       /* uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ); 
       * xClearCountOnExit:pdTRUE 在退出函数的时候任务任务通知值清零,类似二值信号量
       * 				: pdFALSE 在退出函数ulTaskNotifyTakeO的时候任务通知值减一,类似计数型信号量。
       */
       take_num=ulTaskNotifyTake(pdFALSE,0);
      if(take_num > 0){
          
      }
    }
}

代替事件

/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "limits.h"

#define KEY1_EVENT  (0x01 << 0)//设置事件掩码的位0
#define KEY2_EVENT  (0x01 << 1)//设置事件掩码的位1
void sent (){
    uint32_t send2 = 2;
    while(1)
    {
      /* 原型:BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, 
                                      uint32_t ulValue, 
                                      eNotifyAction eAction ); 
       * eNoAction = 0,通知任务而不更新其通知值。
       * eSetBits,     设置任务通知值中的位。
       * eIncrement,   增加任务的通知值。
       * eSetvaluewithoverwrite,覆盖当前通知
       * eSetValueWithoutoverwrite 不覆盖当前通知
       * 
       * pdFAIL:当参数eAction设置为eSetValueWithoutOverwrite的时候,
       * 如果任务通知值没有更新成功就返回pdFAIL。
       * pdPASS: eAction 设置为其他选项的时候统一返回pdPASS。
      */
			/* 触发一个事件1 */
         xTaskNotify((app_handle,KEY1_EVENT,eSetBits);
    }
}
void rec(){
    int rec = 0;
    while(1)
    {
    /* BaseType_t xTaskNotifyWait(uint32_t ulBitsToClearOnEntry, 
                                  uint32_t ulBitsToClearOnExit, 
                                  uint32_t *pulNotificationValue, 
                                  TickType_t xTicksToWait ); 
     * ulBitsToClearOnEntry:当没有接收到任务通知的时候将任务通知值与此参数的取
       反值进行按位与运算,当此参数为Oxfffff或者ULONG_MAX的时候就会将任务通知值清零。
     * ulBits ToClearOnExit:如果接收到了任务通知,在做完相应的处理退出函数之前将
       任务通知值与此参数的取反值进行按位与运算,当此参数为0xfffff或者ULONG MAX的时候
       就会将任务通知值清零。
     * pulNotification Value:此参数用来保存任务通知值。
     * xTick ToWait:阻塞时间。
     *
     * 返回值:pdTRUE:获取到了任务通知。pdFALSE:任务通知获取失败。
     */
    //获取任务通知 ,没获取到则一直等待
       xTaskNotifyWait(0x00,ULONG_MAX,&rec,portMAX_DELAY);
    }
}

 

上一篇:LeetCode做题实时rec


下一篇:scala读入txt文件,执行groupby后插入hbase