1.前言
在中断不频繁的系统中,使用二值信号量没有问题,但是中断频繁发生时,则会有中断丢失的问题。
因为中断发生时延迟任务执行,延迟任务执行的过程中,如果又来了两次中断,则只会处理第一次,第二次将会丢失。
为此引入多值信号量来处理这个问题。
2.二值信号量和多值信号量的原理图
二值信号量的处理过程如下图所示:
多值信号量的原理图:
3.计数信号量的典型用法
3.1 事件计数
事件发生时信号量计数值加1,延迟处理任务每处理一个任务信号量计数值减1,信号量的计数值是已发生的事件数与已处理的事件数之间的差值。
用于事件计数的信号量初始值为0.
3.2 资源管理
信号量的计数值表示可用资源的数目。
要使用资源,必须先获取信号量,使信号量计数值减1;
任务完成则释放信号量,将信号量计数值加1;
信号量计数值为0表示没有可用资源;
用于资源管理的信号量,创建时计数值被初始化为可用资源总数。
4.主要API
API | 说明 | 参数及返回值 |
xSemaphoreCreateCounting() | 创建计数信号量,FreeRTOS 中所有种类的信号量句柄都由声明为 xSemaphoreHandle 类型的变量 保存。 |
uxMaxCount 最大计数值 uxInitialCount 信号量的初始计数值 返回值 如果返回 NULL 值,表示堆上内存空间不足,所以 FreeRTOS 无法 |