与二值信号量可以类比成只能保存一个数据的队列一样,计数信号量可以类比成长度大于1的队列,用户在使用的时候同样不关注队列中的数据,只关心这个队列是不是非空的。

    计数信号量的主要用在两个方面:

    • 计数事件

    事件每次发生时,都会增加计数信号量的值,而任务在每次处理完后都会将计数信号量的值减少。因此,计数值其实代表着已经发生的事件次数和已经处理完的事件次数只差,也因此,计数信号量的初始值设置成0是合理的。

    • 资源管理

    这种应用场景下,计数信号量的值代表着当前可用资源的总数,任务在使用某个资源的时候,必须先获得一个信号量,如果当前信号量为空,代表无可用资源,否则将资源分配给任务,同时计数信号量值减少。相应的,任务在使用完资源后,归还这个资源,同时计数信号量值增加。因此,计数信号量的初始值就是资源总数值。

    详细使用方法可以参考官方例程,存放在路径FreeRTOS/Demo/Common/Minimal下,也可以参阅后面的进阶部分内容。