簡體   English   中英

FreeRTOS 信號量

[英]FreeRTOS Semaphore

這是 FreeRTOS api 參考http://www.freertos.org/a00122.html關於 xSemaphoreTake() ZC1C425268E68385D1AB5074F1C 的摘錄

// See if we can obtain the semaphore. If the semaphore is not available // wait 10 ticks to see if it becomes free. if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE ) { // We were able to obtain the semaphore and can now access the // shared resource.

我的問題是:我是否已經在這里有了信號量,或者我必須調用xSemaphoreTake( xSemaphore, (portTickType) 10 )像:

 // We have finished accessing the shared resource. Release the // semaphore. xSemaphoreGive( xSemaphore ); }

在鏈接到的示例中,在if(...)主體中獲取信號量。 如果您從該示例中進行了復制粘貼,則可以確保在程序中同時具有xSemaphoreTake和xSemaphoreGive。

調用xSemaphoreTake()時,您不知道是否擁有xSemaphore信號量。 如果它是空閑的,那么你的代碼將繼續執行,如果它在10個時鍾內變為空閑,你的代碼將繼續執行而不會讓OS調度程序讓你失望(這是你的調用中指定的超時),如果xSemaphore在指定的超時后不可用,您的任務將進入阻塞狀態,下一個具有更高優先級的就緒任務將執行。

你明確調用xSemaphoreGive引用相同的信號量將是一個嚴重的錯誤,如果你不擁有它,釋放它是沒有意義的。

我的問題是:我是否已經擁有信號量或者我必須將xSemaphoreTake(xSemaphore,(portTickType)10)顯式調用如下:

是的,如果輸入if語句的主體,則您具有信號量。 如果在阻塞時間(在你的情況下為10個滴答)之后信號量以某種方式不可用(或在持續時間內給出),則xSemaphoreTake(xSemaphore,(portTickType)10)返回pdFALSE。

除非信號量在調用 xSemaphoreTake(semp, 10) 時立即可用,否則調用任務不會被阻塞(意味着進入等待或阻塞狀態),否則即使信號量在 10 個滴答內可用,它仍然會被置於阻塞的 state ,假設信號量在第 6 個刻度可用。 然后返回 pdTRUE 或 pdFALSE 以反映信號量的獲取是成功還是失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM