时间获取和校准
引言
此部分已在 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 内部不同时钟源的精度并不存在明显差异。