Closed
Description
Description
- Type: Bug
- Related issue: LowPowerTimeout: Inconsistent delay when using multilple timeout objects #5150
- Priority: Major
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