99,6 → 99,7 |
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; |
112,15 → 113,18 |
|
/*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 || |
128,10 → 132,12 |
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; |
149,10 → 155,12 |
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; |
|
167,6 → 175,7 |
|
static void INTDRIVE_public_epilogue(LEVEL l, PID p) |
{ |
|
struct timespec time; |
|
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]); |
191,20 → 200,29 |
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); |
215,6 → 233,7 |
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) |
221,6 → 240,7 |
{ |
/* Insert task in the correct position */ |
proc_table[INTDRIVE_task].status = INTDRIVE_READY; |
|
} |
|
static void INTDRIVE_public_block(LEVEL l, PID p) |
274,21 → 294,28 |
#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; |
} |
295,6 → 322,7 |
|
static void INTDRIVE_public_end(LEVEL l, PID p) |
{ |
|
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]); |
|
if (lev->replenish_timer != NIL) |
304,6 → 332,7 |
kern_event_delete(lev->wcet_timer);*/ |
|
proc_table[INTDRIVE_task].status = INTDRIVE_IDLE; |
|
} |
|
/* Registration functions */ |
340,15 → 369,10 |
lev->act_number = 0; |
lev->avail = 0; |
lev->q_theta = q_theta; |
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 |
mul32div32to32(MAX_BANDWIDTH,U,10000,lev->U); |
|
//TODO !!! Fixing 10000 is not a clean way to work !!! |
if (intdrive_taskinit(l, 10000) == -1) |
printk("Error: INTDRIVE task not activated!\n"); |
//!!!calcolare parametro |
intdrive_taskinit(l, 10000); |
|
return l; |
} |