时间获取和校准

[English]

引言

此部分已在 ESP-IDF 编程指南的 系统时间 有系统叙述,此文档仅做补充总结。

常用时间获取接口

  • esp_timer_get_time
    • 获取自 esp_timer 初始化后的时间,单位为 μs

    • 在 ESP 芯片休眠时使用 RTC 代替计时,退出休眠后通过 RTC 进行时间补偿

  • esp_rtc_get_time_us
    • 获取 RTC 计算器(RTC_SLOW_CLK )的时间,单位为 μs

  • esp_cpu_get_cycle_count
    • 先获取 CPU 循环计数值,再通过除以 esp_rom_get_cpu_ticks_per_us() 对应的结果可得到对应时间,单位为 μs

  • gettimeofday
    • 使用 esp_timer 作为时钟源,单位为 μs

    • 在 ESP 芯片休眠时使用 RTC 代替计时,退出休眠后通过 RTC 进行时间补偿

  • xTaskGetTickCount
    • 获取 FreeRTOS Tick 计数值,单位为 Tick

以下是一些经验总结:

  • 要获取当前时间,推荐使用 POSIX 函数 gettimeofday,不过此函数开销略高

  • 使用 esp_timer_get_time 可以生成微秒级精度的时间戳,但每次调用计时函数都会产生适量开销

  • 对运行时间不到 1-2 ms 的小代码段进行测量时,可能因为函数在 flash 中,导致计时测量出现较大差异。将该代码移到 IRAM 中可以解决这个问题

  • 使用 GPIO 快速翻转,通过逻辑分析仪能观察非常小的代码执行时间

RC 时钟校准

RTC 时钟源有多种,但是只有外置 32K 时钟可以提供精度较高的时钟,其他的 RC 时钟精度较低,在长时间运行后会累积较多误差。RTC 内部不同时钟源的精度并不存在明显差异。