【问题标题】:Differentiating between Binary semaphore and Mutex using same code使用相同的代码区分二进制信号量和互斥量
【发布时间】:2016-06-28 09:34:31
【问题描述】:
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) 在 main.

根据定义

“任务占用的信号量(互斥量)只能由该任务给出,而任务创建的信号量(二进制)可以由任何任务给出”

但是两个代码(即二进制信号量和互斥量)都给出相同的输出。

【问题讨论】:

    标签: mutex semaphore freertos


    【解决方案1】:

    互斥锁用于控制对资源/数据的独占访问。如果您使用互斥锁保护资源/数据,则必须在完成后将其归还,否则您将永久阻塞该资源。互斥体还允许优先级继承。

    另一方面,二进制信号量用于任务同步目的。一旦你接受了信号量,你就不会给予回馈。

    看看你上面的代码,我认为二进制信号量是要走的路。

    【讨论】:

    • 谢谢您,问题是当我将 give 函数与来自另一个任务的互斥锁一起使用时,互斥锁正在被释放。后来我意识到互斥量和二进制信号量的实现级别差异。
    猜你喜欢
    • 2022-11-01
    • 2010-09-08
    • 2015-05-24
    • 2021-08-14
    • 1970-01-01
    • 2020-04-05
    • 2022-11-05
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多