二值信号量的工作过程

2021-10-08 11:44:50 浏览数 (2)

(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:信号量获取失败。

0 人点赞