10,6 → 10,7 |
#define INT_CTX 1 |
#define INT_PID 9999 |
#define PID_NO_DEF -1 |
#define SERVER_NO_DEF -1 |
|
#define BACKGROUND 0 |
#define PERIODICAL 1 |
32,6 → 33,12 |
int pid; |
}; |
|
struct ctx_server { |
int ctx; |
int server_id; |
|
}; |
|
struct task_event { |
int ctx; |
unsigned long long tsc; |
38,6 → 45,12 |
unsigned long long nsec; |
}; |
|
struct server_event { |
int server_id; |
unsigned long long tsc; |
unsigned long long nsec; |
}; |
|
void Error(int num, int line) { |
printf("Finite-State machine error %d at line %d\n",num,line); |
exit(2); |
51,6 → 64,12 |
struct task_event *wcet_miss_list; |
struct task_event *act_list; |
struct ctx_exec *job_list; |
struct ctx_server *ctx_server_list; |
|
int server_exec_total = 0, server_end_total=0, server_act_total=0, ctx_server_total = 0, server_total=0; |
struct server_event *act_server_list; |
struct server_event *server_budget_end_list; |
|
int deadline_miss = 0, wcet_miss = 0, act_total = 0; |
|
unsigned int clk_per_msec = 0; |
426,11 → 445,17 |
/* Memory alloc */ |
exec_list = malloc(sizeof(struct ctx_exec) * MAXJOB); |
context_list = malloc(sizeof(struct ctx_to_pid) * MAXCONTEXT); |
ctx_server_list = malloc(sizeof(struct ctx_server) * MAXCONTEXT); |
|
endcycle_list = malloc(sizeof(struct task_event) * MAXJOB); |
deadline_miss_list = malloc(sizeof(struct task_event) * MAXJOB); |
wcet_miss_list = malloc(sizeof(struct task_event) * MAXJOB); |
act_list = malloc(sizeof(struct task_event) * MAXJOB); |
|
act_server_list = malloc(sizeof(struct server_event) * MAXJOB ); |
server_budget_end_list = malloc(sizeof(struct server_event) * MAXJOB); |
|
|
/* Finite-State machine |
* |
* FS-Machine states: |
448,6 → 473,12 |
context_list[i].pid = PID_NO_DEF; |
} |
|
for(i=0; i<MAXCONTEXT; i++) { |
ctx_server_list[i].ctx=0; |
ctx_server_list[i].server_id=SERVER_NO_DEF; |
|
} |
|
/* The start context + interrupt context */ |
context_total = 2; |
current_context = 0; |
479,7 → 510,12 |
case 7: |
case 8: |
case 10: |
|
case 11: |
case 12: |
case 13: |
case 14: |
case 15: |
case 16: |
/* 1 par */ |
fscanf(input_file,"%d",&par1); |
break; |
487,6 → 523,7 |
case 5: |
case 9: |
case 0: |
case 17: |
case 20: |
case 21: |
|
665,7 → 702,42 |
act_total++; |
|
break; |
/* Server Create */ |
case 11: |
for (i=0;i<ctx_server_total;i++) |
if (par1 == ctx_server_list[i].ctx) { |
ctx_server_list[i].server_id = par2; |
break; |
} |
if (i == ctx_server_total) { |
ctx_server_list[ctx_server_total].ctx = par1; |
ctx_server_list[ctx_server_total].server_id = par2; |
ctx_server_total++; |
} |
|
break; |
|
|
/* Server Activate */ |
case 12: |
case 16: |
|
act_server_list[server_act_total].server_id = par1; |
act_server_list[server_act_total].tsc = tsc; |
act_server_list[server_act_total].nsec = current_nsec + (tsc-last_tsc) * 1000000 / clk_per_msec; |
server_act_total++; |
break; |
/* Server end budget */ |
case 13: |
|
|
server_budget_end_list[server_end_total].server_id = par1; |
server_budget_end_list[server_end_total].tsc = tsc; |
server_budget_end_list[server_end_total].nsec = current_nsec + (tsc-last_tsc) * 1000000 / clk_per_msec; |
server_end_total++; |
|
break; |
|
/* Deadline miss */ |
case 20: |
|
836,8 → 908,10 |
int elaborate_statistics(int num, int task_type) { |
|
char pidstr[10]; |
char serverstr[10]; |
unsigned long long tot_nsec,mean_nsec,max_nsec,min_nsec,first_nsec; |
int number,act,dlinemiss,wcetmiss; |
int i=0; |
|
switch (context_list[num].pid) { |
case PID_NO_DEF: |
851,9 → 925,18 |
break; |
} |
|
for (i=0; i<ctx_server_total; i++) { |
if (ctx_server_list[i].ctx==context_list[num].ctx) |
sprintf(serverstr,"%5d", ctx_server_list[i].server_id); |
} |
|
if (i==ctx_server_total) |
sprintf(serverstr, "NODEF"); |
|
|
if (task_type == BACKGROUND) { |
|
printf("Background Task CTX [%5d] PID [%s]\n",context_list[num].ctx,pidstr); |
printf("Background Task CTX [%5d] PID [%s] SERVER [%s]\n",context_list[num].ctx,pidstr, serverstr); |
|
stats_from_execs(num,&tot_nsec,&min_nsec,&mean_nsec,&max_nsec,&first_nsec,&number); |
|