X-Git-Url: http://git.droids-corp.org/?p=aversive.git;a=blobdiff_plain;f=modules%2Fbase%2Fscheduler%2Fscheduler_interrupt.c;h=000988368d8adeb2d6c39abacd60e38cd26d421b;hp=15b94090a9a36653ad852758851005961f5fda25;hb=92b0749bee9fba8b5105590bf2c2f15786c55cee;hpb=ccc6954bb046671b9e28c5806db5121c1eef49c0 diff --git a/modules/base/scheduler/scheduler_interrupt.c b/modules/base/scheduler/scheduler_interrupt.c index 15b9409..0009883 100644 --- a/modules/base/scheduler/scheduler_interrupt.c +++ b/modules/base/scheduler/scheduler_interrupt.c @@ -1,6 +1,6 @@ -/* +/* * Copyright Droids Corporation, Microb Technology, Eirbot (2005) - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -31,7 +31,7 @@ static volatile uint8_t priority_running=0; /** number of imbricated scheduler interruptions */ static volatile uint8_t nb_stacking=0; - + uint8_t scheduler_disable_save(void) { uint8_t ret; @@ -45,13 +45,13 @@ void scheduler_enable_restore(uint8_t old_prio) priority_running = old_prio; } -/** +/** * this function is called from a timer interruption. If an event has * to be scheduled, it will execute the fonction (IRQ are allowed * during the execution of the function). This interruption can be * interrupted by itself too, in this case only events with a higher * priority can be scheduled. - * + * * We assume that this function is called from a SIGNAL(), with * global interrupt flag disabled --> that's why we can use cli() and * sei() instead of IRQ_LOCK(flags). @@ -69,7 +69,7 @@ scheduler_interrupt(void) SCHED_INC_STAT(max_stacking); return; } - + nb_stacking ++; sei(); @@ -104,13 +104,13 @@ scheduler_interrupt(void) /* decrement current time (we know it is >0 if it is * in SCHEDULER_EVENT_ACTIVE state */ g_tab_event[i].current_time --; - + /* don't need to schedule now */ if ( g_tab_event[i].current_time != 0 ) { sei(); continue; } - + /* time to schedule, but priority is too low, * delay it */ if (g_tab_event[i].priority <= priority_running) { @@ -125,6 +125,7 @@ scheduler_interrupt(void) /* schedule it */ g_tab_event[i].state = SCHEDULER_EVENT_SCHEDULED; + SCHED_INC_STAT2(task_scheduled, i); sei(); /* insert it in the list (list is ordered). @@ -147,7 +148,7 @@ scheduler_interrupt(void) /* harder : find the good place in list */ SLIST_FOREACH(e, &event_list, next) { next_e = SLIST_NEXT(e, next); - if (next_e == NULL || + if (next_e == NULL || g_tab_event[i].priority >= next_e->priority) { SLIST_INSERT_AFTER(e, &g_tab_event[i], next); break; @@ -185,7 +186,7 @@ scheduler_interrupt(void) if (e->state == SCHEDULER_EVENT_DELETING) { e->state = SCHEDULER_EVENT_FREE; } - + /* end of schedule, mark it as active */ if (e->state == SCHEDULER_EVENT_SCHEDULED) { e->state = SCHEDULER_EVENT_ACTIVE;