新建工程RTOS_Message,配置如下:


Ctrl + S生成代码
修改代码,
1,在main.h中添加
//添加include /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "stdio.h" /* USER CODE END Includes */
2,在main.c中添加
//添加_write函数重定义
/* USER CODE BEGIN PFP */
int _write(int file , char *ptr,int len)
{
int i = 0;
for(i = 0;i<len;i++)
ITM_SendChar((*ptr++));
return len;
}
/* USER CODE END PFP */
3,在main.c中修改3个任务入口函数的内容
/* 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 5 */
int timeCount = 0;
/* Infinite loop */
for(;;)
{
printf("DefaultTask----time %d\n",timeCount++);
osDelay(1000);
}
/* USER CODE END 5 */
}
/* USER CODE BEGIN Header_StartSendTask */
/**
* @brief Function implementing the sendTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartSendTask */
void StartSendTask(void const * argument)
{
/* USER CODE BEGIN StartSendTask */
/* Infinite loop */
for(;;)
{
osDelay(2000);//等待2秒
osMessagePut(myQueue01Handle, 1, 0);//发送消息1
osDelay(3000);//等待3秒
osMessagePut(myQueue01Handle, 2, 0);//发送消息2
}
/* USER CODE END StartSendTask */
}
/* USER CODE BEGIN Header_StartReceiveTask */
/**
* @brief Function implementing the receiveTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartReceiveTask */
void StartReceiveTask(void const * argument)
{
/* USER CODE BEGIN StartReceiveTask */
osEvent theEvent;//声明一个事件
/* Infinite loop */
for(;;)
{
//获取消息,如果没有消息就一直等待
theEvent = osMessageGet(myQueue01Handle, osWaitForever);
if(theEvent.status == osEventMessage)
{
printf("Receive message %ld\n",theEvent.value.v);
}
}
/* USER CODE END StartReceiveTask */
}
修改完毕后点击 小锤子 构建工程,然后点击Debug,按如下步骤配置ITM调试



全速运行之前一定要先点击SWV ITM data Console 页面中的红色圆圈

现象:

分析:
DefaultTask 负责每秒输出一个当前的时间信息,表示此时时间为第几秒。
SendTask先等待2秒发送消息1,再等待3秒发送消息2。
ReceiveTask为获取消息队列内容,如果获取成功,将获取的信息打印出来。
看输出信息,当第3秒时,ReceiveTask接收到消息1,第5秒时,ReceiveTask接收到消息2.
实现了任务间通过消息队列进行通信。
来源:https://www.cnblogs.com/tianxxl/p/12018190.html