30,7 → 30,7 |
int pid; |
}; |
|
struct endcycle { |
struct task_event { |
int ctx; |
unsigned long long tsc; |
unsigned long long nsec; |
44,8 → 44,12 |
int context_total = 0,endcycle_total = 0,job_total = 0,exec_total = 0; |
struct ctx_exec *exec_list; |
struct ctx_to_pid *context_list; |
struct endcycle *endcycle_list; |
struct task_event *endcycle_list; |
struct task_event *deadline_miss_list; |
struct task_event *wcet_miss_list; |
struct task_event *act_list; |
struct ctx_exec *job_list; |
int deadline_miss = 0, wcet_miss = 0, act_total = 0; |
|
unsigned int clk_per_msec = 0; |
unsigned int skip_clk_per_msec = 0; |
416,7 → 420,10 |
/* Memory alloc */ |
exec_list = malloc(sizeof(struct ctx_exec) * MAXJOB); |
context_list = malloc(sizeof(struct ctx_to_pid) * MAXCONTEXT); |
endcycle_list = malloc(sizeof(struct endcycle) * MAXJOB); |
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); |
|
/* Finite-State machine |
* |
474,6 → 481,9 |
case 5: |
case 9: |
case 0: |
case 20: |
case 21: |
|
/* 2 par */ |
fscanf(input_file,"%d %d",&par1,&par2); |
break; |
640,6 → 650,44 |
|
break; |
|
/* Task activate */ |
case 6: |
|
act_list[act_total].ctx = par1; |
act_list[act_total].tsc = tsc; |
act_list[act_total].nsec = current_nsec + (tsc-last_tsc) * 1000000 / clk_per_msec; |
act_total++; |
|
break; |
|
/* Deadline miss */ |
case 20: |
|
for (i=0;i<context_total;i++) |
if (par1 == context_list[i].ctx) break; |
if (i == context_total) Error(4,k); |
|
deadline_miss_list[deadline_miss].ctx = par1; |
deadline_miss_list[deadline_miss].tsc = tsc; |
deadline_miss_list[deadline_miss].nsec = current_nsec + (tsc-last_tsc) * 1000000 / clk_per_msec; |
deadline_miss++; |
|
break; |
|
/* Wcet miss */ |
case 21: |
|
for (i=0;i<context_total;i++) |
if (par1 == context_list[i].ctx) break; |
if (i == context_total) Error(4,k); |
|
wcet_miss_list[wcet_miss].ctx = par1; |
wcet_miss_list[wcet_miss].tsc = tsc; |
wcet_miss_list[wcet_miss].nsec = current_nsec + (tsc-last_tsc) * 1000000 / clk_per_msec; |
wcet_miss++; |
|
break; |
|
/* Task id */ |
case 9: |
|
679,8 → 727,9 |
exit(3); |
} |
|
if (current_endcycle == MAXJOB-1) { |
printf("Too many endcycle...\n"); |
if (current_endcycle == MAXJOB-1 || act_total == MAXJOB-1 |
|| deadline_miss == MAXJOB-1 || wcet_miss == MAXJOB-1) { |
printf("Too many jobs...\n"); |
exit(4); |
} |
|
695,6 → 744,32 |
|
} |
|
int task_events(int num, int *act, int *dlinemiss, int *wcetmiss) { |
|
unsigned long long i; |
int tmp = 0; |
|
*act = 0; |
*dlinemiss = 0; |
*wcetmiss = 0; |
|
tmp = 0; |
for (i=0;i<act_total;i++) |
if (act_list[i].ctx == context_list[num].ctx) tmp++; |
*act = tmp; |
tmp = 0; |
for (i=0;i<deadline_miss;i++) |
if (deadline_miss_list[i].ctx == context_list[num].ctx) tmp++; |
*dlinemiss = tmp; |
tmp = 0; |
for (i=0;i<wcet_miss;i++) |
if (wcet_miss_list[i].ctx == context_list[num].ctx) tmp++; |
*wcetmiss = tmp; |
|
return 0; |
|
} |
|
int create_job_list() { |
|
int current_job = 0, h, i, k; |
756,7 → 831,7 |
|
char pidstr[10]; |
unsigned long long tot_nsec,mean_nsec,max_nsec,min_nsec,first_nsec; |
int number; |
int number,act,dlinemiss,wcetmiss; |
|
switch (context_list[num].pid) { |
case PID_NO_DEF: |
862,6 → 937,12 |
printf(" Mean Job [%12llu ns]\n",mean_nsec); |
printf(" Max Job [%12llu ns]\n\n",max_nsec); |
|
task_events(num,&act,&dlinemiss,&wcetmiss); |
|
printf(" Activations [%12d ]\n",act); |
printf(" Deadline Miss [%12d ]\n",dlinemiss); |
printf(" Wcet Miss [%12d ]\n\n",wcetmiss); |
|
plot_job_c_distrib(num,max_nsec,pidstr); |
|
arr_stats_from_jobs(num,&min_nsec,&mean_nsec,&max_nsec); |
918,6 → 999,8 |
printf("Events [%12d]\n",events_total); |
printf("Execs [%12d]\n",exec_total); |
printf("EndCycles [%12d]\n",endcycle_total); |
printf("Dline miss [%12d]\n",deadline_miss); |
printf("WCET miss [%12d]\n",wcet_miss); |
|
printf("\nPreemption Removing.... \n"); |
|