你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G0学习手册——FreeRTOS任务通知

[复制链接]
STMCU小助手 发布时间:2022-10-27 18:45
概述
        每个任务都有一个32位的通知值,可以替代二值信号量,计数信号量,事件组,也可以代替长度为1的队列。

        有以下几种方式发送通知给任务:

1.有通知未读,则不覆盖通知值

2.直接覆盖通知值

3.设置通知值一个或者多个位,当做事件组来使用

4.递增/递减通知,当做信号量来使用

        有以下缺点:

1.只能有一个任务接收通知消息

2.只有等待通知的任务可以被阻塞,发送通知的任务都不会因为发送失败而进入阻塞。

代替二值信号量
在FreeRTOSConfig.h里开启任务通知

  1. /*Turn on task notifications.*/
  2. #define configUSE_TASK_NOTIFICATIONS      1
复制代码

在main.c文件里面修改代码

/* USER CODE BEGIN Includes */

#include "FreeRTOS.h"
#include "task.h"
#include <stdio.h>
#include <string.h>

/* USER CODE END Includes */

/* USER CODE BEGIN PV */
static TaskHandle_t AppTask_Handle = NULL;
static TaskHandle_t KeyTask_Handle = NULL;
static TaskHandle_t LedTask_Handle = NULL;

extern int f_printf(const char *format, ...);
/* USER CODE END PV */

/* USER CODE BEGIN PFP */
static void AppTaskCreate(void);
static void KeyTaskCreate(void);
static void LedTaskCreate(void);
/* USER CODE END PFP */

int main()
{

  /* USER CODE BEGIN WHILE */
  BaseType_t xReturn = pdFAIL;
        
        xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
                        (const char*)   "APPTASKCREATE",
                        (uint16_t)      128,
                        (void *)        NULL,
                        (UBaseType_t)   1 ,
                        (TaskHandle_t*) &AppTask_Handle);
        
  if(xReturn == pdPASS)
        {
    f_printf("AppTask Create PASS.\r\n");
                vTaskStartScheduler();
        }
                                                                                                
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/* USER CODE BEGIN 4 */
static void AppTaskCreate(void)
{
  BaseType_t xReturn = pdFAIL;

        xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,
                        (const char *)  "LEDTASKCREATE",
                        (uint16_t)      128,
                        (void *)        NULL,
  /*If the priority here is the same as the key task, printf will not print it out.        */
                        (UBaseType_t)   2,      
                        (TaskHandle_t *)&LedTask_Handle);
  if(xReturn == pdPASS)
                f_printf("LedTask Create PASS.\r\n");
        
        xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,
                        (const char *)  "KEYTASKCREATE",
                        (uint16_t)      128,
                        (void *)        NULL,
                        (UBaseType_t)   1,
                        (TaskHandle_t *)&KeyTask_Handle);
  if(xReturn == pdPASS)
        {
                f_printf("KeyTask Create PASS.\r\n");
    vTaskDelete(AppTask_Handle);
        }

}
static void KeyTaskCreate(void)
{
        while(1)
        {
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
          {
      vTaskDelay(50);
      if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
                  {
        xTaskNotifyGive(LedTask_Handle);
                          f_printf("Give LedTask_Handle PASS.\r\n");
                  }
          }
          vTaskDelay(100);
  }
}
static void LedTaskCreate(void)
{
        uint32_t ulreturn=0;
        while(1)
        {
               
    ulreturn=ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
                if(ulreturn==1)
                {
                        /*It won’t be printed out at the same level*/
                  f_printf("LedTask TAKE PASS.\r\n");
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
                        
                }
                else
                        f_printf("LedTask TAKE FAIL.\r\n");
    vTaskDelay(100);
  }
}
/* USER CODE END 4 */

代替计数信号量
在FreeRTOSConfig.h里开启任务通知

/*Turn on task notifications.*/
#define configUSE_TASK_NOTIFICATIONS      1
在main.c文件里面修改代码

/* USER CODE BEGIN Includes */

#include "FreeRTOS.h"
#include "task.h"
#include <stdio.h>
#include <string.h>

/* USER CODE END Includes */

/* USER CODE BEGIN PV */
static TaskHandle_t AppTask_Handle = NULL;
static TaskHandle_t KeyTask_Handle = NULL;
static TaskHandle_t LedTask_Handle = NULL;

extern int f_printf(const char *format, ...);

/* USER CODE END PV */

/* USER CODE BEGIN PFP */
static void AppTaskCreate(void);
static void KeyTaskCreate(void);
static void LedTaskCreate(void);
/* USER CODE END PFP */

int main()
{
  /* USER CODE BEGIN WHILE */
  BaseType_t xReturn = pdFAIL;        

  xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
                        (const char *)  "APPTASKCREATE",
                        (uint16_t)      128,
                        (void *)        NULL,
                        (UBaseType_t)   1,
                        (TaskHandle_t*) &AppTask_Handle);

  if(xReturn == pdPASS)
        {
    f_printf("AppTask Create PASS.\r\n");
    vTaskStartScheduler();
        }
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


/* USER CODE BEGIN 4 */
static void AppTaskCreate(void)
{
        BaseType_t xReturn = pdFAIL;

  xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,
                        (const char *)  "LEDTASKCREATE",
                        (uint16_t)      128,
                        (void*)         NULL,
                        (UBaseType_t)   1,
                        (TaskHandle_t *)&LedTask_Handle);
  if( xReturn == pdPASS)
          f_printf("LED Task Create PASS.\r\n");
        
        xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,
                        (const char *)  "KEYTASKCREATE",
                        (uint16_t )     128,
                        (void *)        NULL,
                        (UBaseType_t)   2,
                        (TaskHandle_t *)&KeyTask_Handle);
  if( xReturn == pdPASS)
        {
    f_printf("KEY Task Create PASS.\r\n");
    vTaskDelete(AppTask_Handle);
        }
}
static void KeyTaskCreate(void)
{
  while(1)
        {
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
                {
                        vTaskDelay(40);
      if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
                        {
                                xTaskNotifyGive(LedTask_Handle);
                                f_printf("LED TASK GIVE PASS.\r\n");
                        }
                }
    vTaskDelay(40);
        }
               
}
static void LedTaskCreate(void)
{
        uint32_t ulValue = 0 ;
        while(1)
        {
    ulValue = ulTaskNotifyTake( pdFALSE , 0);
               
                /*Greater than 0 proves that there is still a notification value that can be
         *reduced by 1. Equal to 0 indicates that no notification is available
         */
                if(ulValue >0)
                {
                        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
                        f_printf("LED Task PASS.\r\n");
                }               
                vTaskDelay(1500);
        }
}

/* USER CODE END 4 */

代替事件组
在FreeRTOSConfig.h里开启任务通知

  1. /*Turn on task notifications.*/
  2. #define configUSE_TASK_NOTIFICATIONS      1
复制代码

在main.c文件里面修改代码

  1. /* USER CODE BEGIN Includes */

  2. #include "FreeRTOS.h"
  3. #include "task.h"

  4. #include <stdio.h>
  5. #include <string.h>

  6. /* USER CODE END Includes */

  7. /* USER CODE BEGIN PV */
  8. static TaskHandle_t AppTask_Handle = NULL;
  9. static TaskHandle_t KeyTask_Handle = NULL;
  10. static TaskHandle_t LedTask_Handle = NULL;

  11. extern int f_printf(const char *format, ...);
  12. /* USER CODE END PV */

  13. /* USER CODE BEGIN PFP */

  14. static void AppTaskCreate(void);
  15. static void KeyTaskCreate(void);
  16. static void LedTaskCreate(void);

  17. /* USER CODE END PFP */

  18. int main()
  19. {
  20.   /* USER CODE BEGIN WHILE */
  21.   BaseType_t xReturn = pdFAIL;
  22.         
  23.   xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
  24.                             (const char *)  "",
  25.                                                 (uint16_t)      128,
  26.                                                 (void *)        NULL,
  27.                                                 (UBaseType_t)  1,
  28.                                                 (TaskHandle_t *)&AppTask_Handle);
  29.         if( xReturn == pdPASS)
  30.         {
  31.                 f_printf("APP Task Start.\r\n");
  32.                 vTaskStartScheduler();
  33.         }

  34.   while (1)
  35.   {
  36.     /* USER CODE END WHILE */

  37.     /* USER CODE BEGIN 3 */
  38.   }
  39.   /* USER CODE END 3 */
  40. }

  41. /* USER CODE BEGIN 4 */
  42. static void AppTaskCreate(void)
  43. {
  44.         BaseType_t xReturn = pdFAIL;
  45.         
  46.         xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,
  47.                               (const char *)  "",
  48.                                                                                                 (uint16_t)      128,
  49.                                                                                                 (void *)        NULL,
  50.                                                                                                 (UBaseType_t)   1,
  51.                                                                                                 (TaskHandle_t*) &LedTask_Handle);
  52.   if( xReturn == pdPASS)
  53.                 f_printf("LED TASK PASS.\r\n");
  54.         
  55.         xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,
  56.                               (const char *)   "",
  57.                                                                                                 (uint16_t )      128,
  58.                                                                                                 (void *)         NULL,
  59.                                                                                                 (UBaseType_t)   2,
  60.                                                                                                 (TaskHandle_t *) &KeyTask_Handle);
  61.   if( xReturn == pdPASS)
  62.         {
  63.     f_printf("KEY TASK PASS.\r\n");
  64.                 vTaskDelete(AppTask_Handle);
  65.         }                                                                                
  66. }
  67. static void KeyTaskCreate(void)
  68. {
  69.   while(1)
  70.         {
  71.     if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
  72.                 {
  73.                         vTaskDelay(40);
  74.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
  75.                         {
  76.                                 xTaskNotify(LedTask_Handle,0x00000001,eSetBits);
  77.                                 f_printf("PA0.\r\n");
  78.                         }
  79.                 }
  80.                 else if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) == 0)
  81.                 {
  82.                         vTaskDelay(40);
  83.                         if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) == 0)
  84.                         {
  85.                                 xTaskNotify(LedTask_Handle,0x00000002,eSetBits);
  86.                                 f_printf("PC12.\r\n");
  87.                         }
  88.                 }
  89.                
  90.                 vTaskDelay(50);
  91.         }
  92. }
  93. static void LedTaskCreate(void)
  94. {
  95.         uint32_t ulReturn = 0;
  96.         BaseType_t xReturn = pdFAIL;
  97.         while(1)
  98.         {
  99.                 xReturn = xTaskNotifyWait( 0 , 0x00000003 , &ulReturn, portMAX_DELAY);
  100.                
  101.                 if(xReturn == pdTRUE)
  102.                 {
  103.                         if( (ulReturn & 0x1)==1)
  104.                         {
  105.                                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
  106.                                 f_printf("LED1.\r\n");
  107.                         }
  108.                         else if( (ulReturn & 0x02)==2)
  109.                         {
  110.                                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
  111.                                 f_printf("LED2.\r\n");
  112.                         }
  113.                 }
  114.                 else
  115.                         f_printf("Read Notify FAIL.\r\n");

  116.                 vTaskDelay(1500);
  117.         }
  118. }
  119. /* USER CODE END 4 */
复制代码


代替长度为1的消息队列
在FreeRTOSConfig.h里开启任务通知

  1. /*Turn on task notifications.*/
  2. #define configUSE_TASK_NOTIFICATIONS      1
复制代码

在main.c文件里面修改代码

  1. /* USER CODE BEGIN Includes */

  2. #include "FreeRTOS.h"
  3. #include "task.h"
  4. #include <stdio.h>
  5. #include <string.h>

  6. /* USER CODE END Includes */

  7. /* USER CODE BEGIN PV */
  8. static TaskHandle_t AppTask_Handle = NULL;
  9. static TaskHandle_t KeyTask_Handle = NULL;
  10. static TaskHandle_t QueueTask_Handle = NULL;
  11. static uint32_t Message = 0;
  12. static uint32_t *printf_value=&Message;
  13. extern int f_printf(const char *format, ...);

  14. /* USER CODE END PV */

  15. /* USER CODE BEGIN PFP */
  16. static void AppTaskCreate(void);
  17. static void KeyTaskCreate(void);
  18. static void QueueTaskCreate(void);
  19. /* USER CODE END PFP */

  20. int main()
  21. {
  22.   /* USER CODE BEGIN WHILE */
  23.   BaseType_t xReturn = pdFAIL;
  24.         
  25.         xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,
  26.                               (const char *)   "",
  27.                                                   (uint16_t)       128,
  28.                                                   (void *)         NULL,
  29.                                                   (UBaseType_t)    1,
  30.                                                   (TaskHandle_t *) &AppTask_Handle);
  31.                                                                                                 
  32.   if( xReturn == pdPASS)
  33.         {
  34.     f_printf("AppTask Start.\r\n");
  35.                 vTaskStartScheduler();
  36.         }
  37.         
  38.   while (1)
  39.   {
  40.     /* USER CODE END WHILE */

  41.     /* USER CODE BEGIN 3 */
  42.   }
  43.   /* USER CODE END 3 */
  44. }

  45. /* USER CODE BEGIN 4 */
  46. static void AppTaskCreate(void)
  47. {
  48.         BaseType_t xReturn ;
  49.         
  50.         xReturn = xTaskCreate( (TaskFunction_t)QueueTaskCreate,
  51.                          (const char *)  "",
  52.                                                                                                  (uint16_t)      128,
  53.                                                                                                  (void *)        NULL,
  54.                                                                                                  (UBaseType_t)   2,
  55.                                                                                                  (TaskHandle_t *)&QueueTask_Handle);
  56.   if( xReturn ==pdPASS )
  57.                 f_printf("QueueTask Create PASS.\r\n");
  58.         
  59.         xReturn = xTaskCreate( (TaskFunction_t)KeyTaskCreate,
  60.                          (const char *)  "",
  61.                          (uint16_t)      128,
  62.                                                                                                  (void *)        NULL,
  63.                                                                                                  (UBaseType_t)   1,
  64.                                                                                                  (TaskHandle_t *)&KeyTask_Handle);
  65.   if (xReturn == pdPASS)
  66.         {
  67.           f_printf("KeyTask Create PASS.\r\n");
  68.                 vTaskDelete(AppTask_Handle);
  69.         }
  70. }
  71. static void KeyTaskCreate(void)
  72. {
  73.         while(1)
  74.         {
  75.                 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
  76.                 {
  77.                         vTaskDelay(80);
  78.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
  79.                         {
  80.                                 xTaskNotify(QueueTask_Handle, (uint32_t)Message, eSetValueWithOverwrite);
  81.                         }
  82.                 }
  83.                 vTaskDelay(80);
  84.         }
  85. }
  86. static void QueueTaskCreate(void)
  87. {
  88.         while(1)
  89.         {
  90.                 /*work.*/
  91.                 xTaskNotifyWait(0, 0xFFFFFFFF, printf_value, portMAX_DELAY);
  92.                 f_printf("Message is :%d\r\n",*printf_value);
  93.                 Message=*printf_value;
  94.                
  95.                 /*The second method works too*/
  96.         /*
  97.                 xTaskNotifyWait(0, 0xFFFFFFFF, &Message, portMAX_DELAY);
  98.                 f_printf("Message is :%d\r\n",Message);
  99.         */
  100.                 Message++;
  101.                 if(Message > 10)
  102.                         Message = 0;
  103.                 vTaskDelay(1000);
  104.         }
  105. }
  106. /* USER CODE END 4 */
复制代码


————————————————
版权声明:SCCELE

收藏 评论0 发布时间:2022-10-27 18:45

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版