vTaskDelay和_delay_ms之间的行为差​​异是什么?

Kam*_*fel 1 c multithreading avr scheduling freertos

1.简介

我似乎无法找到有关FreeRTOS任务中以下函数之间行为差异的信息或详细解释:

  • vTaskDelay
  • _delay_ms

2.代码

假设您有以下代码:

IdleHook +任务创建

Long value = 0;

void vApplicationIdleHook( void ) {
    while(1)
    {
        // empty
    }
}

int main(void)
{
     xTaskCreate(TaskIncrement, (const portCHAR *)"up" , 256, NULL, 2, NULL );
     xTaskCreate(TaskDecrement, (const portCHAR *)"down" , 256, NULL, 1, NULL );

     vTaskStartScheduler();
}
Run Code Online (Sandbox Code Playgroud)

vTaskDelay的任务

static void TaskDecrement(void *param)
{
    while(1)
    {
        for(unsigned long i=0; i < 123; i++) {
            //semaphore take
            value--;
            //semaphore give
        }
        vTaskDelay(100);
    }
}

static void TaskIncrement(void *param)
{
    while(1)
    {
        for(unsigned long i=0; i < 123; i++) {
            //semaphore take
            value++;
            //semaphore give
        }
        vTaskDelay(100);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用_delay_ms的任务

static void TaskDecrement(void *param)
{
    while(1)
    {
        for(unsigned long i=0; i < 123; i++) {
            //semaphore take
            value--;
            //semaphore give
        }
        _delay_ms(100);
    }
}

static void TaskIncrement(void *param)
{
    while(1)
    {
        for(unsigned long i=0; i < 123; i++) {
            //semaphore take
            value++;
            //semaphore give
        }
        _delay_ms(100);
    }
}
Run Code Online (Sandbox Code Playgroud)

3.问题

当任务提供vTaskDelay与_delay_ms时,程序流程会发生什么?

注意:两个给定的示例任务具有不同的优先级.

jdc*_*jdc 6

来自https://www.freertos.org/Documentation/FreeRTOS_Reference_Manual_V10.0.0.pdf:

将调用vTaskDelay()的任务置于Blocked状态,以获得固定数量的tick中断.指定零滴答的延迟时间不会导致调用任务进入阻塞状态,但会导致调用任务产生任何共享其优先级的就绪状态任务.调用vTaskDelay(0)等同于调用taskYIELD().

我认为你已经有了这个想法,但是如果你创建了多个任务,那么vTaskDelay()将运行任务置于指定数量的节拍中断(不是毫秒!)的"阻塞"状态,并允许具有下一个最高优先级的任务运行直到它产生控制(或被取代,取决于你的FreeRTOS配置).

我不认为它_delay_ms()是FreeRTOS库的一部分.您确定它不是特定于平台的功能吗?我的猜测是,如果优先级最高的任务调用_delay_ms(),则会导致忙碌等待.否则,具有更高优先级的任务可以抢占调用的任务,_delay_ms()因为它正在延迟(即,_delay_ms()不会立即产生控制).

也许对上述内容的更好总结:在多任务应用程序中,_delay_ms()不是确定性的.