freertos.c源码如下:
/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : freertos.c
* Description : Code for freertos applications
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2021 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 <stdio.h>
#include <string.h>
#include "usart.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define QUEUE_SIZE (uint32_t) 4
#define USART3_DATA_SIZE 20
typedef struct {
uint16_t DataLength;
uint8_t RxBuffer[USART3_DATA_SIZE];
} Queue_TypeDef;
static Queue_TypeDef Usart3;
osMessageQId myQueue02Handle;
//osMessageQDef(MSG, 1, uint16_t);//发送整形数值
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
uint8_t TASK1_FLAG,TASK2_FLAG,TASK3_FLAG;
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
/* USER CODE END Variables */
osThreadId defaultTaskHandle;
osThreadId myTask02Handle;
osThreadId myTask03Handle;
osMessageQId myQueue01Handle;
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
QueueHandle_t xQueue;
/* USER CODE END FunctionPrototypes */
void StartDefaultTask(void const * argument);
void StartTask02(void const * argument);
void StartTask03(void const * argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
/* GetIdleTaskMemory prototype (linked to static allocation support) */
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );
/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */
static StaticTask_t xIdleTaskTCBBuffer;
static StackType_t xIdleStack[configMINIMAL_STACK_SIZE];
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
{
*ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer;
*ppxIdleTaskStackBuffer = &xIdleStack[0];
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
/* place for user code */
}
/* USER CODE END GET_IDLE_TASK_MEMORY */
/**
* @brief FreeRTOS initialization
* @param None
* @retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
printf("FreeRTOS Queue\n");
printf("KEY Send\n");
printf("Receive uart\n\n");
/* 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) */
/* definition and creation of myQueue01 */
/* USER CODE BEGIN RTOS_QUEUES */
osMessageQDef(myQueue02, QUEUE_SIZE, Queue_TypeDef);
myQueue02Handle = osMessageCreate(osMessageQ(myQueue02), NULL);
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* Create the thread(s) */
/* definition and creation of defaultTask */
osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
/* definition and creation of myTask02 */
osThreadDef(myTask02, StartTask02, osPriorityLow, 0, 128);
myTask02Handle = osThreadCreate(osThread(myTask02), NULL);
/* definition and creation of myTask03 */
osThreadDef(myTask03, StartTask03, osPriorityLow, 0, 128);
myTask03Handle = osThreadCreate(osThread(myTask03), NULL);
/* 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 const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
//uint16_t ProducerValue = 0;
for (;;)
{
if (TASK1_FLAG)
{
TASK1_FLAG=0;
}
else
{
TASK1_FLAG=1;
}
if (HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin) == 0)
{
portBASE_TYPE xStatus;
Queue_TypeDef Tx_Queue;
for (uint8_t j=0;j<10;j++)
{
Usart3.RxBuffer[j]='0'+j;
}
Tx_Queue.DataLength =10;
memcpy(Tx_Queue.RxBuffer, Usart3.RxBuffer, sizeof(Usart3.RxBuffer));
memset(Usart3.RxBuffer, 0x00, sizeof(Usart3.RxBuffer));
xStatus = xQueueSendToBack( myQueue02Handle, &Tx_Queue, 10 );
osThreadSuspendAll();
if (xStatus != pdPASS)
{
printf("Could not send to the queue.\r\n");
}
else
{
printf("send ok\r\n");
}
osThreadResumeAll();
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin,GPIO_PIN_RESET);
}
while (HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin) == 0)
{
osDelay(10);
}
osDelay(1);
}
/* USER CODE END StartDefaultTask */
}
/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
// osEvent event;
for (;;)
{
if (TASK2_FLAG)
{
TASK2_FLAG=0;
}
else
{
TASK2_FLAG=1;
}
Queue_TypeDef Rx_Queue;
portBASE_TYPE xStatus;
xStatus = xQueueReceive( myQueue02Handle, &Rx_Queue, osWaitForever );
if (xStatus == pdPASS)
{
if (Rx_Queue.DataLength == 10)
{
printf("From Sender 1 = %d\r\n",Rx_Queue.DataLength);
}
else
{
printf("From Sender 2 = %d\r\n",Rx_Queue.DataLength);
}
for (uint8_t i=0;i<10;i++)
{
printf("%x\r\n",Rx_Queue.RxBuffer[i]);
}
memset(Rx_Queue.RxBuffer, 0x00, sizeof(Rx_Queue.RxBuffer));
}
else
{
printf( "Could not receive from the queue.\r\n" );
}
osDelay(1);
}
/* USER CODE END StartTask02 */
}
/* USER CODE BEGIN Header_StartTask03 */
/**
* @brief Function implementing the myTask03 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)
{
/* USER CODE BEGIN StartTask03 */
/* Infinite loop */
osEvent event;
for (;;)
{
if (TASK3_FLAG)
{
TASK3_FLAG=0;
}
else
{
TASK3_FLAG=1;
}
osDelay(1);
}
/* USER CODE END StartTask03 */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
/* USER CODE END Application */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
- 创建队列时需要按结构体类型的数据进行创建。
#define QUEUE_SIZE (uint32_t) 4
#define USART3_DATA_SIZE 20
typedef struct {
uint16_t DataLength;
uint8_t RxBuffer[USART3_DATA_SIZE];
} Queue_TypeDef;
static Queue_TypeDef Usart3;
osMessageQDef(myQueue02, QUEUE_SIZE, Queue_TypeDef);
myQueue02Handle = osMessageCreate(osMessageQ(myQueue02), NULL);
- 发送队列消息
Queue_TypeDef Tx_Queue;
xStatus = xQueueSendToBack( myQueue02Handle, &Tx_Queue, 10 );
- 接收消息队列数据
Queue_TypeDef Rx_Queue;
portBASE_TYPE xStatus;
xStatus = xQueueReceive( myQueue02Handle, &Rx_Queue, osWaitForever );