20,11 → 20,11 |
|
/** |
------------ |
CVS : $Id: rm.c,v 1.10 2004-06-21 11:43:02 anton Exp $ |
CVS : $Id: rm.c,v 1.11 2004-09-15 11:55:16 giacomo Exp $ |
|
File: $File$ |
Revision: $Revision: 1.10 $ |
Last update: $Date: 2004-06-21 11:43:02 $ |
Revision: $Revision: 1.11 $ |
Last update: $Date: 2004-09-15 11:55:16 $ |
------------ |
|
This file contains the scheduling module RM (rate-/deadline-monotonic) |
105,6 → 105,7 |
struct timespec adeadline; /* latest assigned deadline */ |
int dl_timer; /* deadline timer */ |
int eop_timer; /* end of period timer */ |
int off_timer; /* offset timer */ |
int dl_miss; /* deadline miss counter */ |
int wcet_miss; /* WCET miss counter */ |
int act_miss; /* activation miss counter */ |
167,6 → 168,8 |
RM_level_des *lev = (RM_level_des *)level_table[proc_table[p].task_level]; |
RM_task_des *td = &lev->tvec[p]; |
|
td->dl_timer = -1; |
|
TRACER_LOGEVENT(FTrace_EVT_task_deadline_miss, |
(unsigned short int)proc_table[p].context,0); |
|
183,6 → 186,10 |
PID p = (PID) par; |
RM_level_des *lev; |
lev = (RM_level_des *)level_table[proc_table[p].task_level]; |
RM_task_des *td = &lev->tvec[p]; |
|
td->off_timer = -1; |
|
/* release the task now */ |
RM_intern_release(p, lev); |
} |
191,9 → 198,17 |
static void RM_timer_guest_deadline(void *par) |
{ |
PID p = (PID) par; |
RM_level_des *lev; |
lev = (RM_level_des *)level_table[proc_table[p].task_level]; |
RM_task_des *td = &lev->tvec[p]; |
|
td->dl_timer = -1; |
|
TRACER_LOGEVENT(FTrace_EVT_task_deadline_miss, |
(unsigned short int)proc_table[p].context,0); |
|
kern_raise(XDEADLINE_MISS,p); |
|
} |
|
|
209,6 → 224,10 |
if (lev->flags & RM_ENABLE_DL_CHECK) { |
temp = td->release; |
ADDUSEC2TIMESPEC(td->rdeadline, &temp); |
if (td->dl_timer != -1) { |
kern_event_delete(td->dl_timer); |
td->dl_timer = -1; |
} |
td->dl_timer = kern_event_post(&temp,RM_timer_deadline,(void *)p); |
} |
|
234,6 → 253,10 |
/* increase release time */ |
ADDUSEC2TIMESPEC(td->period, &td->release); |
/* post end of period timer */ |
if (td->eop_timer != -1) { |
kern_event_delete(td->eop_timer); |
td->eop_timer = -1; |
} |
td->eop_timer = kern_event_post(&td->release, RM_timer_endperiod,(void *)p); |
|
TRACER_LOGEVENT(FTrace_EVT_task_timer, |
308,6 → 331,7 |
td->offset = h->offset; |
td->dl_timer = -1; |
td->eop_timer = -1; |
td->off_timer = -1; |
td->dl_miss = 0; |
td->wcet_miss = 0; |
td->act_miss = 0; |
407,7 → 431,11 |
|
if (TIMESPEC_A_GT_B(&td->release, &clocktime)) { |
/* release later, post an offset timer */ |
kern_event_post(&td->release,RM_timer_offset,(void *)p); |
if (td->off_timer != -1) { |
kern_event_delete(td->off_timer); |
td->off_timer = -1; |
} |
td->off_timer = kern_event_post(&td->release,RM_timer_offset,(void *)p); |
} else { |
/* release now */ |
RM_intern_release(p, lev); |
574,10 → 602,13 |
iq_priority_insert(p,&lev->ready); |
proc_table[p].status = RM_READY; |
|
td->dl_timer = -1; |
|
td->period = job->period; |
|
if (td->dl_timer != -1) { |
kern_event_delete(td->dl_timer); |
td->dl_timer = -1; |
} |
|
if (!job->noraiseexc) { |
td->dl_timer = kern_event_post(iq_query_timespec(p, &lev->ready), |
RM_timer_guest_deadline,(void *)p); |
629,6 → 660,7 |
{ |
LEVEL l; /* the level that we register */ |
RM_level_des *lev; /* for readableness only */ |
int i; |
|
printk("RM_register_level\n"); |
|
671,6 → 703,18 |
|
lev->U = 0; |
|
for (i=0;i<MAX_PROC;i++) { |
RM_task_des *td = &lev->tvec[i]; |
td->flags = 0; |
td->dl_timer = -1; |
td->eop_timer = -1; |
td->off_timer = -1; |
td->dl_miss = 0; |
td->wcet_miss = 0; |
td->act_miss = 0; |
td->nact = 0; |
} |
|
return l; |
} |
|