STM32CubeIDE+FreeRTOS二值信號量實驗


創建工程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秒鍾出現一次,成功。

實現了不同任務間二值信號量的獲取與釋放

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM