新建工程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 */ ... ... ... /* USER CODE BEGIN 2 */ printf("starting...\n"); /* 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\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.
實現了任務間通過消息隊列進行通信。
