定时器
ESP 定时器分类
- 定时器
- 系统定时器
esp_timer
FreeRTOS Tick
- 通用定时器
独立硬件定时器
以下会一一介绍各类 ESP 定时器。
esp_timer
由于 ESP-IDF 编程指南里已存在 esp_timer 文档,故在此仅做一些额外补充。
esp_timer 的特点如下:
时钟源为 XTAL_CLK
支持从 light-sleep 唤醒后,系统定时器通过软件加载 RTC 定时器记录的睡眠时间来进行时间补偿
以 ESP32 为例,ESP32 往往使用 240 MHz 的 CPU 频率运行并使用任务分发法决定 esp_timer 的最小周期,此时一次性定时器配置的超时值需要大于 20 μs,周期性定时器的超时值需要大于 50 μs
esp_timer 的回调有以下两类:
任务分发法(默认):从单个高优先级 esp_timer 任务中分发定时器回调函数,此方法适用于对时序要求不高的定时器回调函数
中断分发法:直接从中断处理程序分发定时器回调函数,此方法适用运行时间仅为几 μs 的简单、低延迟的定时器回调函数。优点是能确保事件和执行回调间的延迟较短,且不受其他任务影响。
配置为中断分发法的方式为:在 menuconfig 里使能 CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD。
GPTimer
由于 ESP-IDF 编程指南里已存在 GPTimer 文档,故在此仅做一些额外补充。
GPTimer 的特点如下:
时钟源为 XTAL_CLK && APB_CLK
基于定时器组外设实现
应用独享硬件资源,不易受到其他模块干扰
功能更多,可以跟其他外设通过 ETM 联动(仅 ESP32-C6 等新芯片支持)
FreeRTOS Timer
由于 ESP-IDF 编程指南里已存在 FreeRTOS Timer API 说明,故在此仅做一些额外补充。
FreeRTOS Timer 的特点如下:
时钟源为 FreeRTOS Tick
纯软件定时器
使用一个低优先级的定时器 task(优先级可通过 CONFIG_FREERTOS_TIMER_TASK_PRIORITY 选项 配置),最大分辨率为 FreeRTOS Tick 周期
不同时钟对比
时钟 |
优点 |
缺点 |
---|---|---|
esp_timer |
|
系统也在使用,应用层存在阻塞时会影响系统 |
GPTimer |
|
使用不方便 |
FreeRTOS Timer |
使用简单,不影响系统 |
|