2016-06-28 97 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互斥和二进制信号量。 –