stm32cubemx freertos 消息队列 求助

2019-07-20 04:00发布

本帖最后由 mmlyy2012 于 2019-1-22 11:14 编辑

使用STM32cubemx中的freertos创建程序。程序实现 一个任务向队列发送消息。另一个任务接收消息。freertos.c内容如下:
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : freertos.c
  * Description        : Code for freertos applications
  ******************************************************************************
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

typedef struct Msg
{
  uint8_t ucMessageID;
  uint16_t ulData[10];
  uint16_t usData[10];
}MSG_T;
MSG_T g_tMsg;

osThreadId LED0TASKHandle;
osThreadId LED1TASKHandle;
osMessageQId myQueue01Handle;

void TASKLED0(void const * argument);
void TASKLED1(void const * argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */

void MX_FREERTOS_Init(void) {
  osThreadDef(LED0TASK, TASKLED0, osPriorityNormal, 0, 128);   //任务一
  LED0TASKHandle = osThreadCreate(osThread(LED0TASK), NULL);

  osThreadDef(LED1TASK, TASKLED1, osPriorityNormal, 0, 128);  //任务二
  LED1TASKHandle = osThreadCreate(osThread(LED1TASK), NULL);

  osMessageQDef(myQueue01, 16, struct Msg * );                     //消息队列
  myQueue01Handle = osMessageCreate(osMessageQ(myQueue01), NULL);
}

void TASKLED0(void const * argument)    // 任务一
{
    MSG_T   *ptMsg;
    uint8_t key=1;
   
     ptMsg = &g_tMsg;
    //结构体初始化
     ptMsg->ucMessageID = 0;
     ptMsg->ulData[0] = 0;
     ptMsg->usData[0] = 0;
  /* Infinite loop */
  for(;;)
  {      
   if( xQueueSend( myQueue01Handle,
    &g_tMsg,                     
     ( portTickType ) 10 ) !=pdPASS )
     {
      printf("向xqueue发送数据失败 ");    // 如果失败,则打印         
     }
else
{
    HAL_GPIO_TogglePin( GPIOF,GPIO_PIN_10 );//如果发送成功,则结构体内 数值加一,灯闪烁
  ptMsg->ucMessageID++;
    ptMsg->ulData[0]++;;
    ptMsg->usData[0]++;  
}
  }
}

void TASKLED1(void const * argument)  //任务二
{
    MSG_T *m_Msg;
    const TickType_t xMaxBlockTime = pdMS_TO_TICKS(200);
  for(;;)
  {   
  if(xQueueReceive( myQueue01Handle,
   &m_Msg ,                     
    xMaxBlockTime  ) != pdPASS )
  {
    HAL_GPIO_TogglePin( GPIOF,GPIO_PIN_9 );//如果接收失败,则灯闪烁
  }
  else                                                             // 如果接收成功,则打印接收到的值
  {
     printf("m_Msg->ucMessageID = %d ", m_Msg->ucMessageID);
     printf("m_Msg->ulData[0] = %d ", m_Msg->ulData[0]);
     printf("m_Msg->usData[0] = %d ", m_Msg->usData[0]);   

     }
  }
  }


    ptMsg->ucMessageID;
    ptMsg->ulData[0];;
    ptMsg->usData[0];

应该由0开始接收,但是实际在串口显示的内容数据是乱的,不知道为什么。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。