stm32 freeRTOS 消息队列实验 (HAL版)
消息队列实验是在 FreeRTOS 中创建了两个任务,一个是发送消息任务,一个是获取消息任务,两个任务独立运行,发送消息任务是通过检测按键的按下情况来发送消息,假如发送消息不成功,就把返回的错误情代码在串口打印出来,另一个任务是获取消息任务,在消息队列没有消息之前一直等待消息,一旦获取到消息就把消息打印在串口调试助手里。
实验过程:
首先配置HAL
首先创建一个发送消息的任务
然后还有创建一个接收消息的任务
同时还需要创建一个消息队列用来存放消息。
注:需要自己配置GPIO和USART,同时最好重定向printf。
**
主要需要调用的API
**
出队:
**
入队:
注:需要加入头文件#include “queue.h”
freertos.c 代码:
**
/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : freertos.c
* Description : Code for freertos applications
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2022 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
* SLA0044, the "License"; You may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* www.st.com/SLA0044
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usart.h"
#include "queue.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.priority = (osPriority_t) osPriorityNormal,
.stack_size = 128 * 4
};
/* Definitions for myTask_Send */
osThreadId_t myTask_SendHandle;
const osThreadAttr_t myTask_Send_attributes = {
.name = "myTask_Send",
.priority = (osPriority_t) osPriorityNormal,
.stack_size = 128 * 4
};
/* Definitions for myTask_Receive */
osThreadId_t myTask_ReceiveHandle;
const osThreadAttr_t myTask_Receive_attributes = {
.name = "myTask_Receive",
.priority = (osPriority_t) osPriorityNormal1,
.stack_size = 128 * 4
};
/* Definitions for myQueue_Test */
osMessageQueueId_t myQueue_TestHandle;
const osMessageQueueAttr_t myQueue_Test_attributes = {
.name = "myQueue_Test"
};
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
/* USER CODE END FunctionPrototypes */
void StartDefaultTask(void *argument);
void StartTask_Send(void *argument);
void StartTask_Receive(void *argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
/**
* @brief FreeRTOS initialization
* @param None
* @retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* Create the queue(s) */
/* creation of myQueue_Test */
myQueue_TestHandle = osMessageQueueNew (16, sizeof(uint16_t), &myQueue_Test_attributes);
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* Create the thread(s) */
/* creation of defaultTask */
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* creation of myTask_Send */
myTask_SendHandle = osThreadNew(StartTask_Send, NULL, &myTask_Send_attributes);
/* creation of myTask_Receive */
myTask_ReceiveHandle = osThreadNew(StartTask_Receive, NULL, &myTask_Receive_attributes);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
}
/* USER CODE BEGIN Header_StartDefaultTask */
/**
* @brief Function implementing the defaultTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
osDelay(1);
}
/* USER CODE END StartDefaultTask */
}
/* USER CODE BEGIN Header_StartTask_Send */
/**
* @brief Function implementing the myTask_Send thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask_Send */
void StartTask_Send(void *argument)
{
/* USER CODE BEGIN StartTask_Send */
uint16_t key1=1;
uint16_t key2=2;
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
{
printf("按键1按下\r\n");
xQueueSend(myQueue_TestHandle,&key1,0);
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1);
}
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
printf("按键2按下\r\n");
xQueueSend(myQueue_TestHandle,&key2,0);
while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==1);
}
osDelay(1);
}
/* USER CODE END StartTask_Send */
}
/* USER CODE BEGIN Header_StartTask_Receive */
/**
* @brief Function implementing the myTask_Receive thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask_Receive */
void StartTask_Receive(void *argument)
{
/* USER CODE BEGIN StartTask_Receive */
uint16_t temp;
BaseType_t xReturn;
/* Infinite loop */
for(;;)
{
xReturn=xQueueReceive(myQueue_TestHandle,&temp,portMAX_DELAY);
if(xReturn==pdTRUE)
{
printf("%d\r\n",temp);
}
else
{
printf("error");
}
osDelay(1);
}
/* USER CODE END StartTask_Receive */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
/* USER CODE END Application */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
关键代码部分:
void StartTask_Send(void *argument)
{
/* USER CODE BEGIN StartTask_Send */
uint16_t key1=1;
uint16_t key2=2;
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
{
printf("按键1按下\r\n");
xQueueSend(myQueue_TestHandle,&key1,0);
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1);
}
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
printf("按键2按下\r\n");
xQueueSend(myQueue_TestHandle,&key2,0);
while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==1);
}
osDelay(1);
}
/* USER CODE END StartTask_Send */
}
/* USER CODE BEGIN Header_StartTask_Receive */
/**
* @brief Function implementing the myTask_Receive thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask_Receive */
void StartTask_Receive(void *argument)
{
/* USER CODE BEGIN StartTask_Receive */
uint16_t temp;
BaseType_t xReturn;
/* Infinite loop */
for(;;)
{
xReturn=xQueueReceive(myQueue_TestHandle,&temp,portMAX_DELAY);
if(xReturn==pdTRUE)
{
printf("%d\r\n",temp);
}
else
{
printf("error");
}
osDelay(1);
}
/* USER CODE END StartTask_Receive */
}