/* 时钟的 ESP-IDF 实现。 */ #include "esp_timer.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "hal_time.h" uint64_t hal_time_now_us(void) { return (uint64_t)esp_timer_get_time(); } uint32_t hal_time_now_ms(void) { return (uint32_t)(hal_time_now_us() / 1000u); } uint32_t hal_time_elapsed_ms(uint32_t since_ms) { return hal_time_now_ms() - since_ms; /* 无符号减法,49.7 天回绕自然正确 */ } void hal_time_delay_ms(uint32_t ms) { if (ms == 0) { return; } /* 至少睡一个 tick:pdMS_TO_TICKS(1) 在 100 Hz tick 下会算成 0, 那样就变成忙等而不是让出 CPU。 */ TickType_t ticks = pdMS_TO_TICKS(ms); vTaskDelay(ticks != 0 ? ticks : 1); }