創建工程RTOS_BinarySem,
配置HCLK,使用內部晶振,頻率為180MHZ(根據板子設置)

將SYS中時基源(Timebase Source)改為除SysTick之外的任意定時器即可,如:

配置FreeRTOS,使用CMSIS_V1,先定義兩個任務,一個是myTask_Wait,負責等待二值信號量,獲取成功后打印輸出提示信息。另一個是myTask_Release,負責釋放二值信號量,每隔2秒釋放一次。

在添加一個二值信號量,如圖:

Ctrl + S生成代碼
修改代碼,
1,在main.h中添加
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "stdio.h" /* USER CODE END Includes */
2,在mian.c中添加
/* 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 = 1; /* Infinite loop */ for(;;) { printf("DefaultTask----time %d\n",timeCount++); osDelay(1000); } /* USER CODE END 5 */ }
/* USER CODE BEGIN Header_StartTaskWait */ /** * @brief Function implementing the myTask_Wait thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTaskWait */ void StartTaskWait(void const * argument) { /* USER CODE BEGIN StartTaskWait */ /* Infinite loop */ for(;;) { osSemaphoreWait(myBinarySem01Handle, osWaitForever); printf("I get BinarySemaphore.\n"); } /* USER CODE END StartTaskWait */ }
/* USER CODE BEGIN Header_StartTaskRelease */ /** * @brief Function implementing the myTask_Release thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTaskRelease */ void StartTaskRelease(void const * argument) { /* USER CODE BEGIN StartTaskRelease */ /* Infinite loop */ for(;;) { osDelay(2000); osSemaphoreRelease(myBinarySem01Handle); } /* USER CODE END StartTaskRelease */ }
修改完畢后點擊 小錘子 構建工程,然后點擊Debug,按如下步驟配置ITM調試



全速運行之前一定要先點擊SWV ITM data Console 頁面中的紅色圓圈

現象:

分析
DefaultTask 負責每秒輸出一個當前的時間信息,表示此時時間為第幾秒。
TaskWait負責等待二值信號量,如果獲取不到,就一直等待,如果和獲取成功,輸出提示信息。
TaskRelease等待2秒釋放二值信號量。
可以看到,I get BinarySemaphore.提示信息2秒鍾出現一次,成功。
實現了不同任務間二值信號量的獲取與釋放
