参考 开发手册
二值信号量
简介
二值信号量通常用于互斥访问或同步,二至信号量没有优先级继承,更适合用于同步(任务与任务或任务与中断的同步)。
二值信号量其实就是一个只有一个队列项的队列,这个特殊的队列要么是满的,要么是空的,任务和中断不在乎队列中存的是什么消息,只需要知道这个队列是满的还是空的。可以利用这个机制来完成任务与中断之间的同步。
创建二值信号量
函数 | 描述 |
---|---|
vSemaphoreCreateBinary | 动态创建二值信号量,老版本中使用的API函数。 |
xSemaphoreCreateBinary | 动态创建二值信号量,新版本。 |
vSemaphoreCreateBinaryStatic | 静态创建二值信号量。 |
新版本的创建函数没有参数
参数:
xSemaphore :保存创建成功的二值信号量句柄。
pxSemaphoerBuffer : 此参数指向一个StaticSemaphore_t类型的变量,用来保存信号量结构体。
返回值:
NULL : 二值信号量创建失败。
其他值 : 创建成功的二值信号量句柄。
旧版本:::当二值信号量创建成功以后调用函数xSemaphoreGive()释放二值信号量,此时新创建的二值信号量有效。
新版本::: 在创建成功后不会调用函数xSemaphoreGive()释放二值信号量,默认是无效的。
释放二值信号量
函数 | 描述 |
---|---|
xSemaphoreGive() | 任务级信号量释放函数 |
xSemaphoreGiveFromISR() | 中断级信号量释放函数 |
真正的释放信号量过程是由 xQueueGenericSend()和xQueueGenericSendFromISR()完成 (相当于将信号放入队列中,放进去用释放。。。)
参数 :
pxHigherPriorityTaskWoken : 标记退出此函数以后是否进行任务切换,
这个变量的值是由这三个函数来设置的,用户不用进行设置值,
用户只需要提供一个变量来保存这个值就行了。
当此值为pdTRUE的时候在退出中断函数之前一定要进行一次任务切换
返回值:
pdPASS : 释放信号量成功。
errQUEUE_FULL : 释放信号量失败。
获取二值信号量
函数 | 描述 |
---|---|
xSemaphoreTake() | 任务级获取信号量函数 |
xSemaphoreTakeFromISR() | 中断级获取信号量函数 |
真正的获取信号量过程是由 xQueueGenericReceive()和xQueueGenericReceiveFromISR()完成 (从队列中拿出来)
参数:
xBlockTime : 阻塞时间。
返回值:
pdPASS : 获取信号量成功。
errQUEUE_FULL :超时, 获取信号量失败。
例如 :
创建 BinarySemaphore=xSemaphoreCreateBinary();
获取 err=xSemaphoreTake(BinarySemaphore,portMAX_DELAY);
释放 xSemaphoreGiveFromISR(BinarySemaphore,&xHigherPriorityTaskWoken); //释放二值信号量