新建工程RTOS_Task,配置如下:
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_StartTask02 */ /** * @brief Function implementing the myTask02 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask02 */ void StartTask02(void const * argument) { /* USER CODE BEGIN StartTask02 */ int times = 0; /* Infinite loop */ for(;;) { printf("Task02----times %d\n",times++); osDelay(1000); } /* USER CODE END StartTask02 */ }
/* USER CODE BEGIN Header_StartTask03 */ /** * @brief Function implementing the myTask03 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask03 */ void StartTask03(void const * argument) { /* USER CODE BEGIN StartTask03 */ /* Infinite loop */ for(;;) { osDelay(3000);//等待3秒 osThreadSuspend(myTask02Handle);//掛起線程Task02 osDelay(3000);//等待3秒 osThreadResume(myTask02Handle);//恢復線程Task02 } /* USER CODE END StartTask03 */ }
修改完畢后點擊 小錘子 構建工程,然后點擊Debug,按如下步驟配置ITM調試
全速運行之前一定要先點擊SWV ITM data Console 頁面中的紅色圓圈
現象:
分析:
DefaultTask 負責每秒輸出一個當前的時間信息,表示此時時間為第幾秒
Task02每秒輸出一次,表示此次為第幾次輸出。
Task03等待3秒掛起Task02,在等待3秒回復Task02.
程序剛運行時,DefaultTask 和 Task02同頻率輸出,3秒鍾之后DefaultTask繼續輸出,而Task02不再輸出。
再等待3秒,Task03將Task02 恢復,Task02 繼續輸出,如此循環。
此次實現了任務的掛起與恢復。