一.简介
二值信号量是一种特殊的信号量,其值为0或1,主要操作包括发送和接收;
与二值信号量有关的声明和定义在头文件semphr.h中;
二值信号量在使用前需创建;
二.常用API
2.1 二值信号量的创建:
vSemaphoreCreateBinary( xSemaphore ),是一个宏;
xSemaphore :信号量句柄,为SemaphoreHandle_t类型(实际为一个void类型的指针);
2.2 二值信号量的释放:
(1)普通版本:
xSemaphoreGive( xSemaphore ),是一个宏;
xSemaphore:要释放的二值信号量句柄;
(2)中断版本:
xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ),是一个宏;
xSemaphore:要释放的二值信号量句柄;
pxHigherPriorityTaskWoken:如果该信号量会导致一个比当前任务更高优先级的任务解除阻塞,返回pdTURE,此时应该进行一次上下文切换(为BaseType_t类型);
返回值:是否释放信号量成功,为pdTRUE,否则为pdFALSE;
2.3 二值信号量的获取
(1)普通版本:
xSemaphoreTake( xSemaphore, xBlockTime ),是一个宏;
xSemaphore:二值信号量句柄;
xBlockTime:获取二值信号量阻塞时间(当为portMAX_DELAY时任务会一直等待信号量释放才会解除挂起状态);
返回值:是否获取成功;
(2)中断版本:
xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ),是一个宏;
xSemaphore:二值信号量句柄;
pxHigherPriorityTaskWoken:如果该信号量会导致一个比当前任务更高优先级的任务解除阻塞,返回pdTURE,此时应该进行一次上下文切换(为BaseType_t类型);
返回值:是否获取成功;
三.实验
使用定时器1s时基中断释放二值信号量:
在任务中一直阻塞直到获取信号量,串口打印“ask1 is running”:
实验结果: