74,9 → 74,7 |
LEVEL loc_sched_level; /* Local scheduler level */ |
|
PID current; /* the task currently put in execution */ |
|
int flags; |
int overran; /* overran flag */ |
|
IQUEUE tasks; /* a FIFO queue for the tasks handled |
using the budget */ |
115,7 → 113,6 |
#endif |
|
b->dline_timer = NIL; |
b->overran = 0; |
|
/* we modify the deadline according to rule 4 ... */ |
/* there is a while because if the wcet is << than the system tick |
156,14 → 153,9 |
event_need_reschedule(); |
|
} |
} else |
if (b->current != NIL && b->avail > 0) { |
#ifdef CBSSTAR_DEBUG |
cbsstar_printf("#"); |
#endif |
} |
} |
|
if (b->flags == CBSSTAR_NOACTIVE && b->dline_timer != NIL) { |
if (b->flags == CBSSTAR_NOACTIVE) { |
kern_gettime(&b->dline); |
ADDUSEC2TIMESPEC(b->T, &b->dline); |
|
186,19 → 178,7 |
activating a new task or an old task... */ |
|
/* check 1: if the deadline is before than the actual scheduling time */ |
|
/* check 2: if ( avail_time >= (cbs_dline - acttime)* (wcet/period) ) |
(rule 7 in the CBS article!) */ |
TIME t; |
struct timespec t2,t3; |
|
t = (b->T * b->avail) / b->Q; |
t3.tv_sec = t / 1000000; |
t3.tv_nsec = (t % 1000000) * 1000; |
|
SUBTIMESPEC(&b->dline, acttime, &t2); |
if (/* 1 */ TIMESPEC_A_LT_B(&b->dline, acttime) || |
/* 2 */ TIMESPEC_A_GT_B(&t3, &t2) ) { |
if (TIMESPEC_A_LT_B(&b->dline, acttime)) { |
TIMESPEC_ASSIGN(&b->dline, acttime); |
ADDUSEC2TIMESPEC(b->T, &b->dline); |
} |
212,9 → 192,6 |
/* record the current task inserted in the master module */ |
b->current = p; |
|
/* reset overran flag */ |
b->overran = 0; |
|
job_task_default_model(job, b->dline); |
job_task_def_noexc(job); |
level_table[ lev->scheduling_level ]-> |
227,8 → 204,6 |
struct timespec ty; |
TIME tx; |
struct budget_struct *b = &lev->b[lev->tb[p]]; |
TIME t; |
struct timespec t2,t3, acttime; |
|
if (lev->cap_lev != NIL && b->current == p) { |
kern_event_delete(lev->cap_lev); |
235,30 → 210,18 |
lev->cap_lev = NIL; |
} |
|
kern_gettime(&acttime); |
|
t = (b->T * b->avail) / b->Q; |
t3.tv_sec = t / 1000000; |
t3.tv_nsec = (t % 1000000) * 1000; |
|
SUBTIMESPEC(&b->dline, &acttime, &t2); |
|
SUBTIMESPEC(&schedule_time, &cap_lasttime, &ty); |
tx = TIMESPEC2USEC(&ty); |
lev->b[lev->tb[p]].avail -= tx; |
b->avail -= tx; |
|
#ifdef CBSSTAR_DEBUG |
cbsstar_printf2("(CS:Cap p%d av=%d)", p, lev->b[lev->tb[p]].avail); |
kern_printf("(CS:Cap p%d av=%d)", p, b->avail); |
#endif |
|
if (lev->b[lev->tb[p]].avail <= 0 || TIMESPEC_A_GT_B(&t3, &t2)) { |
lev->b[lev->tb[p]].avail = 0; |
lev->b[lev->tb[p]].flags = CBSSTAR_NOACTIVE; |
} |
if (b->avail <= 0) b->flags = CBSSTAR_NOACTIVE; |
|
if (TIMESPEC_A_LT_B(&b->dline, &schedule_time)) { |
/* we modify the deadline ... */ |
b->overran = 1; |
TIMESPEC_ASSIGN(&b->dline, &schedule_time); |
ADDUSEC2TIMESPEC(b->T, &b->dline); |
} |
319,7 → 282,6 |
level_table[ lev->scheduling_level ]-> |
private_extract(lev->scheduling_level, p); |
/* we modify the deadline ... */ |
b->overran = 1; |
TIMESPEC_ASSIGN(&b->dline, &schedule_time); |
ADDUSEC2TIMESPEC(b->T, &b->dline); |
|
488,7 → 450,6 |
private_extract(lev->scheduling_level, p); |
|
iq_insertfirst(p, &b->tasks); |
|
b->current = NIL; |
|
} |
637,15 → 598,6 |
|
} |
|
int CBSSTAR_was_budget_overran(LEVEL l, int budget) |
{ |
|
CBSSTAR_level_des *lev = (CBSSTAR_level_des *)(level_table[l]); |
|
return lev->b[budget].overran; |
|
} |
|
int CBSSTAR_is_active(LEVEL l, int budget) |
{ |
CBSSTAR_level_des *lev = (CBSSTAR_level_des *)(level_table[l]); |