xSemaphoreTake

xSemaphoreTake,用於獲取信號量的宏。信號量必須已經通過調用vSemaphoreCreateBinary(), xSemaphoreCreateMutex() 或 xSemaphoreCreateCounting()來創建。

基本介紹

  • 外文名:xSemaphoreTake
  • 用於:獲取信號量的宏
  • 性質:計算機學
  • 類別:編程
代碼簡介,參數信息,

代碼簡介

FREERTOS 函式
semphr. h
xSemaphoreTake(
xSemaphoreHandle xSemaphore,
portTickType xBlockTime
)
這個宏不能在服務中斷程式中調用。如果有必要,可以調用xQueueReceiveFromISR() 來在中斷服務程式中獲取信號量,雖然這並不是一種正規的操作。 xSemaphoreTake() 是一個全功能任務間通訊API, xSemaphoreAltTake() 是其等價的替代API 。

參數信息

這兩個版本均需要同樣的參數並返回同樣的值。 Parameters:
xSemaphore
將被獲得的信號量句柄,此信號量必須已經被創建
xBlockTime
等待信號量可用的時鐘滴答次數,可以使用 portTICK_RATE_MS宏來轉換為實際的時間 。當為0時可以用於 對信號量進行輪詢(poll the semaphore) 如果INCLUDE_vTaskSuspend置位“1”,則指定xBlockTime為 portMAX_DELAY會導致任務阻塞時間不確定(不會逾時)
返回: 如果成功獲取信號量則返回pdTRUE,如果xBlockTime逾時而信號量還未可用則返回pdFALSE。 套用範例: xSemaphoreHandle xSemaphore = NULL;
// A task that creates a semaphore. void vATask( void * pvParameters ) { // 創建一個信號量用於標識一個共享資源。 // 因為我們使用信號量來互斥,因此創建互斥鎖信號量而不是二元信號量 xSemaphore = xSemaphoreCreateMutex(); }
//使用信號量的任務 void vAnotherTask( void * pvParameters ) { // ... 完成其他事情
if( xSemaphore != NULL ) { // 查看是否可以獲得信號量,如果信號量不可用,則用10個時鐘滴答來查看信號量是否可用 if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE ) { //已經能夠獲得信號量並且現在可以訪問共享資源
// ...
// 完成共享資源訪問,釋放信號量 xSemaphoreGive( xSemaphore ); } else { //無法獲取信號量,因此無法安全地訪問共享資源 } } }

相關詞條

熱門詞條

聯絡我們