创建工程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秒钟出现一次,成功。
实现了不同任务间二值信号量的获取与释放