Hello,

i'm facing an issue regarding xtimer_usleep. This issue is not the same as
before which was preventing my task from waking up.
Here, my task stays awake but is stuck in a while loop that triggers my
watchdog.
Indeed, i found in this function : xtimer_spin_until(uint32_t target), that
i can stay permanently blocked in the first "while" :

xtimer_core.c :

*static inline void xtimer_spin_until(uint32_t target) {*
*#if XTIMER_MASK*
*    target = _xtimer_lltimer_mask(target);*
*#endif*
*    while (_xtimer_lltimer_now() > target);*
*    while (_xtimer_lltimer_now() < target);*
*}*

By using GDB, i found that target was equal to 6 (or very small), so the
probability of the condition being false in order to get out of the loop is
very small and i stay blocked because each time the CPU evaluates the timer
counter, it has already overshoot the target value. I can easily reproduce
this issue by calling xtimer_usleep with very small values but i suppose it
is also likely it can occur with any kind of values.

Am i doing something wrong ? Is my analysis correct ? If yes, i don't know
how to solve this issue.

Here is my configuration :

*periph_conf.h :*

#define CLOCK_HSI           (16000000U)         /* internal oscillator */
#define CLOCK_CORECLOCK     (16000000U)         /* desired core clock
frequency */

/* configuration of PLL prescaler and multiply values */
/* CORECLOCK := HSI / CLOCK_PLL_DIV * CLOCK_PLL_MUL */
#define CLOCK_PLL_DIV       RCC_CFGR_PLLDIV4
#define CLOCK_PLL_MUL       RCC_CFGR_PLLMUL4
/* configuration of peripheral bus clock prescalers */
#define CLOCK_AHB_DIV       RCC_CFGR_HPRE_DIV8       /* AHB clock -> 2MHz */
#define CLOCK_APB2_DIV      RCC_CFGR_PPRE2_DIV1      /* APB2 clock -> 2MHz
*/
#define CLOCK_APB1_DIV      RCC_CFGR_PPRE1_DIV1      /* APB1 clock -> 2MHz
*/
/* configuration of flash access cycles */
#define CLOCK_FLASH_LATENCY FLASH_ACR_LATENCY

/* bus clocks for simplified peripheral initialization, UPDATE MANUALLY! */
#define CLOCK_AHB           (CLOCK_CORECLOCK / 8)
#define CLOCK_APB2          (CLOCK_CORECLOCK / 8)
#define CLOCK_APB1          (CLOCK_CORECLOCK / 8)

board.h :

*#define XTIMER_DEV          TIMER_DEV(0)*
*#define XTIMER_CHAN         (0)*
*#define XTIMER_WIDTH        (16)*

*#define XTIMER_BACKOFF      (100)*
*#define XTIMER_ISR_BACKOFF  (100)*
*#define XTIMER_OVERHEAD     (100)*

Thank you in advance for your help ;)

Regards,

-- 

*Aurélien FILLAU*

Co-founder at we-sens.com
_______________________________________________
users mailing list
[email protected]
https://lists.riot-os.org/mailman/listinfo/users

Reply via email to