FreeRTOS中vSemaphoreCreateBinary和xSemaphoreCreateCounting(1, 0)的区别

OpenRTOS V7.4.2

硬件平台:Cortex-M4


要使用信号量达到两个任务先后执行,比如任务A执行初始化以后,给出信号量消息,然后任务B才运行。

void task_A()

{

    xSemaphoreGive(semphr);

}

void task_B()

{

    xSemaphoreTake( semphr, portMAX_DELAY );

    for(;;)

    {

        printf("task B\n");

    }

}

如果使用vSemaphoreCreateBinary()创建二值信号量。

vSemaphoreCreateBinary(semphr);

如果使用xSemaphoreCreateCounting创建计数信号量。

semphr = xSemaphoreCreateCounting(1, 0);


前者是无法保证任务A执行前任务B保持阻塞的,因为二值信号量初始化以后信号量的状态是无法确定的,所以经常会出现各种混乱的情况。即使把任务A里面Give()信号量的操作注释掉,任务B的打印语句仍然可以正常输出。


后者却可以保证任务A在任务B之前执行。因为计数信号量创建时给定了初始值为0,任务B会阻塞等待任务A给出信号量。


你可能感兴趣的:(信号量,freertos)