天天看点

FreeRTOS 二值信号量二值信号量

参考 开发手册

二值信号量

简介

二值信号量通常用于互斥访问或同步,二至信号量没有优先级继承,更适合用于同步(任务与任务或任务与中断的同步)。

二值信号量其实就是一个只有一个队列项的队列,这个特殊的队列要么是满的,要么是空的,任务和中断不在乎队列中存的是什么消息,只需要知道这个队列是满的还是空的。可以利用这个机制来完成任务与中断之间的同步。

创建二值信号量

函数 描述
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);	//释放二值信号量
           

继续阅读