新建工程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,intlen) { int i = 0; for(i = 0;i<len;i++) ITM_SendChar((*ptr++)); returnlen; } /*USER CODE END PFP */... ... ... /*USER CODE BEGIN 2 */printf("starting... "); /*USER CODE END 2 */
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 ",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 ",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.
实现了任务间通过消息队列进行通信。