freeRTOS中文实用教程3--中断管理之计数信号量

1.前言

 在中断不频繁的系统中,使用二值信号量没有问题,但是中断频繁发生时,则会有中断丢失的问题。

因为中断发生时延迟任务执行,延迟任务执行的过程中,如果又来了两次中断,则只会处理第一次,第二次将会丢失。

为此引入多值信号量来处理这个问题。

2.二值信号量和多值信号量的原理图

二值信号量的处理过程如下图所示:

多值信号量的原理图:

3.计数信号量的典型用法

3.1 事件计数

事件发生时信号量计数值加1,延迟处理任务每处理一个任务信号量计数值减1,信号量的计数值是已发生的事件数与已处理的事件数之间的差值。

用于事件计数的信号量初始值为0.

3.2 资源管理

信号量的计数值表示可用资源的数目。

要使用资源,必须先获取信号量,使信号量计数值减1;

任务完成则释放信号量,将信号量计数值加1;

信号量计数值为0表示没有可用资源;

用于资源管理的信号量,创建时计数值被初始化为可用资源总数。

4.主要API 

API 说明 参数及返回值
xSemaphoreCreateCounting()
创建计数信号量,FreeRTOS 中所有种类的信号量句柄都由声明为 xSemaphoreHandle 类型的变量
保存。

uxMaxCount 最大计数值

uxInitialCount 信号量的初始计数值


返回值 如果返回 NULL 值,表示堆上内存空间不足,所以 FreeRTOS 无法
为信号量结构分配内存导致信号量创建失败。第五章有提供更多的
内存管理方面的信息。
如果返回非 NULL 值,则表示信号量创建成功。此值应当被保存起
来作为这个的信号量的句柄。

原文地址:https://www.cnblogs.com/smartjourneys/p/7838176.html