diff --git a/src/rp2_common/pico_time_adapter/include/pico/time_adapter.h b/src/rp2_common/pico_time_adapter/include/pico/time_adapter.h index bc9caf1ad..639e91498 100644 --- a/src/rp2_common/pico_time_adapter/include/pico/time_adapter.h +++ b/src/rp2_common/pico_time_adapter/include/pico/time_adapter.h @@ -55,9 +55,9 @@ static inline void ta_set_timeout(alarm_pool_timer_t *timer, uint alarm_num, int } static inline bool ta_wakes_up_on_or_before(alarm_pool_timer_t *timer, uint alarm_num, int64_t target) { - uint32_t current = timer_time_us_32(timer_hw_from_timer(timer)); - uint32_t time_til_target = (uint32_t) target - current; - uint32_t time_til_alarm = timer_hw_from_timer(timer)->alarm[alarm_num] - current; + int64_t current = (int64_t)timer_time_us_64(timer_hw_from_timer(timer)); + int64_t time_til_target = target - current; + uint32_t time_til_alarm = timer_hw_from_timer(timer)->alarm[alarm_num] - (uint32_t)current; return time_til_alarm <= time_til_target; } diff --git a/test/pico_time_test/pico_time_test.c b/test/pico_time_test/pico_time_test.c index 8092abbef..5ce013df5 100644 --- a/test/pico_time_test/pico_time_test.c +++ b/test/pico_time_test/pico_time_test.c @@ -76,6 +76,7 @@ int issue_195_test(void); int issue_1812_test(void); int issue_1953_test(void); int issue_2118_test(void); +int issue_2186_test(void); int main() { setup_default_uart(); @@ -250,6 +251,8 @@ int main() { issue_2118_test(); + issue_2186_test(); + PICOTEST_END_TEST(); } @@ -311,8 +314,8 @@ int issue_1953_test(void) { repeating_timer_t timer1; repeating_timer_t timer2; - assert(add_repeating_timer_us(10, timer_callback_issue_1953, NULL, &timer1)); - assert(add_repeating_timer_us(100, timer_callback_issue_1953, NULL, &timer2)); + hard_assert(add_repeating_timer_us(10, timer_callback_issue_1953, NULL, &timer1)); + hard_assert(add_repeating_timer_us(100, timer_callback_issue_1953, NULL, &timer2)); int iterations = 0; while(iterations < 100) { @@ -364,3 +367,13 @@ int issue_2118_test(void) { PICOTEST_END_SECTION(); return 0; } + +int issue_2186_test(void) { + PICOTEST_START_SECTION("Issue #2186 defect - ta_wakes_up_on_or_before"); + + hard_assert(best_effort_wfe_or_timeout(get_absolute_time() - 1)); + hard_assert(best_effort_wfe_or_timeout(get_absolute_time() - 1)); // this will lockup without the fix - wfe which never happens + + PICOTEST_END_SECTION(); + return 0; +}