Skip to content

Low power ticker wrapper layer still used when suspended #8278

Closed
@fkjagodzinski

Description

@fkjagodzinski

Description

The LowPowerTickerWrapper class is still used to handle lp ticker overflows even after it has been disabled with a call to lp_ticker_wrapper_suspend().

* Suspend the wrapper layer code
*
* Pass through all interrupts to the low power ticker and stop using
* the microsecond ticker.
*/
void lp_ticker_wrapper_suspend(void);

As a result, the us ticker which is used internally by the wrapper, periodically locks deepsleep sleep mode.

Targets

NUCLEO_F746ZG

Mbed OS SHA

b1b6399 -- current master

Steps to reproduce

Check out 76fc292 (fkjagodzinski@76fc292) and use a logic analyser to capture data from D0, D1, D2 & D3.

lp_ticker_wrapper_suspend

lp_ticker_wrapper_suspend-closeup

lp_ticker_wrapper-logic_dump.zip


The high level result of this issue can be seen here:

#include "mbed.h"
#include "mbed_lp_ticker_wrapper.h"

#define SLEEP_DURATION_US 100000ULL
#define SERIAL_FLUSH_TIME_MS 20

void wakeup_callback(volatile int *wakeup_flag)
{
    (*wakeup_flag)++;
}

int main()
{
    // Suspend the RTOS kernel scheduler to prevent interference with duration of sleep.
    osKernelSuspend();
    // Suspend the low power ticker wrapper to prevent interference with deep sleep lock.
    lp_ticker_wrapper_suspend();

    volatile int wakeup_flag;
    LowPowerTimeout lp_timeout;

    bool deepsleep_status1 = sleep_manager_can_deep_sleep();
    sleep_manager_lock_deep_sleep();
    bool deepsleep_status2 = sleep_manager_can_deep_sleep();

    wakeup_flag = 0;
    lp_timeout.attach_us(mbed::callback(wakeup_callback, &wakeup_flag), SLEEP_DURATION_US);

    while (wakeup_flag == 0) {
        sleep_manager_sleep_auto();
    }

    bool deepsleep_status3 = sleep_manager_can_deep_sleep();
    sleep_manager_unlock_deep_sleep();
    bool deepsleep_status4 = sleep_manager_can_deep_sleep();

    printf("------------------------------------------------------------\r\n");
    printf("deepsleep_status1 = %i, %i expected\r\n", deepsleep_status1, 1);
    printf("deepsleep_status2 = %i, %i expected\r\n", deepsleep_status2, 0);
    printf("deepsleep_status3 = %i, %i expected\r\n", deepsleep_status3, 0);
    printf("deepsleep_status4 = %i, %i expected\r\n", deepsleep_status4, 1);
    printf("\r\n");
    wait_ms(SERIAL_FLUSH_TIME_MS);
}
mbed compile -t GCC_ARM -m NUCLEO_F746ZG -f --sterm

Output:

------------------------------------------------------------
deepsleep_status1 = 1, 1 expected
deepsleep_status2 = 0, 0 expected
deepsleep_status3 = 0, 0 expected
deepsleep_status4 = 0, 1 expected

Issue request type

[ ] Question
[ ] Enhancement
[x] Bug

CC @c1728p9 @mprse @jamesbeyond

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions