创建工程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 */

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秒钟出现一次,成功。

实现了不同任务间二值信号量的获取与释放

12-23 18:13