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持续获取信号量,并且在所有任务中未进行计数信号量的释放,随着计数信号量数值归零,仅进行单次计数信号量的释放。

我要赚赏金
