99,7 → 99,6 |
TRACER_LOGEVENT(FTrace_EVT_user_event_0, 0, lev->avail + INT_MAX); |
|
switch (proc_table[INTDRIVE_task].status) { |
|
case INTDRIVE_IDLE: |
if (lev->act_number) { |
proc_table[INTDRIVE_task].status = INTDRIVE_READY; |
113,18 → 112,15 |
|
/*static void INTDRIVE_wcet_timer(void *arg) |
{ |
|
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(arg); |
|
lev->wcet_timer = NIL; |
|
kern_raise(XWCET_VIOLATION,INTDRIVE_task); |
|
}*/ |
|
static PID INTDRIVE_public_scheduler(LEVEL l) |
{ |
|
if (INTDRIVE_task == NIL) return NIL; |
|
if (proc_table[INTDRIVE_task].status == INTDRIVE_READY || |
132,12 → 128,10 |
return INTDRIVE_task; |
else |
return NIL; |
|
} |
|
static int INTDRIVE_public_create(LEVEL l, PID p, TASK_MODEL *m) |
{ |
|
HARD_TASK_MODEL *h; |
|
if (m->pclass != HARD_PCLASS) return -1; |
155,12 → 149,10 |
proc_table[INTDRIVE_task].control &= ~CONTROL_CAP; |
|
return 0; |
|
} |
|
static void INTDRIVE_public_dispatch(LEVEL l, PID p, int nostop) |
{ |
|
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]); |
//struct timespec time; |
|
175,7 → 167,6 |
|
static void INTDRIVE_public_epilogue(LEVEL l, PID p) |
{ |
|
struct timespec time; |
|
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]); |
200,29 → 191,20 |
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]); |
|
if (proc_table[INTDRIVE_task].status == INTDRIVE_WAIT) { |
|
proc_table[INTDRIVE_task].status = INTDRIVE_READY; |
|
lev->act_number++; |
|
} else { |
|
if (proc_table[INTDRIVE_task].status == INTDRIVE_IDLE || |
proc_table[INTDRIVE_task].status == INTDRIVE_READY || |
proc_table[INTDRIVE_task].status == EXE) { |
|
#ifdef INTDRIVE_DEBUG |
kern_printf("(INTD:WAIT_REC)"); |
#endif |
|
lev->act_number++; |
|
} |
|
} |
|
if (lev->replenish_timer == NIL) { |
|
delta_capacity = lev->q_theta - lev->avail; |
mul32div32to32(delta_capacity, MAX_BANDWIDTH, lev->U, time); |
kern_gettime(&acttime); |
233,7 → 215,6 |
ADDUSEC2TIMESPEC(lev->replenish_period,&(lev->replenish_expires)); |
lev->replenish_timer = kern_event_post(&(lev->replenish_expires),INTDRIVE_timer,(void *)lev);*/ |
} |
|
} |
|
static void INTDRIVE_public_unblock(LEVEL l, PID p) |
240,7 → 221,6 |
{ |
/* Insert task in the correct position */ |
proc_table[INTDRIVE_task].status = INTDRIVE_READY; |
|
} |
|
static void INTDRIVE_public_block(LEVEL l, PID p) |
294,28 → 274,21 |
#ifdef INTDRIVE_DEBUG |
kern_printf("(INTD:IDLE:%d)",delta_time); |
#endif |
|
} else { |
if (lev->act_number) { |
proc_table[INTDRIVE_task].status = INTDRIVE_READY; |
|
#ifdef INTDRIVE_DEBUG |
kern_printf("(INTD:NEXT_ACT)"); |
#endif |
|
} else { |
|
#ifdef INTDRIVE_DEBUG |
kern_printf("(INTD:WAIT_ACT)"); |
#endif |
|
proc_table[INTDRIVE_task].status = INTDRIVE_WAIT; |
|
} |
} |
|
TRACER_LOGEVENT(FTrace_EVT_task_end_cycle, |
(unsigned short int)proc_table[INTDRIVE_task].context,(unsigned int)l); |
TRACER_LOGEVENT(FTrace_EVT_task_end_cycle, (unsigned short int)proc_table[INTDRIVE_task].context,(unsigned int)l); |
|
return 0; |
} |
322,7 → 295,6 |
|
static void INTDRIVE_public_end(LEVEL l, PID p) |
{ |
|
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]); |
|
if (lev->replenish_timer != NIL) |
332,7 → 304,6 |
kern_event_delete(lev->wcet_timer);*/ |
|
proc_table[INTDRIVE_task].status = INTDRIVE_IDLE; |
|
} |
|
/* Registration functions */ |
369,10 → 340,15 |
lev->act_number = 0; |
lev->avail = 0; |
lev->q_theta = q_theta; |
mul32div32to32(MAX_BANDWIDTH,U,10000,lev->U); |
lev->U = U; |
//mul32div32to32(MAX_BANDWIDTH,U,10000,lev->U); |
#ifdef INTDRIVE_DEBUG |
printk("INTDRIVE Init: %d %d %d\n", lev->capacity, lev->q_theta, lev->U); |
#endif |
|
//!!!calcolare parametro |
intdrive_taskinit(l, 10000); |
//TODO !!! Fixing 10000 is not a clean way to work !!! |
if (intdrive_taskinit(l, 10000) == -1) |
printk("Error: INTDRIVE task not activated!\n"); |
|
return l; |
} |