Jelajahi Sumber

fix #72 address overflow with board_delay

hathach 6 tahun lalu
induk
melakukan
73c7db38f7
1 mengubah file dengan 16 tambahan dan 2 penghapusan
  1. 16 2
      hw/bsp/board.h

+ 16 - 2
hw/bsp/board.h

@@ -97,8 +97,22 @@ static inline void board_led_off(void)
 
 static inline void board_delay(uint32_t ms)
 {
-  uint32_t start_ms = board_millis();
-  while( board_millis() < start_ms + ms) {}
+  if ( ms == 0 ) return;
+
+  uint64_t end_ms = (uint64_t) board_millis();
+  end_ms += ms;
+
+  // about to overflows
+  if (end_ms > UINT32_MAX)
+  {
+    // first wait for overflow occurs since "ms" is small enough
+    while( board_millis() > ms ) {}
+
+    // then adjust end time
+    end_ms -= UINT32_MAX;
+  }
+
+  while( board_millis() < end_ms ) {}
 }
 
 static inline int8_t board_uart_getchar(void)