Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 743 → Rev 744

/shark/trunk/kernel/modules/elastic.c
56,7 → 56,7
 
#define ELASTIC_IDLE APER_STATUS_BASE
 
#define ELASTIC_DEBUG
//#define ELASTIC_DEBUG
 
#ifdef ELASTIC_DEBUG
char *pnow() {
203,11 → 203,21
}
}
}
if (Umin > lev->U) return -1; // NOT FEASIBLE
 
if (Umax <= lev->U) return 0; // FEASIBLE WITH MAXIMUM UTILIZATIONS
if (Umin > lev->U) {
#ifdef ELASTIC_DEBUG
cprintf("ELASTIC_compress: Task set not feasible\n");
#endif
return -1; // NOT FEASIBLE
}
 
if (Umax <= lev->U) {
#ifdef ELASTIC_DEBUG
cprintf("ELASTIC_compress: Task set feasible with maximum utilizations\n");
#endif
return 0; // FEASIBLE WITH MAXIMUM UTILIZATIONS
}
 
do {
Uf = 0;
Ev = 0;
250,7 → 260,9
if (et->flags & ELASTIC_PRESENT) {
if (et->U != et->oldU) {
/* Utilization has been changed. Compute new period */
et->T = ((long long)et->C * (long long)lev->c_scaling_factor * (long long)MAX_BANDWIDTH) / (et->U * (long long)SCALING_UNIT);
// overflow here???
//et->T = ((long long)et->C * (long long)lev->c_scaling_factor * (long long)MAX_BANDWIDTH) / (et->U * (long long)SCALING_UNIT);
et->T = ((long long)et->C * (long long)MAX_BANDWIDTH) / (long long)et->U;
}
if (et->U < et->oldU) {
/* Task has been compressed. Change its deadline NOW! */
279,7 → 291,7
}
 
#ifdef ELASTIC_DEBUG
cprintf("New periods: ");
cprintf("ELASTIC_compress: New periods: ");
for (i=0; i<MAX_PROC; i++) {
et = &lev->elist[i];
if (et->flags & ELASTIC_PRESENT) {
330,16 → 342,30
et->E = elastic->E;
et->beta = elastic->beta;
 
et->Umax = ((long long)MAX_BANDWIDTH * (long long)elastic->C * (long long)lev->c_scaling_factor) / ((long long)elastic->Tmin * (long long)SCALING_UNIT);
et->Umin = ((long long)MAX_BANDWIDTH * (long long)elastic->C * (long long)lev->c_scaling_factor) / ((long long)elastic->Tmax * (long long)SCALING_UNIT);
// overflow here???
//et->Umax = ((long long)MAX_BANDWIDTH * (long long)elastic->C * (long long)lev->c_scaling_factor) / ((long long)elastic->Tmin * (long long)SCALING_UNIT);
//et->Umin = ((long long)MAX_BANDWIDTH * (long long)elastic->C * (long long)lev->c_scaling_factor) / ((long long)elastic->Tmax * (long long)SCALING_UNIT);
 
et->Umax = ((long long)MAX_BANDWIDTH * (long long)elastic->C) / (long long)elastic->Tmin;
et->Umin = ((long long)MAX_BANDWIDTH * (long long)elastic->C) / (long long)elastic->Tmax;
 
et->U = et->Umax;
et->oldU = 0;
et->T = et->Tmin;
et->dltimer = -1;
 
et->flags |= ELASTIC_PRESENT;
if (ELASTIC_compress(lev) == -1) {
et->flags &= ~ELASTIC_PRESENT;
#ifdef ELASTIC_DEBUG
cprintf("ELASTIC_public_create: compression failed!\n");
#endif
return -1;
}
 
mul32div32to32(et->C,lev->c_scaling_factor,SCALING_UNIT,proc_table[p].avail_time);
mul32div32to32(et->C,lev->c_scaling_factor,SCALING_UNIT,proc_table[p].wcet);
 
proc_table[p].control |= CONTROL_CAP;
 
return 0;
389,7 → 415,6
 
static void ELASTIC_public_activate(LEVEL l, PID p, struct timespec *t)
{
 
ELASTIC_level_des *lev = (ELASTIC_level_des *)(level_table[l]);
ELASTIC_task_descr *et = &lev->elist[p];
 
398,15 → 423,6
return;
}
 
et->flags |= ELASTIC_PRESENT;
if (ELASTIC_compress(lev) == -1) {
et->flags &= ~ELASTIC_PRESENT;
#ifdef ELASTIC_DEBUG
cprintf("ELASTIC_public_activate: compression failed!\n");
#endif
return;
}
 
ELASTIC_activation(lev,p,t);
 
/* Next activation */
602,6 → 618,79
 
}
 
 
int ELASTIC_get_Tmin(PID p) {
 
SYS_FLAGS f;
ELASTIC_level_des *lev;
lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level];
TIME retval;
 
f = kern_fsave();
 
if (lev->elist[p].flags & ELASTIC_PRESENT) {
retval = lev->elist[p].Tmin;
kern_frestore(f);
return retval;
 
} else {
 
kern_frestore(f);
return -1;
 
}
 
}
 
 
int ELASTIC_get_Tmax(PID p) {
 
SYS_FLAGS f;
ELASTIC_level_des *lev;
lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level];
TIME retval;
 
f = kern_fsave();
 
if (lev->elist[p].flags & ELASTIC_PRESENT) {
retval = lev->elist[p].Tmax;
kern_frestore(f);
return retval;
 
} else {
 
kern_frestore(f);
return -1;
 
}
 
}
 
 
int ELASTIC_get_C(PID p) {
 
SYS_FLAGS f;
ELASTIC_level_des *lev;
lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level];
TIME retval;
 
f = kern_fsave();
 
if (lev->elist[p].flags & ELASTIC_PRESENT) {
retval = lev->elist[p].C;
kern_frestore(f);
return retval;
 
} else {
 
kern_frestore(f);
return -1;
 
}
 
}
 
 
int ELASTIC_set_E(PID p, int E)
{
SYS_FLAGS f;