Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 903 → Rev 902

/shark/trunk/kernel/modules/intdrive.c
42,10 → 42,11
#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 +*/
60,16 → 61,15
 
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,7 → 83,6
/* 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);
 
95,9 → 94,7
 
if (INTDRIVE_task == NIL) return;
 
lev->avail = lev->q_theta;
TRACER_LOGEVENT(FTrace_EVT_user_event_0, 0, lev->avail + INT_MAX);
lev->avail = lev->capacity;
 
switch (proc_table[INTDRIVE_task].status) {
 
109,11 → 106,13
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);
122,7 → 121,7
kern_raise(XWCET_VIOLATION,INTDRIVE_task);
 
}*/
}
 
static PID INTDRIVE_public_scheduler(LEVEL l)
{
164,15 → 163,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)
182,22 → 181,16
 
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]);
 
225,15 → 218,10
 
if (lev->replenish_timer == NIL) {
 
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);
/*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);*/
}
}
254,23 → 242,16
{
INTDRIVE_level_des *lev = (INTDRIVE_level_des *)(level_table[l]);
struct timespec time, acttime;
//int delta_time;
TIME delta_capacity, delta_time;
int temp,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);
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);
lev->avail -= TIMESPEC2USEC(&time);
#ifdef INTDRIVE_DEBUG
kern_printf("(INTD:AV:%d)",(int)(lev->avail));
278,20 → 259,13
 
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);
 
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);*/
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);
316,6 → 290,9
}
}
 
TRACER_LOGEVENT(FTrace_EVT_task_end_cycle,
(unsigned short int)proc_table[INTDRIVE_task].context,(unsigned int)l);
 
return 0;
 
}
328,8 → 305,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;
 
364,14 → 341,13
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 = 0;
lev->q_theta = capacity;
mul32div32to32(MAX_BANDWIDTH,lev->capacity,replenish_period,lev->U);
lev->avail = capacity;
mul32div32to32(MAX_BANDWIDTH,lev->capacity,lev->replenish_period,lev->U);
 
return l;
}
383,13 → 359,3
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;
}