Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 851 → Rev 852

/shark/trunk/kernel/modules/rm.c
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;
}