如何知道哪个任务占用了二进制信号量?

How to know which task has taken a binary semaphore?

我有三个任务,它们共享一个二进制信号量myBinarySemaphore。我想知道哪个任务当前有二进制信号量。我可以使用全局变量来执行此操作,但 freeRTOS 是否为此提供了方法?

这是代码,我正在寻找一种 freeRTOS 方法来检查哪个任务具有 binarySemaphore,例如 taskCxTaskOwner 纯粹是出于示例目的而发明的。谢谢

    void taskA(void *pvParameters)
    {
        for(;;)
        {
            if(xSemaphoreTake(myBinarySemaphore, (TickType_t) 10) == pdTRUE)
            {
                xSemaphoreGive(myBinarySemaphore);
            }
        }
    }
    
    void taskB(void *pvParameters)
    {
        for(;;)
        {
            if(xSemaphoreTake(myBinarySemaphore, (TickType_t) 10) == pdTRUE)
            {
                xSemaphoreGive(myBinarySemaphore);
            }
        }
    }
    
    void taskC(void *pvParameters)
    {
        for(;;)
        {
            if(xTaskOwner(myBinarySemaphore) == taskA) // <== How to check with freeRTOS which task has the semaphore ? 
                printf("taskA has the semaphore");
            else if (xTaskOwner(myBinarySemaphore) == taskB)
                printf("taskB has the semaphore");
        }
    }

PS & EDIT:假设 taskC 可以 运行 与其他任务同时进行,否则我的示例是错误的。

我会添加一个队列,其中包含一条简单的消息,说明哪个任务当前有信号量。每次获取信号量时,都会覆盖队列。在 taskC 中,您可以执行 xQueuePeek 并查看哪个任务进行了覆盖。

您可以使用事件标志来指示哪个任务具有信号量。每个任务在共享事件组上都有自己的标志。