2016-06-28 94 views
0
void forward(void *pvparam) 
{ 
    while(1) 
    { 
     if(xSemaphoreTake(xSemaphore,1000)==pdTRUE) 
     { 
      UART0_SendStr("Frwd took it\n"); 
     } 
     else 
     { 
      UART0_SendStr("Frwd couldn't take it\n"); 
     } 
     vTaskDelay(1000); 
    } 
} 

void back(void *pvparam) 
{ 
    vTaskDelay(100); 
    while(1) 
    { 
     if(xSemaphoreGive(xSemaphore)==pdTRUE) 
     { 
      UART0_SendStr("Back Gave it:MF\n"); 
     } 
     else 
     { 
      UART0_SendStr("Back couldn't give it:MS\n"); 
     } 
     vTaskDelay(1000); 
    } 
} 

上面的代碼是我用於二進制信號量和互斥量的代碼。 唯一的區別是二進制信號我寫「xSemaphoreCreateBinary(xsemaphore);」在主要和 爲互斥 xSemaphoreCreateMutex(xsemaphore)在主。區分使用相同代碼的二進制信號量和互斥量

按照definetion

「的任務佔用的信號量(互斥)只能由一個任務創建的任務和信號量(二進制)被賦予可以由任何任務的給予」

但是這兩個代碼(即二進制信號量和互斥量)給出相同的輸出。

回答

0

互斥鎖用於控制對資源/數據的獨佔訪問。如果您採用互斥體來保護資源/數據,則必須在完成後將其還原,否則將永久阻止資源。互斥體還允許優先級繼承。

另一方面,二進制信號量用於任務同步目的。一旦你拿到它,你就不會放棄信號量。

看着上面的代碼,我認爲二進制信號量是要走的路。

+0

謝謝,問題是當我使用互斥量被釋放的另一個任務的互斥量給函數。後來我意識到了執行水平差異BTW互斥和二進制信號量。 –