42,11 → 42,10 |
#include <kernel/descr.h> |
#include <kernel/var.h> |
#include <kernel/func.h> |
#include <tracer.h> |
|
#include <ll/i386/64bit.h> |
|
#include <tracer.h> |
|
/*+ Status used in the level +*/ |
#define INTDRIVE_READY MODULE_STATUS_BASE /*+ - Ready status +*/ |
#define INTDRIVE_WCET_VIOLATED MODULE_STATUS_BASE+2 /*+ when wcet is finished +*/ |
61,15 → 60,16 |
|
TIME replenish_period; |
TIME capacity; |
TIME q_theta; |
|
struct timespec act_time; |
|
int avail; |
|
struct timespec replenish_expires; |
int replenish_timer; |
int wcet_timer; |
|
//struct timespec replenish_expires; |
//int wcet_timer; |
|
int act_number; /*+ the activation number +*/ |
|
int flags; /*+ the init flags... +*/ |
83,6 → 83,7 |
/* Replenish the capacity */ |
static void INTDRIVE_timer(void *arg) |
{ |
//TRACER_LOGEVENT(FTrace_EVT_user_event_3, 0, 0); |
|
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(arg); |
|
94,7 → 95,9 |
|
if (INTDRIVE_task == NIL) return; |
|
lev->avail = lev->capacity; |
lev->avail = lev->q_theta; |
|
TRACER_LOGEVENT(FTrace_EVT_user_event_0, 0, lev->avail + INT_MAX); |
|
switch (proc_table[INTDRIVE_task].status) { |
|
106,13 → 109,11 |
proc_table[INTDRIVE_task].status = INTDRIVE_WAIT; |
} |
break; |
|
} |
|
//TRACER_LOGEVENT(FTrace_EVT_user_event_4, 1, 0); |
} |
|
|
static void INTDRIVE_wcet_timer(void *arg) |
/*static void INTDRIVE_wcet_timer(void *arg) |
{ |
|
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(arg); |
121,7 → 122,7 |
|
kern_raise(XWCET_VIOLATION,INTDRIVE_task); |
|
} |
}*/ |
|
static PID INTDRIVE_public_scheduler(LEVEL l) |
{ |
163,15 → 164,15 |
{ |
|
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]); |
struct timespec time; |
//struct timespec time; |
|
kern_gettime(&(lev->act_time)); |
TIMESPEC_ASSIGN(&time,&(lev->act_time)); |
|
/*TIMESPEC_ASSIGN(&time,&(lev->act_time)); |
ADDUSEC2TIMESPEC(proc_table[INTDRIVE_task].wcet,&time); |
|
if (lev->flags == INTDRIVE_CHECK_WCET) |
lev->wcet_timer = kern_event_post(&time,INTDRIVE_wcet_timer,(void *)lev); |
|
lev->wcet_timer = kern_event_post(&time,INTDRIVE_wcet_timer,(void *)lev);*/ |
} |
|
static void INTDRIVE_public_epilogue(LEVEL l, PID p) |
181,16 → 182,22 |
|
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]); |
|
if (lev->wcet_timer != NIL) |
kern_event_delete(lev->wcet_timer); |
|
/*if (lev->wcet_timer != NIL) |
kern_event_delete(lev->wcet_timer);*/ |
|
SUBTIMESPEC(&schedule_time, &(lev->act_time), &time); |
lev->avail -= TIMESPEC2USEC(&time); |
|
TRACER_LOGEVENT(FTrace_EVT_user_event_0, 0, lev->avail + INT_MAX); |
|
if (proc_table[INTDRIVE_task].wcet < TIMESPEC2USEC(&time)) { |
kern_raise(XWCET_VIOLATION,INTDRIVE_task); |
} |
} |
|
static void INTDRIVE_public_activate(LEVEL l, PID p, struct timespec *t) |
{ |
struct timespec acttime; |
TIME time, delta_capacity; |
|
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]); |
|
218,10 → 225,15 |
|
if (lev->replenish_timer == NIL) { |
|
kern_gettime(&(lev->replenish_expires)); |
delta_capacity = lev->q_theta - lev->avail; |
mul32div32to32(delta_capacity, MAX_BANDWIDTH, lev->U, time); |
kern_gettime(&acttime); |
ADDUSEC2TIMESPEC(time,&acttime); |
lev->replenish_timer = kern_event_post(&acttime,INTDRIVE_timer,(void *)lev); |
|
/*kern_gettime(&(lev->replenish_expires)); |
ADDUSEC2TIMESPEC(lev->replenish_period,&(lev->replenish_expires)); |
lev->replenish_timer = kern_event_post(&(lev->replenish_expires),INTDRIVE_timer,(void *)lev); |
|
lev->replenish_timer = kern_event_post(&(lev->replenish_expires),INTDRIVE_timer,(void *)lev);*/ |
} |
|
} |
242,16 → 254,23 |
{ |
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]); |
struct timespec time, acttime; |
int temp,delta_time;; |
|
//int delta_time; |
TIME delta_capacity, delta_time; |
|
lev->act_number--; |
|
if (lev->wcet_timer != NIL) |
kern_event_delete(lev->wcet_timer); |
/*if (lev->wcet_timer != NIL) |
kern_event_delete(lev->wcet_timer);*/ |
|
kern_gettime(&acttime); |
SUBTIMESPEC(&acttime, &(lev->act_time), &time); |
lev->avail -= TIMESPEC2USEC(&time); |
delta_time = TIMESPEC2USEC(&time); |
mul32div32to32(delta_time, (1-lev->U), MAX_BANDWIDTH, delta_capacity); |
lev->avail -= delta_capacity; |
|
//lev->avail -= TIMESPEC2USEC(&time); |
|
TRACER_LOGEVENT(FTrace_EVT_user_event_0, 0, lev->avail + INT_MAX); |
|
#ifdef INTDRIVE_DEBUG |
kern_printf("(INTD:AV:%d)",(int)(lev->avail)); |
259,13 → 278,20 |
|
if (lev->avail < 0) { |
proc_table[INTDRIVE_task].status = INTDRIVE_IDLE; |
temp = -lev->avail; |
mul32div32to32(temp,lev->replenish_period,lev->capacity,delta_time); |
|
|
if (lev->replenish_timer != NIL) |
kern_event_delete(lev->replenish_timer); |
|
ADDUSEC2TIMESPEC(delta_time,&(lev->replenish_expires)); lev->replenish_timer = kern_event_post(&(lev->replenish_expires),INTDRIVE_timer,(void *)lev); |
delta_capacity = lev->q_theta - lev->avail; |
mul32div32to32(delta_capacity, MAX_BANDWIDTH, lev->U, delta_time); |
kern_gettime(&acttime); |
ADDUSEC2TIMESPEC(delta_time,&acttime); |
lev->replenish_timer = kern_event_post(&acttime,INTDRIVE_timer,(void *)lev); |
|
/*temp = -lev->avail; |
mul32div32to32(temp,lev->replenish_period,lev->capacity,delta_time) |
ADDUSEC2TIMESPEC(delta_time,&(lev->replenish_expires)); |
lev->replenish_timer = kern_event_post(&(lev->replenish_expires),INTDRIVE_timer,(void *)lev);*/ |
|
#ifdef INTDRIVE_DEBUG |
kern_printf("(INTD:IDLE:%d)",delta_time); |
290,9 → 316,6 |
} |
} |
|
TRACER_LOGEVENT(FTrace_EVT_task_end_cycle, |
(unsigned short int)proc_table[INTDRIVE_task].context,(unsigned int)l); |
|
return 0; |
|
} |
305,8 → 328,8 |
if (lev->replenish_timer != NIL) |
kern_event_delete(lev->replenish_timer); |
|
if (lev->wcet_timer != NIL) |
kern_event_delete(lev->wcet_timer); |
/*if (lev->wcet_timer != NIL) |
kern_event_delete(lev->wcet_timer);*/ |
|
proc_table[INTDRIVE_task].status = INTDRIVE_IDLE; |
|
341,13 → 364,14 |
NULL_TIMESPEC(&(lev->act_time)); |
|
lev->capacity = capacity; |
lev->replenish_period = replenish_period; |
//lev->replenish_period = replenish_period; |
lev->replenish_timer = NIL; |
lev->wcet_timer = NIL; |
//lev->wcet_timer = NIL; |
lev->flags = flags; |
lev->act_number = 0; |
lev->avail = capacity; |
mul32div32to32(MAX_BANDWIDTH,lev->capacity,lev->replenish_period,lev->U); |
lev->avail = 0; |
lev->q_theta = capacity; |
mul32div32to32(MAX_BANDWIDTH,lev->capacity,replenish_period,lev->U); |
|
return l; |
} |
359,3 → 383,13 |
return lev->U; |
} |
|
TIME INTDRIVE_set_q_theta(LEVEL l, TIME new_q_theta) |
{ |
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]); |
|
lev->q_theta = new_q_theta; |
if (lev->q_theta < 0) lev->q_theta = 0; |
if (lev->q_theta > lev->capacity) lev->q_theta = lev->capacity; |
|
return lev->q_theta; |
} |