• #FreeRTOS延时函数


    延时函数的相对模式和绝对模式

    vTaskDelay()

    相对延时函数:相对延时是指每次延时都是从任务执行函数vTaskDelay()开始,延时指定的时间结束;
    比如vTaskDelay(100),那么从调用vTaskDelay()后,任务进入阻塞状态,经过100个系统时钟节拍周期,任务解除阻塞。因此,vTaskDelay()并不适用与周期性执行任务的场合。此外,其它任务和中断活动,会影响到vTaskDelay()的调用(比如调用前高优先级任务抢占了当前任务),因此会影响任务下一次执行的时间。相当于释放CPU使用权限100个时钟节拍但是当有高优先级任务抢占时可能就不止100个时钟节拍了,换句话说没有高优先级任务或中断抢占时100个时钟节拍后会响应该任务
    ==pdMS_TO_TICKS( xTimeInMs )==函数将时间(ms)转换为系统节拍时钟

    const portTickType xDelay = pdMS_TO_TICKS(500);
    vTaskDelay(xDelay); 
    vTaskDelay(pdMS_TO_TICKS(500)); //延迟500ms==
    
    • 1
    • 2
    • 3

    使用时需要转换一下

    vTaskDelayUntil()

    绝对延时是指每隔指定的时间,执行一次调用vTaskDelayUntil()函数的任务。换句话说:任务以固定的频率执行。
    API函数vTaskDelayUntil()可用于固定频率的延时,它用来延时一个绝对时间。
    
    • 1
    • 2

    在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelayUntil 必须设置成1,此函数才有效。

    这个函数不同于vTaskDelay()函数的一个重要之处在于:vTaskDelay()指定的延时时间是从调用vTaskDelay()之后(执行完该函数)开始算起的,而vTaskDelayUntil()指定一个绝对时间,每当时间到达,则解除任务阻塞。

    void vTaskDelayUntil( TickType_t * pxPreviousWakeTime, TickType_t xTimeIncrement );
    uint32_t lastWakeTime = xTaskGetTickCount();
    vTaskDelayUntil(&lastWakeTime, 10);
    //pxPreviousWakeTime需要将此参数初始化为进入任务的while()循环体的时间点值。
    //xTimeIncrement 任务需要延时的时间节拍数
    
    • 1
    • 2
    • 3
    • 4
    • 5

    对于绝对延时函数,如果任务不是最高优先级,则仍然能周期性的将任务解除阻塞,但是解除阻塞的任务不一定能获得CPU权限,因此任务主体代码也不会总是精确周期性执行。

  • 相关阅读:
    钱小雨--进
    Java开发经典实战!2022 国内知名大厂Java岗面经
    DRF03-权限与分页
    知识产权价值评估主要看这六方面
    架构师备考专栏-导航页
    golang学习笔记系列之复杂数据类型
    DataOps:深刻影响现代数据栈发展
    基于C语言的DES算法的程序设计与实现
    lodash已死?radash最全使用介绍(附源码说明)—— Array方法篇(4)
    数据流通市场中数据产品的特性及其交易模式
  • 原文地址:https://blog.csdn.net/Pretender_1205/article/details/133177200