OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3826|回复: 2

stm32cubemx freertos 消息队列 求助

[复制链接]

3

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
976
金钱
976
注册时间
2012-5-8
在线时间
347 小时
发表于 2019-1-21 16:45:15 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 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发送数据失败\r\n");    // 如果失败,则打印         
     }
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\r\n", m_Msg->ucMessageID);
     printf("m_Msg->ulData[0] = %d\r\n", m_Msg->ulData[0]);
     printf("m_Msg->usData[0] = %d\r\n", m_Msg->usData[0]);   

     }
  }
  }


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

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


Queue.rar

15.69 MB, 下载次数: 315

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
976
金钱
976
注册时间
2012-5-8
在线时间
347 小时
 楼主| 发表于 2019-1-21 16:45:16 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-1-22 01:08:11 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 17:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表