Rev 1234 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
#include "func.h"
extern int cal_cycles;
extern struct timespec zero_time;
extern struct loader_task *loader_task_list;
/* Delay Calibration */
int calibrate_cycle()
{
long long i;
struct timespec start,end,diff;
kern_cli();
kern_gettime(&start);
for (i=0;i<CALIBRATION_DELTA;i++) kern_gettime(NULL);
kern_gettime(&end);
kern_sti();
SUBTIMESPEC(&end,&start,&diff);
cal_cycles = TIMESPEC2USEC(&diff);
cprintf("Calibration usec/[%d cycles] = %d\n",CALIBRATION_DELTA,cal_cycles);
return 0;
}
void *get_task_model(struct loader_task *current) {
if (current->local_scheduler == PAR_POSIX) {
static NRT_TASK_MODEL nrt;
nrt_task_default_model(nrt);
nrt_task_def_save_arrivals(nrt);
nrt_task_def_ctrl_jet(nrt);
nrt_task_def_usemath(nrt);
return &nrt;
}
if (current->local_scheduler == PAR_EDF) {
static HARD_TASK_MODEL ht;
hard_task_default_model(ht);
hard_task_def_ctrl_jet(ht);
hard_task_def_mit(ht,TIMESPEC2USEC(¤t->deadline));
hard_task_def_wcet(ht,TIMESPEC2USEC(¤t->wcet));
hard_task_def_usemath(ht);
return &ht;
}
if (current->local_scheduler == PAR_RM) {
static HARD_TASK_MODEL ht;
hard_task_default_model(ht);
hard_task_def_mit(ht,TIMESPEC2USEC(¤t->deadline));
hard_task_def_wcet(ht,TIMESPEC2USEC(¤t->wcet));
hard_task_def_ctrl_jet(ht);
hard_task_def_usemath(ht);
return &ht;
}
return NULL;
}
void set_simulation_time (struct timespec *total) {
struct timespec end_time;
ADDTIMESPEC(&zero_time,total,&end_time);
kern_event_post(&end_time,(void *)((void *)(sys_end)),NULL);
}
int calibration_func() {
return kern_gettime(NULL);
}
void start_simulation() {
int i, total_task;
struct loader_task *l;
struct timespec end_time;
total_task = sizeof(loader_task_list)/sizeof(struct loader_task);
i = 0;
while (i<total_task) {
if (l->act_number>0) {
ADDTIMESPEC(&zero_time, &l->act[0], &end_time);
l->act_current++;
kern_event_post(&end_time,loader_task_activate,&l);
i++;
l=&loader_task_list[i];
}
}
}
void loader_task_activate(struct loader_task *l) {
struct timespec actual_time,end_time;
kern_gettime(&actual_time);
group_activate(l->group);
if (l->act_number > l->act_current) {
ADDTIMESPEC(&actual_time, &l->act[l->act_current], &end_time);
l->act_current++;
kern_event_post(&end_time,loader_task_activate,&l);
}
}