STM32CUBEMX配置freertos发送结构体数据

STM32CUBEMX配置freertos发送结构体数据

1、环境

软件:STM32CUBEMX
硬件:STM32F103C8T6

2、基本配置

主要配置2个线程,一个发送结构体数据,一个解析:
STM32CUBEMX配置freertos发送结构体数据_第1张图片
注意:itemsize要uint32_t。因为结构体传输实际传输的是他的指针。

3、配置代码

首先定义一个结构体数据类型
STM32CUBEMX配置freertos发送结构体数据_第2张图片

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
typedef struct
{
	uint16_t cnt;
	uint32_t time;
}ledTypeDef;
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/

再配置发送线程代码:
STM32CUBEMX配置freertos发送结构体数据_第3张图片

/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */

	ledTypeDef led_T;
	led_T.cnt = 2;
	led_T.time = 100;
  for(;;)
  {
    osDelay(500);

	  osMessagePut(ledQueueHandle,(uint32_t)&led_T,10);
	  
  }
  /* USER CODE END StartDefaultTask */
}

/* USER CODE BEGIN Header_StartLedTask */

最后配置解析代码
STM32CUBEMX配置freertos发送结构体数据_第4张图片

void StartLedTask(void const * argument)
{
  /* USER CODE BEGIN StartLedTask */
  /* Infinite loop */
	uint16_t cnt;
	osEvent evt;
	ledTypeDef *pLed;
  for(;;)
  {
    osDelay(1);
	  evt = osMessageGet(ledQueueHandle,osWaitForever);
	  if(evt.status == osEventMessage)
	  {
		  pLed = (ledTypeDef *)(evt.value.p);/*将空指针转换为LED结构体指针*/
		  for(cnt=0;cnt<pLed->cnt;cnt++)
		  {
			  HAL_GPIO_TogglePin(LED_SYS_GPIO_Port,LED_SYS_Pin);
			  osDelay(pLed->time);
		  }
	  }
  }
  /* USER CODE END StartLedTask */
}

收工。

4要点:

1、freertos的队列要选用uint32_t格式,因为实际传输的是结构体的指针。
2、解析时,将指针要转换为结构体格式。

你可能感兴趣的:(杂症,stm32,单片机,嵌入式硬件)