فهرست منبع

esp_timer: Fix set_alarm. Case when timestamp < now_time

arg1 = MAX(int64_t arg1, uint64_t arg2) gave the wrong result, if arg1 < 0, it was presented as a larger value.
And ALARM_REG = (uin32_t)arg1. This leads to an infinite loop.
Fixed: both args are int64_t.

Closes: WIFI-1511
KonstantinKondrashov 6 سال پیش
والد
کامیت
8e54ee3f16
1فایلهای تغییر یافته به همراه2 افزوده شده و 2 حذف شده
  1. 2 2
      components/esp32/esp_timer_esp32.c

+ 2 - 2
components/esp32/esp_timer_esp32.c

@@ -216,7 +216,7 @@ void IRAM_ATTR esp_timer_impl_set_alarm(uint64_t timestamp)
     // Note that if by the time we update ALARM_REG, COUNT_REG value is higher,
     // interrupt will not happen for another ALARM_OVERFLOW_VAL timer ticks,
     // so need to check if alarm value is too close in the future (e.g. <2 us away).
-    const uint32_t offset = s_timer_ticks_per_us * 2;
+    const int32_t offset = s_timer_ticks_per_us * 2;
     do {
         // Adjust current time if overflow has happened
         if (timer_overflow_happened()) {
@@ -224,7 +224,7 @@ void IRAM_ATTR esp_timer_impl_set_alarm(uint64_t timestamp)
             s_time_base_us += s_timer_us_per_overflow;
         }
         s_mask_overflow = false;
-        uint64_t cur_count = REG_READ(FRC_TIMER_COUNT_REG(1));
+        int64_t cur_count = REG_READ(FRC_TIMER_COUNT_REG(1));
         // Alarm time relative to the moment when counter was 0
         int64_t time_after_timebase_us = (int64_t)timestamp - s_time_base_us;
         // Calculate desired timer compare value (may exceed 2^32-1)