Skip to content
Snippets Groups Projects
Commit 5357dad5 authored by Damien George's avatar Damien George
Browse files

esp8266: Fix ticks_ms to correctly handle wraparound of system counter.

Fixes issue #4795.
parent c4a6d9c6
No related branches found
No related tags found
No related merge requests found
...@@ -120,7 +120,9 @@ void mp_hal_debug_tx_strn_cooked(void *env, const char *str, uint32_t len) { ...@@ -120,7 +120,9 @@ void mp_hal_debug_tx_strn_cooked(void *env, const char *str, uint32_t len) {
} }
uint32_t mp_hal_ticks_ms(void) { uint32_t mp_hal_ticks_ms(void) {
return ((uint64_t)system_time_high_word << 32 | (uint64_t)system_get_time()) / 1000; // Compute milliseconds from 64-bit microsecond counter
system_time_update();
return ((uint64_t)system_time_high_word << 32 | (uint64_t)system_time_low_word) / 1000;
} }
uint32_t mp_hal_ticks_us(void) { uint32_t mp_hal_ticks_us(void) {
......
...@@ -112,22 +112,27 @@ int ets_loop_iter_disable = 0; ...@@ -112,22 +112,27 @@ int ets_loop_iter_disable = 0;
int ets_loop_dont_feed_sw_wdt = 0; int ets_loop_dont_feed_sw_wdt = 0;
// to implement a 64-bit wide microsecond counter // to implement a 64-bit wide microsecond counter
static uint32_t system_time_prev = 0; uint32_t system_time_low_word = 0;
uint32_t system_time_high_word = 0; uint32_t system_time_high_word = 0;
bool ets_loop_iter(void) { void system_time_update(void) {
if (ets_loop_iter_disable) { // Handle overflow of system microsecond counter
return false;
}
// handle overflow of system microsecond counter
ets_intr_lock(); ets_intr_lock();
uint32_t system_time_cur = system_get_time(); uint32_t system_time_cur = system_get_time();
if (system_time_cur < system_time_prev) { if (system_time_cur < system_time_low_word) {
system_time_high_word += 1; // record overflow of low 32-bits system_time_high_word += 1; // record overflow of low 32-bits
} }
system_time_prev = system_time_cur; system_time_low_word = system_time_cur;
ets_intr_unlock(); ets_intr_unlock();
}
bool ets_loop_iter(void) {
if (ets_loop_iter_disable) {
return false;
}
// Update 64-bit microsecond counter
system_time_update();
// 6 words before pend_flag_noise_check is a variable that is used by // 6 words before pend_flag_noise_check is a variable that is used by
// the software WDT. A 1.6 second period timer will increment this // the software WDT. A 1.6 second period timer will increment this
......
...@@ -3,8 +3,10 @@ ...@@ -3,8 +3,10 @@
extern int ets_loop_iter_disable; extern int ets_loop_iter_disable;
extern int ets_loop_dont_feed_sw_wdt; extern int ets_loop_dont_feed_sw_wdt;
extern uint32_t system_time_low_word;
extern uint32_t system_time_high_word; extern uint32_t system_time_high_word;
void system_time_update(void);
bool ets_loop_iter(void); bool ets_loop_iter(void);
#endif // MICROPY_INCLUDED_ESP8266_ETS_ALT_TASK_H #endif // MICROPY_INCLUDED_ESP8266_ETS_ALT_TASK_H
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment