(1)二值信号量无效,任务阻塞等待信号量
(2)中断发生,释放了信号量
(3)任务获取信号量成功,从阻塞状态解除
(4)任务再次进入阻塞态,等待信号量
完整的一次流程如下:
9.1.2 相关函数
(1)动态创建信号量
函数原型:
代码语言:javascript复制#include "FreeRTOS.h"
#include "semphr.h"
SemaphoreHandle_t xSemaphoreCreateBinary( void );
函数描述:创建一个二值信号量,并返回信号量句柄。每一个信号量需要一个内存空间来存放信号量状态。这个函数的创建的信号量空间由FreeRTOS自动分配。信号量创建之后是空的,任务这时候是无法获得的。
函数参数:无
返回值:NULL:创建失败。其他值:创建成功的二值信号量的句柄
(2)静态创建信号量
函数原型:
代码语言:javascript复制#include “FreeRTOS.h”
#include “semphr.h”
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer );
函数描述:创建一个二值信号量,并返回信号量句柄。每一个信号量需要一个内存空间来存放信号量状态。这个函数的创建的信号量空间由用户指定。信号量创建之后是空的,任务这时候是无法获得的。
函数参数:pxSemaphoreBuffer:指向StaticSemaphore_t类型的变量,这个变量用来保存信号量的状态。
返回值:NULL:创建失败。其他值:创建成功的二值信号量的句柄
(3)任务级释放信号量
函数原型:
代码语言:javascript复制#include “FreeRTOS.h”
#include “semphr.h”
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
函数描述:释放信号量之前,信号量必须已经被创建了。
函数参数:xSemaphore:要释放的信号量句柄
返回值:pdPASS:信号量释放成功。pdFAIL:信号量释放失败。
(4)中断级释放信号量
函数原型:
代码语言:javascript复制#include “FreeRTOS.h”
#include “semphr.h”
BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore,
BaseType_t *pxHigherPriorityTaskWoken );
函数描述:中断级释放信号量函数,在中断处理函数中使用。
函数参数:xSemaphore:要释放的信号量句柄;
pxHigherPriorityTaskWoken:标记退出此函数是否进行任务切换,此值为pdTRUE的时候在退出中断函数之前要进行一次任务切换。
返回值:pdPASS:信号量释放成功。errQUEUE_FULL:信号量释放失败,信号量已经被释放了。
(5)任务级获取信号量
函数原型:
代码语言:javascript复制#include “FreeRTOS.h”
#include “semphr.h”
BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore,
TickType_t xTicksToWait );
函数描述:获取信号量之前,信号量必须已经被创建了。
函数参数:xSemaphore:要获取的信号量句柄;
xTicksToWait:当任务无法获取到信号量,任务最大的保持阻塞的时间。如果为0,任务无法获得信号量时将立即返回。阻塞时间指的时时钟滴答数,所以阻塞的时间大小取决于系统频率,可以使用pdMS_TO_TICKS() 宏来指定阻塞多少毫秒。如果为portMAX_DELAY,任务将一直等待。
返回值:pdPASS:信号量获取成功。pdFAIL:信号量获取失败。
(6)中断级获取信号量
函数原型:
代码语言:javascript复制#include “FreeRTOS.h”
#include “queue.h”
BaseType_t xSemaphoreTakeFromISR( SemaphoreHandle_t xSemaphore,
signed BaseType_t *pxHigherPriorityTaskWoken );
函数描述:在中断服务函数中获取信号量。
函数参数:xSemaphore:要获取的信号量句柄;
pxHigherPriorityTaskWoken:标记退出此函数后是否进行任务切换,此值为pdTRUE的时候在退出中断函数之前要进行一次任务切换。
返回值:pdPASS:信号量获取成功。pdFAIL:信号量获取失败。