From 8b86d448678ca433b6c413d3adc815faccc782c0 Mon Sep 17 00:00:00 2001 From: ccli8 Date: Mon, 23 Oct 2017 15:28:17 +0800 Subject: [PATCH] [M487] Fix premature lp_ticker interrupt Old lp_ticker handles past event, but it has a bug with premature go-off. The bug can re-produce on mbed-os-tests-mbed_drivers-lp_timeout/mbed-os-tests-mbed_hal-lp_us_tickers (mbed-os commit: 9c1fd485299861c65e0c0e477dc111bebe40ae5c). Because upper layer (mbed-os/hal/mbed_ticker_api.c) has handled past event, this code can be removed from lp_ticker. The similar fix also applies to us_ticker. --- targets/TARGET_NUVOTON/TARGET_M480/lp_ticker.c | 18 +++++------------- targets/TARGET_NUVOTON/TARGET_M480/us_ticker.c | 15 ++++----------- 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M480/lp_ticker.c b/targets/TARGET_NUVOTON/TARGET_M480/lp_ticker.c index 6e07e785fa..11af882deb 100644 --- a/targets/TARGET_NUVOTON/TARGET_M480/lp_ticker.c +++ b/targets/TARGET_NUVOTON/TARGET_M480/lp_ticker.c @@ -144,21 +144,13 @@ timestamp_t lp_ticker_read() void lp_ticker_set_interrupt(timestamp_t timestamp) { - uint32_t now = lp_ticker_read(); + uint32_t delta = timestamp - lp_ticker_read(); wakeup_tick = timestamp; - + TIMER_Stop((TIMER_T *) NU_MODBASE(timer3_modinit.modname)); - - int delta = (int) (timestamp - now); - if (delta > 0) { - cd_major_minor_clks = (uint64_t) delta * US_PER_TICK * TMR3_CLK_PER_SEC / US_PER_SEC; - lp_ticker_arm_cd(); - } else { - // NOTE: With lp_ticker_fire_interrupt() introduced, upper layer would handle past event case. - // This code fragment gets redundant, but it is still kept here for backward-compatible. - void lp_ticker_fire_interrupt(void); - lp_ticker_fire_interrupt(); - } + + cd_major_minor_clks = (uint64_t) delta * US_PER_TICK * TMR3_CLK_PER_SEC / US_PER_SEC; + lp_ticker_arm_cd(); } void lp_ticker_fire_interrupt(void) diff --git a/targets/TARGET_NUVOTON/TARGET_M480/us_ticker.c b/targets/TARGET_NUVOTON/TARGET_M480/us_ticker.c index 6665c3cfa4..cdf0a06e61 100644 --- a/targets/TARGET_NUVOTON/TARGET_M480/us_ticker.c +++ b/targets/TARGET_NUVOTON/TARGET_M480/us_ticker.c @@ -146,17 +146,10 @@ void us_ticker_clear_interrupt(void) void us_ticker_set_interrupt(timestamp_t timestamp) { TIMER_Stop((TIMER_T *) NU_MODBASE(timer1hires_modinit.modname)); - - int delta = (int) (timestamp - us_ticker_read()); - if (delta > 0) { - cd_major_minor_us = delta * US_PER_TICK; - us_ticker_arm_cd(); - } else { - // NOTE: With us_ticker_fire_interrupt() introduced, upper layer would handle past event case. - // This code fragment gets redundant, but it is still kept here for backward-compatible. - void us_ticker_fire_interrupt(void); - us_ticker_fire_interrupt(); - } + + uint32_t delta = timestamp - us_ticker_read(); + cd_major_minor_us = delta * US_PER_TICK; + us_ticker_arm_cd(); } void us_ticker_fire_interrupt(void)