
概述 每个任务都有一个32位的通知值,可以替代二值信号量,计数信号量,事件组,也可以代替长度为1的队列。 有以下几种方式发送通知给任务: 1.有通知未读,则不覆盖通知值 2.直接覆盖通知值 3.设置通知值一个或者多个位,当做事件组来使用 4.递增/递减通知,当做信号量来使用 有以下缺点: 1.只能有一个任务接收通知消息 2.只有等待通知的任务可以被阻塞,发送通知的任务都不会因为发送失败而进入阻塞。 代替二值信号量 在FreeRTOSConfig.h里开启任务通知
在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里开启任务通知
在main.c文件里面修改代码
代替长度为1的消息队列 在FreeRTOSConfig.h里开启任务通知
在main.c文件里面修改代码
———————————————— 版权声明:SCCELE |