Skip to content

LowPowerTicker: Inconsistent callback calls when using multiple ticker objects #5185

Closed
@maciejbocianski

Description

@maciejbocianski

Description


Bug

Target
K64F

Toolchain:
GCC_ARM|ARM|IAR

Toolchain version:
GCC_ARM -- 6.3.1,
ARM -- 5.24 (Flex) ARM Compiler 5.06 update 5 (build 528),
IAR -- ANSI C/C++ Compiler V7.80.4.12462/W32 for ARM

mbed-os sha:
c6f655c

Expected behavior
All callbacks fired 23 times in 100 ms intervals

Actual behavior
Not all callbacks fired 23 times
Some callbacks fired in time start + 2s

Code


#define TICKER_COUNT 16

volatile bool ticker_callback_flag;
volatile uint32_t multi_counter;

struct CalbackStruct
{
    uint32_t time;
    uint32_t lp_time;
    uint32_t fired;
    void (*fun)(void);
    LowPowerTicker *ticker;
};

template <uint32_t id>
void wait_callback_multi(void);

volatile CalbackStruct callbacks[TICKER_COUNT] =
{
    { 0, 0, 0, wait_callback_multi<0>, NULL },
    { 0, 0, 0, wait_callback_multi<1>, NULL },
    { 0, 0, 0, wait_callback_multi<2>, NULL },
    { 0, 0, 0, wait_callback_multi<3>, NULL },
    { 0, 0, 0, wait_callback_multi<4>, NULL },
    { 0, 0, 0, wait_callback_multi<5>, NULL },
    { 0, 0, 0, wait_callback_multi<6>, NULL },
    { 0, 0, 0, wait_callback_multi<7>, NULL },
    { 0, 0, 0, wait_callback_multi<8>, NULL },
    { 0, 0, 0, wait_callback_multi<9>, NULL },
    { 0, 0, 0, wait_callback_multi<10>, NULL },
    { 0, 0, 0, wait_callback_multi<11>, NULL },
    { 0, 0, 0, wait_callback_multi<12>, NULL },
    { 0, 0, 0, wait_callback_multi<13>, NULL },
    { 0, 0, 0, wait_callback_multi<14>, NULL },
    { 0, 0, 0, wait_callback_multi<15>, NULL }
};


template <uint32_t id>
void wait_callback_multi(void)
{
    if(!callbacks[id].fired) {
        callbacks[id].time = us_ticker_read();
        callbacks[id].lp_time = lp_ticker_read();
        //callbacks[id].ticker->detach();
    }
    callbacks[id].fired++;
    multi_counter++;
}



int main()
{
	LowPowerTicker ticker[TICKER_COUNT];

	uint32_t start = us_ticker_read();
	uint32_t lp_start = lp_ticker_read();
	multi_counter = 0;
	for (int i = 0; i < TICKER_COUNT; i++) {
		callbacks[i].ticker = &ticker[i];
		ticker[i].attach_us(callback(callbacks[i].fun), 100 * 1000);
	}

	wait_us(2350*1000);
	for (int i = 0; i < TICKER_COUNT; i++) {
		ticker[i].detach();
	}
	printf("start time: %u lp_time: %u\r\n", start, lp_start);
	printf("ID|FIRED|TIME|LPTIME\r\n");
	for (int i = 0; i < TICKER_COUNT; i++) {
		printf("%2i %5u %10u %10u\r\n", i, callbacks[i].fired, callbacks[i].time, callbacks[i].lp_time);
	}
    printf("multi_counter: %d\r\n", multi_counter);
    printf("\r\n");
    printf("*******************************************************************************\r\n");
    printf("\r\n");
}
start time: 0 lp_time: 2242955688
ID|FIRED|TIME|LPTIME
 0    22      99996 2243055694    // OK
 1    22     100010 2243055694    // OK
 2    22     100030 2243055725    // OK
 3    21    2099732 2245055755    // ????
 4    23    2099742 2245055755
 5    23    2099751 2245055786
 6    23    2099761 2245055786
 7    23    2099770 2245055786
 8    23    2099780 2245055816
 9    23    2099789 2245055816
10    23    2099799 2245055816
11    23    2099808 2245055816
12    23    2099818 2245055847
13    23    2099827 2245055847
14    23    2099837 2245055847
15    23    2099846 2245055877
multi_counter: 363

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions