天天看點

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);	//釋放二值信号量
           

繼續閱讀