FreeRTOS Delay函数

FreeRTOS任务 两个Delay函数

有两个Delay函数:

  • vTaskDelay:至少等待指定个数的Tick Interrupt才能变为就绪状态
  • vTaskDelayUntil:等待到指定的绝对时刻,才能变为就绪态。

这2个函数原型如下:

void vTaskDelay( const TickType_t xTicksToDelay ); /* xTicksToDelay: 等待多少给Tick */

/* pxPreviousWakeTime: 上一次被唤醒的时间
 * xTimeIncrement: 要阻塞到(pxPreviousWakeTime + xTimeIncrement)
 * 单位都是Tick Count
 */
BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,
                            const TickType_t xTimeIncrement );

下面画图说明:

  • 使用vTaskDelay(n)时,进入、退出vTaskDelay的时间间隔至少是n个Tick中断
  • 使用xTaskDelayUntil(&Pre, n)时,前后两次退出xTaskDelayUntil的时间至少是n个Tick中断
    • 退出xTaskDelayUntil时任务就进入的就绪状态,一般都能得到执行机会
    • 所以可以使用xTaskDelayUntil来让任务周期性地运行

FreeRTOS任务 两个Delay函数

FreeRTOS任务 示例: Delay

本节代码为:FreeRTOS_06_taskdelay

本程序会创建2个任务:

  • Task1:
    • 高优先级
    • 设置变量flag为1,然后调用vTaskDelay(xDelay50ms);vTaskDelayUntil(&xLastWakeTime, xDelay50ms);
  • Task2:
    • 低优先级
    • 设置变量flag为0

main函数代码如下:

int main( void )
{
    prvSetupHardware();

    /* Task1的优先级更高, Task1先执行 */
    xTaskCreate( vTask1, "Task 1", 1000, NULL, 2, NULL );
    xTaskCreate( vTask2, "Task 2", 1000, NULL, 1, NULL );

    /* 启动调度器 */
    vTaskStartScheduler();

    /* 如果程序运行到了这里就表示出错了, 一般是内存不足 */
    return 0;
}

Task1的代码中使用条件开关来选择Delay函数,把#if 1改为#if 0就可以使用vTaskDelayUntil,代码如下:

void vTask1( void *pvParameters )
{
    const TickType_t xDelay50ms = pdMS_TO_TICKS( 50UL );
    TickType_t xLastWakeTime;
    int i;

    /* 获得当前的Tick Count */
    xLastWakeTime = xTaskGetTickCount();

    for( ;; )
    {
        flag = 1;

        /* 故意加入多个循环,让程序运行时间长一点 */
        for (i = 0; i <5; i++)
            printf( "Task 1 is running\r\n" );

#if 1      
        vTaskDelay(xDelay50ms);
#else      
        vTaskDelayUntil(&xLastWakeTime, xDelay50ms);
#endif     
    }
}

Task2的代码如下:

void vTask2( void *pvParameters )
{
    for( ;; )
    {
        flag = 0;
        printf( "Task 2 is running\r\n" );
    }
}

使用Keil的逻辑分析观察flag变量的bit波形,如下:

  • flag为1时表示Task1在运行,flag为0时表示Task2在运行,也就是Task1处于阻塞状态
  • vTaskDelay:指定的是阻塞的时间
  • vTaskDelayUntil:指定的是任务执行的间隔、周期

FreeRTOS任务 示例: Delay

赞(0)
未经允许不得转载:极客笔记 » FreeRTOS Delay函数
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址