IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32G0学习手册——FreeRTOS任务通知 -> 正文阅读

[嵌入式]STM32G0学习手册——FreeRTOS任务通知

目录

概述

代替二值信号量

?代替计数信号量

代替事件组

代替长度为1的消息队列


概述

????????每个任务都有一个32位的通知值,可以替代二值信号量,计数信号量,事件组,也可以代替长度为1的队列。

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

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

2.直接覆盖通知值

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

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

? ? ? ? 有以下缺点:

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

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

代替二值信号量

在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,
  /*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里开启任务通知

/*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 *)  "",
						(uint16_t)      128,
						(void *)        NULL,
						(UBaseType_t)  1,
						(TaskHandle_t *)&AppTask_Handle);
	if( xReturn == pdPASS)
	{
		f_printf("APP Task Start.\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 *)  "",
												(uint16_t)      128,
												(void *)        NULL,
												(UBaseType_t)   1,
												(TaskHandle_t*) &LedTask_Handle);
  if( xReturn == pdPASS)
		f_printf("LED TASK PASS.\r\n");
	
	xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,
	                      (const char *)   "",
												(uint16_t )      128,
												(void *)         NULL,
												(UBaseType_t)   2,
												(TaskHandle_t *) &KeyTask_Handle);
  if( xReturn == pdPASS)
	{
    f_printf("KEY TASK 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))
			{
				xTaskNotify(LedTask_Handle,0x00000001,eSetBits);
				f_printf("PA0.\r\n");
			}
		}
		else if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) == 0)
		{
			vTaskDelay(40);
			if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) == 0)
			{
				xTaskNotify(LedTask_Handle,0x00000002,eSetBits);
				f_printf("PC12.\r\n");
			}
		}
		
		vTaskDelay(50);
	}
}
static void LedTaskCreate(void)
{
	uint32_t ulReturn = 0;
	BaseType_t xReturn = pdFAIL;
	while(1)
	{
		xReturn = xTaskNotifyWait( 0 , 0x00000003 , &ulReturn, portMAX_DELAY);
		
		if(xReturn == pdTRUE)
		{
			if( (ulReturn & 0x1)==1)
			{
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
				f_printf("LED1.\r\n");
			}
			else if( (ulReturn & 0x02)==2)
			{
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
				f_printf("LED2.\r\n");
			}
		}
		else
			f_printf("Read Notify FAIL.\r\n");

		vTaskDelay(1500);
	}
}
/* USER CODE END 4 */

代替长度为1的消息队列

在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 QueueTask_Handle = NULL;
static uint32_t Message = 0;
static uint32_t *printf_value=&Message;
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 QueueTaskCreate(void);
/* USER CODE END PFP */

int main()
{
  /* USER CODE BEGIN WHILE */
  BaseType_t xReturn = pdFAIL;
	
	xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,
	                      (const char *)   "",
						  (uint16_t)       128,
						  (void *)         NULL,
						  (UBaseType_t)    1,
						  (TaskHandle_t *) &AppTask_Handle);
												
  if( xReturn == pdPASS)
	{
    f_printf("AppTask Start.\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 ;
	
	xReturn = xTaskCreate( (TaskFunction_t)QueueTaskCreate,
                         (const char *)  "",
												 (uint16_t)      128,
												 (void *)        NULL,
												 (UBaseType_t)   2,
												 (TaskHandle_t *)&QueueTask_Handle);
  if( xReturn ==pdPASS )
		f_printf("QueueTask Create PASS.\r\n");
	
	xReturn = xTaskCreate( (TaskFunction_t)KeyTaskCreate,
                         (const char *)  "",
                         (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(80);
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
			{
				xTaskNotify(QueueTask_Handle, (uint32_t)Message, eSetValueWithOverwrite);
			}
		}
		vTaskDelay(80);
	}
}
static void QueueTaskCreate(void)
{
	while(1)
	{
		/*work.*/
		xTaskNotifyWait(0, 0xFFFFFFFF, printf_value, portMAX_DELAY);
		f_printf("Message is :%d\r\n",*printf_value);
		Message=*printf_value;
		
		/*The second method works too*/
        /*
		xTaskNotifyWait(0, 0xFFFFFFFF, &Message, portMAX_DELAY);
		f_printf("Message is :%d\r\n",Message);
        */
		Message++;
		if(Message > 10)
			Message = 0;
		vTaskDelay(1000);
	}
}
/* USER CODE END 4 */

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:34:55  更:2021-08-10 13:35:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 2:47:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计