1、简介
计数信号量相比二值信号量,能够对更多的临界资源进行管理。可以认为二值信号量是计数信号量的一个特例,当计数信号量不为0时,表示可以对临界资源进行访问
2、CubeMX配置
配置最大访问临界资源数量为6,初始值为6
3、测试程序编写
任务1持续获取计数信号量
void StartDefaultTask(void *argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ for(;;) { printf("DefaultTask Runing\n");//获取计数信号量 BaseType_t result = osSemaphoreAcquire(CountingSemHandle, pdMS_TO_TICKS(100)); osDelay(pdMS_TO_TICKS(1000)); if(result == pdTRUE) printf("Check In OK\r\n"); else printf("Check In Fail\r\n"); } /* USER CODE END StartDefaultTask */ }
任务2统计当前计数信号量的数值
/* USER CODE END Header_StartTask02 */ void StartTask02(void *argument) { /* USER CODE BEGIN StartTask02 */ /* Infinite loop */ for(;;) { UBaseType_t AvailableTables = osSemaphoreGetCount(CountingSemHandle); printf("Now AvailableTables is : %d\r\n", (uint16_t)AvailableTables); osDelay(pdMS_TO_TICKS(500)); if(AvailableTables==1){ osSemaphoreRelease( CountingSemHandle );//给出信号量 } } /* USER CODE END StartTask02 */ }
4、实验结果
任务1持续获取信号量,并且在所有任务中未进行计数信号量的释放,随着计数信号量数值归零,仅进行单次计数信号量的释放。