本帖最后由 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开始接收,但是实际在串口显示的内容数据是乱的,不知道为什么。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>