void vtimer_callback(void *ptr) { DEBUG("vtimer_callback ptr=%p\n", ptr); (void) ptr; in_callback = true; hwtimer_id = -1; /* get the vtimer that fired */ vtimer_t *timer = node_get_timer(priority_queue_remove_head(&shortterm_priority_queue_root)); if (timer) { #if ENABLE_DEBUG vtimer_print(timer); #endif DEBUG("vtimer_callback(): Shooting %" PRIu32 ".\n", timer->absolute.microseconds); /* shoot timer */ timer->action(timer); } else { DEBUG("vtimer_callback(): spurious call.\n"); } in_callback = false; update_shortterm(); }
void vtimer_callback(void *ptr) { vtimer_t *timer; in_callback = true; hwtimer_id = -1; timer = (vtimer_t *)queue_remove_head(&shortterm_queue_root); #ifdef ENABLE_DEBUG vtimer_print(timer); #endif DEBUG("vtimer_callback(): Shooting %lu.\n", timer->absolute.microseconds); /* shoot timer */ if (timer->action == (void*) msg_send_int) { msg_t msg; msg.type = MSG_TIMER; msg.content.value = (unsigned int) timer->arg; msg_send_int(&msg, timer->pid); } else { timer->action(timer->arg); } in_callback = false; update_shortterm(); }
int vtimer_remove(vtimer_t *t){ queue_remove(&shortterm_queue_root, (queue_node_t*)t); queue_remove(&longterm_queue_root, (queue_node_t*)t); update_shortterm(); if (! inISR() ) eINT(); return 0; }
void vtimer_remove(vtimer_t *t) { unsigned irq_state = disableIRQ(); priority_queue_remove(&shortterm_priority_queue_root, timer_get_node(t)); priority_queue_remove(&longterm_priority_queue_root, timer_get_node(t)); update_shortterm(); restoreIRQ(irq_state); }
int vtimer_remove(vtimer_t *t) { unsigned int irq_state = disableIRQ(); queue_remove(&shortterm_queue_root, (queue_node_t *)t); queue_remove(&longterm_queue_root, (queue_node_t *)t); update_shortterm(); restoreIRQ(irq_state); return 0; }
int vtimer_init() { DEBUG("vtimer_init().\n"); int state = disableIRQ(); seconds = 0; longterm_tick_timer.action = vtimer_tick; longterm_tick_timer.arg = NULL; longterm_tick_timer.absolute.seconds = 0; longterm_tick_timer.absolute.microseconds = MICROSECONDS_PER_TICK; DEBUG("vtimer_init(): Setting longterm tick to %lu\n", longterm_tick_timer.absolute.microseconds); set_shortterm(&longterm_tick_timer); update_shortterm(); restoreIRQ(state); return 0; }
static int vtimer_set(vtimer_t *timer) { DEBUG("vtimer_set(): New timer. Offset: %" PRIu32 " %" PRIu32 "\n", timer->absolute.seconds, timer->absolute.microseconds); timex_t now; vtimer_now(&now); timer->absolute = timex_add(now, timer->absolute); normalize_to_tick(&(timer->absolute)); DEBUG("vtimer_set(): Absolute: %" PRIu32 " %" PRIu32 "\n", timer->absolute.seconds, timer->absolute.microseconds); DEBUG("vtimer_set(): NOW: %" PRIu32 " %" PRIu32 "\n", now.seconds, now.microseconds); int result = 0; if (timer->absolute.seconds == 0) { if (timer->absolute.microseconds > 10) { timer->absolute.microseconds -= 10; } } unsigned state = disableIRQ(); if (timer->absolute.seconds != longterm_tick_timer.absolute.seconds) { /* we're long-term */ DEBUG("vtimer_set(): setting long_term\n"); result = set_longterm(timer); } else { DEBUG("vtimer_set(): setting short_term\n"); if (set_shortterm(timer)) { /* delay update of next shortterm timer if we * are called from within vtimer_callback. */ if (!in_callback) { result = update_shortterm(); } } } restoreIRQ(state); return result; }
void vtimer_init(void) { DEBUG("vtimer_init().\n"); unsigned state = disableIRQ(); longterm_tick_start = 0; longterm_tick_timer.action = vtimer_callback_tick; longterm_tick_timer.arg = NULL; longterm_tick_timer.absolute.seconds = 0; longterm_tick_timer.absolute.microseconds = MICROSECONDS_PER_TICK; DEBUG("vtimer_init(): Setting longterm tick to %" PRIu32 "\n", longterm_tick_timer.absolute.microseconds); set_shortterm(&longterm_tick_timer); update_shortterm(); restoreIRQ(state); }
void vtimer_tick(void *ptr) { DEBUG("vtimer_tick()."); seconds += SECONDS_PER_TICK; longterm_tick_start = longterm_tick_timer.absolute.microseconds; longterm_tick_timer.absolute.microseconds = longterm_tick_timer.absolute.microseconds + MICROSECONDS_PER_TICK; set_shortterm(&longterm_tick_timer); while (longterm_queue_root.next) { vtimer_t *timer = (vtimer_t*) longterm_queue_root.next; if (timer->absolute.seconds == seconds) { timer = (vtimer_t*) queue_remove_head(&longterm_queue_root); set_shortterm(timer); } else { break; } } update_shortterm(); }