FreeRTOS源码阅读笔记4--semphr.h

 信号量是特殊的队列--无法存储消息的队列,相关的接口函数声明在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函数原型

FreeRTOS源码阅读笔记4--semphr.h_第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()函数。

FreeRTOS源码阅读笔记4--semphr.h_第2张图片

4.7获取信号量xSemaphoreTakeFromISR()

4.7.1函数原型

4.7.2函数框架

调用xQueueReceiveFromISR函数。

你可能感兴趣的:(笔记)