參考 開發手冊
二值信号量
簡介
二值信号量通常用于互斥通路或同步,二至信号量沒有優先級繼承,更适合用于同步(任務與任務或任務與中斷的同步)。
二值信号量其實就是一個隻有一個隊列項的隊列,這個特殊的隊列要麼是滿的,要麼是空的,任務和中斷不在乎隊列中存的是什麼消息,隻需要知道這個隊列是滿的還是空的。可以利用這個機制來完成任務與中斷之間的同步。
建立二值信号量
函數 | 描述 |
---|---|
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); //釋放二值信号量