int xtimer_remove(xtimer_t *timer) { if (!_is_set(timer)) { return 0; } unsigned state = disableIRQ(); int res = 0; if (timer_list_head == timer) { uint32_t next; timer_list_head = timer->next; if (timer_list_head) { /* schedule callback on next timer target time */ next = timer_list_head->target - XTIMER_OVERHEAD; } else { next = _mask(0xFFFFFFFF); } _lltimer_set(next); } else { res = _remove_timer_from_list(&timer_list_head, timer) || _remove_timer_from_list(&overflow_list_head, timer) || _remove_timer_from_list(&long_list_head, timer); } timer->target = 0; timer->long_target = 0; restoreIRQ(state); return res; }
void _xtimer_set64(xtimer_t *timer, uint32_t offset, uint32_t long_offset) { DEBUG(" _xtimer_set64() offset=%" PRIu32 " long_offset=%" PRIu32 "\n", offset, long_offset); if (!long_offset) { /* timer fits into the short timer */ xtimer_set(timer, (uint32_t) offset); } else { int state = irq_disable(); if (_is_set(timer)) { _remove(timer); } _xtimer_now64(&timer->target, &timer->long_target); timer->target += offset; timer->long_target += long_offset; if (timer->target < offset) { timer->long_target++; } _add_timer_to_long_list(&long_list_head, timer); irq_restore(state); DEBUG("xtimer_set64(): added longterm timer (long_target=%" PRIu32 " target=%" PRIu32 ")\n", timer->long_target, timer->target); } }
void xtimer_remove(xtimer_t *timer) { int state = irq_disable(); if (_is_set(timer)) { _remove(timer); } irq_restore(state); }
int _xtimer_set_absolute(xtimer_t *timer, uint32_t target) { uint32_t now = xtimer_now(); int res = 0; DEBUG("timer_set_absolute(): now=%" PRIu32 " target=%" PRIu32 "\n", now, target); timer->next = NULL; if ((target >= now) && ((target - XTIMER_BACKOFF) < now)) { /* backoff */ xtimer_spin_until(target + XTIMER_BACKOFF); _shoot(timer); return 0; } unsigned state = irq_disable(); if (_is_set(timer)) { _remove(timer); } timer->target = target; timer->long_target = _long_cnt; if (target < now) { timer->long_target++; } if ( (timer->long_target > _long_cnt) || !_this_high_period(target) ) { DEBUG("xtimer_set_absolute(): the timer doesn't fit into the low-level timer's mask.\n"); _add_timer_to_long_list(&long_list_head, timer); } else { if (_xtimer_lltimer_mask(now) >= target) { DEBUG("xtimer_set_absolute(): the timer will expire in the next timer period\n"); _add_timer_to_list(&overflow_list_head, timer); } else { DEBUG("timer_set_absolute(): timer will expire in this timer period.\n"); _add_timer_to_list(&timer_list_head, timer); if (timer_list_head == timer) { DEBUG("timer_set_absolute(): timer is new list head. updating lltimer.\n"); _lltimer_set(target - XTIMER_OVERHEAD); } } } irq_restore(state); return res; }