FreeRTOS中delay与vTaskDelay的区别详解

        FreeRTOS中,delayvTaskDelay都是用于延时任务的操作,但它们的应用场景和实现方式有所不同。详细了解这两者对于正确使用FreeRTOS进行嵌入式开发非常重要。本文将深入探讨FreeRTOS中的延时机制,尤其是delayvTaskDelay的区别。

FreeRTOS中的延时机制

        FreeRTOS是一种实时操作系统(RTOS),支持任务调度、多任务管理、信号量、消息队列等功能。任务延时是其中一个常用功能,用于使任务暂停执行一段时间,从而为其他任务让出CPU时间。

在FreeRTOS中,任务延时通常有两种方式:

  1. 空闲延时(Busy Waiting/Delay):任务在延时期间一直循环等待。
  2. 调度延时(Task Delay/vTaskDelay):任务在延时期间挂起,调度器将CPU时间分配给其他任务。

delayvTaskDelay的区别

1. delay函数

  delay通常指在裸机编程(Bare Metal Programming)中使用的延时方法,如通过循环计数器实现的延时。它的实现方式是忙等待(Busy Waiting),即在延时时间内,CPU会一直执行一个空循环,消耗时间。这种方法的实现比较简单,适用于没有操作系统的环境。

void delay(uint32_t milliseconds) {
    uint32_t start = current_time_in_milliseconds();
    while (current_time_in_milliseconds() - start < milliseconds);
}
特点
  • 实现简单:通过循环计数器或者定时器实现。
  • CPU占用高:在延时期间,CPU无法执行其他任务。
  • 适用于裸机系统:通常用于不带操作系统的嵌入式系统。
  • 2. vTaskDelay函数

      vTaskDelay是FreeRTOS提供的一个API,用于使任务进入阻塞状态,延时指定的时间后再恢复执行。它是基于系统节拍(tick)的,即延时的单位是操作系统的时钟节拍数。使用vTaskDelay,任务会挂起一段时间,调度器可以将CPU时间分配给其他任务,这样有效地提高了系统资源的利用率。

    void vTaskDelay(const TickType_t xTicksToDelay) {
        // 函数内部会根据节拍计数器进行任务的延时
    }
    
    特点
  • 系统友好:利用调度器进行任务管理,节省CPU时间。
  • 时间准确:基于系统节拍(tick)进行延时。
  • 依赖操作系统:只能在FreeRTOS等操作系统环境下使用。
  • 实例比较

    假设我们有一个需要每秒闪烁一次LED的任务,我们可以通过delayvTaskDelay来实现。

    使用delay

    void blinkLED() {
        while (1) {
            toggleLED();
            delay(1000); // 毫秒延时
        }
    }
    

    使用vTaskDelay

    void blinkLED(void *pvParameters) {
        for (;;) {
            toggleLED();
            vTaskDelay(pdMS_TO_TICKS(1000)); // Tick延时
        }
    }
    

    vTaskDelayUntil的使用

            除了vTaskDelay,FreeRTOS还提供了vTaskDelayUntil,用于使任务在指定的周期性时间到达时恢复执行。这种方法适用于需要精确定时任务,例如定期采集数据。

    void vTaskDelayUntil(TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement);
    

    示例

    void periodicTask(void *pvParameters) {
        TickType_t xLastWakeTime = xTaskGetTickCount();
        const TickType_t xFrequency = pdMS_TO_TICKS(1000); // 每秒
    
        for (;;) {
            // 执行任务
            vTaskDelayUntil(&xLastWakeTime, xFrequency);
        }
    }
    
  • delay:通过忙等待实现,适用于裸机系统或非常简单的任务调度场景。
  • vTaskDelay:通过调度器实现任务延时,适用于多任务环境,提高系统资源利用效率。
  •         在FreeRTOS中,delayvTaskDelay的主要区别在于实现方式和应用场景:选择哪种延时方式取决于具体应用需求和系统设计。对于实时性要求较高的嵌入式系统,vTaskDelay通常是更优的选择,因为它能有效管理任务调度,提升系统性能。

    作者:给生活加糖!

    物联沃分享整理
    物联沃-IOTWORD物联网 » FreeRTOS中delay与vTaskDelay的区别详解

    发表回复