Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1493 → Rev 1494

/demos/trunk/newtrace/instr/instr.c
60,7 → 60,7
 
clear();
 
cprintf("Start\n");
cprintf("Start");
 
hard_task_default_model(m);
hard_task_def_mit(m,200000 + rand() % 100000);
71,6 → 71,8
 
while(num < TASKMAX) {
 
cprintf(".");
 
p = task_create("Instr",ext_call,&m,NULL);
if (p == -1) {
sys_shutdown_message("Could not create task <instr> ...");
133,7 → 135,7
sys_gettime(&t);
} while (t.tv_sec < 12);
 
FTrace_OSD_init_udp(1, "192.168.1.10", "192.168.1.1");
FTrace_OSD_init_udp(1, "192.168.0.15", "192.168.0.12");
FTrace_send_chunk(a, 0, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_CYC);
 
/demos/trunk/newtrace/utils/extract.c
0,0 → 1,317
#include <stdio.h>
#include <stdlib.h>
 
#define MAXCONTEXT 100
#define MAXJOB 100000
 
#define INT_CTX 1
#define INT_PID 9999
#define PID_NO_DEF -1
 
struct single_job_exec {
int ctx;
unsigned long long dtsc;
unsigned long long start;
};
 
struct single_ctx {
int ctx;
int pid;
};
 
struct single_endcycle {
int ctx;
unsigned long long tsc;
};
 
void Error(int num) {
printf("Finite State machine error: %d\n",num);
exit(2);
}
 
int main(int argc, char *argv[]) {
 
FILE *input_file;
int type,par1,par2,k,i,h,temp_ctx;
unsigned long long tsc,endcycle_start_tsc,endcycle_end_tsc;
 
int context_number = 0;
int current_context = 0;
int current_cycle = 0;
int current_job = 0;
struct single_ctx context_list[MAXCONTEXT];
unsigned long long temp_tsc,last_tsc,log_start_tsc,log_end_tsc,total_tsc;
int state;
char pidstr[10];
 
int current_endcycle = 0;
 
struct single_job_exec *job_list;
struct single_endcycle *endcycle_list;
struct single_job_exec *cycle_list;
 
if (argc < 2) {
printf("%s: Enter the input file name [%s filename]\n",argv[0],argv[0]);
exit(1);
}
input_file = fopen(argv[1],"r");
 
/* Alloc mem */
job_list = malloc(sizeof(struct single_job_exec) * MAXJOB);
endcycle_list = malloc(sizeof(struct single_endcycle) * MAXJOB);
cycle_list = malloc(sizeof(struct single_job_exec) * MAXJOB);
 
/* Finite-State machine */
 
/* FS-Machine states:
0 - Start
1 - Context running
2 - Interrupt running
10 - End
*/
 
for(i=0;i<MAXCONTEXT;i++) {
context_list[i].ctx = 0;
context_list[i].pid = PID_NO_DEF;
}
 
/* The start context + interrupt context */
context_number = 2;
current_context = 0;
last_tsc = 0;
context_list[0].ctx = 0;
context_list[0].pid = PID_NO_DEF;
context_list[1].ctx = INT_CTX;
context_list[1].pid = INT_PID;
 
state = 0;
 
k = 0;
while(!feof(input_file)) {
 
fscanf(input_file,"%d %llu",&type,&tsc);
k++;
 
switch (type) {
 
case 0:
case 1:
 
/* No par */
break;
 
case 2:
case 3:
case 4:
case 6:
case 7:
case 8:
 
/* 1 par */
fscanf(input_file,"%d",&par1);
break;
 
case 5:
/* 2 par */
fscanf(input_file,"%d %d",&par1,&par2);
break;
 
}
 
switch (type) {
 
case 0:
if (state != 0) Error(1);
printf("EVT:Log starts at [%12llu]\n",tsc);
last_tsc = tsc;
log_start_tsc = tsc;
job_list[current_job].start = tsc;
state = 1;
break;
 
case 1:
printf("EVT:Log ends at [%12llu]\n",tsc);
job_list[current_job].dtsc = tsc - last_tsc;
job_list[current_job].ctx = current_context;
current_job++;
last_tsc = tsc;
log_end_tsc = tsc;
state = 10;
break;
/* Int start */
case 2:
if (state == 0) Error(2);
job_list[current_job].dtsc = tsc - last_tsc;
job_list[current_job].ctx = current_context;
current_job++;
last_tsc = tsc;
current_context = INT_CTX;
job_list[current_job].start = tsc;
state = 2;
break;
 
/* Int end */
case 3:
if (state != 2) Error(3);
job_list[current_job].dtsc = tsc - last_tsc;
job_list[current_job].ctx = current_context;
current_job++;
last_tsc = tsc;
current_context = par1;
 
for (i=0;i<context_number;i++)
if (par1 == context_list[i].ctx) break;
if (i == context_number) {
context_list[context_number].ctx = par1;
context_number++;
}
 
job_list[current_job].start = tsc;
state = 1;
break;
 
/* Change ctx */
case 4:
 
job_list[current_job].dtsc = tsc - last_tsc;
job_list[current_job].ctx = current_context;
current_job++;
last_tsc = tsc;
current_context = par1;
 
for (i=0;i<context_number;i++)
if (par1 == context_list[i].ctx) break;
if (i == context_number) {
context_list[context_number].ctx = par1;
context_number++;
}
 
job_list[current_job].start = tsc;
state = 1;
break;
 
/* Task create */
case 5:
 
for (i=0;i<context_number;i++)
if (par1 == context_list[i].ctx) break;
if (i == context_number) {
context_list[context_number].ctx = par1;
context_list[context_number].pid = par2;
context_number++;
}
 
break;
 
/* Task endcycle */
case 8:
 
for (i=0;i<context_number;i++)
if (par1 == context_list[i].ctx) break;
if (i == context_number) Error(4);
endcycle_list[current_endcycle].ctx = par1;
endcycle_list[current_endcycle].tsc = tsc;
current_endcycle++;
 
break;
 
}
 
if (current_job == MAXJOB-1) {
printf("Too many jobs...\n");
exit(3);
}
 
if (current_endcycle == MAXJOB-1) {
printf("Too many endcycle...\n");
exit(4);
}
 
if (state == 10) break;
 
}
 
printf("\nDelta TSC = %llu\n",log_end_tsc - log_start_tsc);
printf("Events [%8d]\n",k);
printf("Jobs [%8d]\n",current_job);
printf("EndCycles [%8d]\n",current_endcycle);
 
total_tsc = 0;
for (i=0;i<current_job;i++)
total_tsc += job_list[i].dtsc;
/* Jobs total execution check */
printf("\nJob TSC sum = %llu (%2.4f)\n",total_tsc,(float)total_tsc/((float)(log_end_tsc - log_start_tsc))*100.0);
 
/* Singel context total execution time */
 
for (k=0;k<context_number;k++) {
 
temp_tsc = 0;
 
for (i=0;i<current_job;i++)
if (job_list[i].ctx == context_list[k].ctx) temp_tsc += job_list[i].dtsc;
 
switch (context_list[k].pid) {
case PID_NO_DEF:
sprintf(pidstr,"NODEF");
break;
case INT_PID:
sprintf(pidstr," INT");
break;
default:
sprintf(pidstr,"%5d",context_list[k].pid);
break;
}
printf("Context [%5d:%s] total dTSC [%12llu]\n",context_list[k].ctx,pidstr,temp_tsc);
 
}
 
printf("\nPreemption Removing.... \n");
 
/* Remove preemption from the computation time */
 
current_cycle = 0;
endcycle_start_tsc = log_start_tsc;
 
for (h=0;h<current_endcycle;h++) {
 
endcycle_end_tsc = endcycle_list[h].tsc;
temp_ctx = endcycle_list[h].ctx;
temp_tsc = 0;
 
cycle_list[current_cycle].start = 0;
 
for(i=0;i<current_job;i++)
if (job_list[i].ctx == temp_ctx) {
if (job_list[i].start < endcycle_end_tsc &&
job_list[i].start >= endcycle_start_tsc) {
if (cycle_list[current_cycle].start == 0)
cycle_list[current_cycle].start = job_list[i].start;
temp_tsc += job_list[i].dtsc;
}
}
 
cycle_list[current_cycle].dtsc = temp_tsc;
cycle_list[current_cycle].ctx = temp_ctx;
current_cycle++;
 
endcycle_start_tsc = endcycle_end_tsc;
 
}
 
for (k=0;k<current_cycle;k++)
printf("Cycle CTX [%5d] Start [%12llu] dTSC [%12llu]\n",cycle_list[k].ctx,cycle_list[k].start,cycle_list[k].dtsc);
 
return 0;
 
}
 
/demos/trunk/newtrace/utils/pwcet_gen.c
68,16 → 68,19
tsc = 1;
break;
 
/* Tracer start */
case FTrace_EVT_trace_start:
printf("0 ");
tsc = 1;
break;
 
/* Tracer stop */
case FTrace_EVT_trace_stop:
printf("1 ");
tsc = 1;
break;
 
/* Interrupt start (int num) */
case FTrace_EVT_timer_wakeup_start:
case FTrace_EVT_interrupt_start:
printf("2 ");
84,18 → 87,43
tsc = 1;
break;
 
case FTrace_EVT_timer_wakeup_end:
/* Interrupt Stop (int num, or context num is int 3) */
case FTrace_EVT_timer_wakeup_end:
case FTrace_EVT_interrupt_end:
printf("3 ");
tsc = 1;
break;
 
/* Context to (context num) */
case FTrace_EVT_context_switch:
printf("4 ");
tsc = 1;
break;
 
/* Task Create (context num, pid num) */
case FTrace_EVT_task_create:
printf("5 ");
tsc = 1;
break;
 
/* Task Activate (context num) */
case FTrace_EVT_task_activate:
printf("6 ");
tsc = 1;
break;
/* Task End (context num) */
case FTrace_EVT_task_end:
printf("7 ");
tsc = 1;
break;
 
/* Task End-Cycle (context num) */
case FTrace_EVT_task_end_cycle:
printf("8 ");
tsc = 1;
break;
 
}
 
tsc_value = (unsigned long long)(*(unsigned int *)(p+4)) << 32;
124,6 → 152,22
printf("%d ",*(unsigned short int *)(p+2));
break;
 
case FTrace_EVT_task_create:
printf("%d %d",*(unsigned short int *)(p+2),*(unsigned int *)(p+12));
break;
 
case FTrace_EVT_task_activate:
printf("%d ",*(unsigned short int *)(p+2));
break;
 
case FTrace_EVT_task_end_cycle:
printf("%d ",*(unsigned short int *)(p+2));
break;
 
case FTrace_EVT_task_end:
printf("%d ",*(unsigned short int *)(p+2));
break;
 
}
 
printf("\n");
/demos/trunk/newtrace/utils/makefile
12,7 → 12,7
@echo Targets: util_dos util_linux clean
@echo Note: udpdump and list are available only under linux
 
util_linux: udpdump list pwcet_gen
util_linux: udpdump list pwcet_gen extract
 
udpdump: udpdump.c
gcc -Wimplicit-function-declaration -Wall -ggdb\
26,6 → 26,10
gcc -Wimplicit-function-declaration -Wall -ggdb\
-I$(BASE)/tracer/include -I$(BASE)/oslib pwcet_gen.c -o pwcet_gen
 
extract: extract.c
gcc -Wimplicit-function-declaration -Wall -ggdb\
-I$(BASE)/tracer/include -I$(BASE)/oslib extract.c -o extract
 
clean:
rm -rf *.o udpdump list pwcet_gen