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; |