信号量是特殊的队列--无法存储消息的队列,相关的接口函数声明在semphr.h中,通过宏定义替换队列函数实现。
4.1创建二值信号量xSemaphoreCreateBinary()
4.1.1函数原型
- queueQUEUE_TYPE_BINARY_SEMAPHORE:一个宏,表示创建队列的类型是二值信号量
4.1.2函数框架
创建二值信号量实际上是,创建了一个队列,这个队列的长度为1,存储队列消息的空间为0。
4.2创建计数信号量xSemaphoreCreateCounting()
4.2.1函数原型
- uxMaxCount:计数信号量的最大值,当达到这个值的时候,信号量不能再被释放。
- uxInitialCount:初始信号量的值。
4.2.2函数框架
- ①调用xQueueGenericCreate函数创建一个长度为uxMaxCount,消息存储空间为0的队列。
- ②使uxMessagesWaiting = uxInitialCount,表示当前可用的信号量数量为uxInitialCount。
4.3删除信号量vSemaphoreDelete()
4.3.1函数原型
4.3.2函数框架
调用vQueueDelete()函数删除。
4.4释放信号量xSemaphoreGive()
4.4.1函数原型
- xSemaphore:信号量的句柄,指向队列控制块;
- NULL:表示消息体为空;
- semGIVE_BLOCK_TIME:宏,数值0,表示阻塞时间为零;
- queueSEND_TO_BACK:一个宏,表示发送到队列尾部。
4.4.2函数框架
从函数原型可以看出,信号量释放是不会阻塞任务的,所以如果队列是满的,就不会去更新阻塞时间、检查阻塞时间是否过了、再检查队列是否还是满的等操作,直接返回err_QUEUE_FULL。
- ①如果队列没满,uxMessageWaiting加一,表示信号量的数量加一;如果此时有任务在等待接收信号量,唤醒该任务,返回pdPASS。
- ②如果队列满了,直接返回err_QUEUE_FULL。
4.5释放信号量xSemaphoreGiveFromISR()
4.5.1函数原型
- xSemaphore:信号量句柄;
- pxHigherPriorityTaskWoken:在函数里会改变*pxHigherPriorityTaskWoken的值,可根据它的值判断在中断退出后是否要进行任务切换。
4.5.2函数框架
xQueueGiveFromISR()是xQueueGenericSendFromISR()的简单版,区别是不需要处理队列消息,因为信号量没有消息存储空间。
4.6获取信号量xSemaphoreTake()
4.6.1函数原型
4.6.2函数框架
类似xQueueReceive()函数。
4.7获取信号量xSemaphoreTakeFromISR()
4.7.1函数原型
4.7.2函数框架
调用xQueueReceiveFromISR函数。