Rev 1227 |
Rev 1229 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/* Event Generator
*
* Giacomo Guidi
*/
#include <stdio.h>
#include <stdlib.h>
#define EVENT_HEADER "event_header.h"
#define ACT_LIST "act_list.h"
#define ACT_SINGLE 0
#define ACT_PERIODIC 1
#define ACT_MEAN 2
#define ACT_INVALID 3
#define EXEC_CONST 0
#define EXEC_MEAN 1
#define EXEC_INVALID 2
int act_number
;
int write_struct
(void)
{
FILE
*file_event_header
;
file_event_header
= fopen(EVENT_HEADER
,"w");
if (file_event_header
== NULL
) return 1;
fprintf(file_event_header
, "\nstruct loader_task {\n");
fprintf(file_event_header
, "char name[20];\n");
fprintf(file_event_header
, "int number;\n");
fprintf(file_event_header
, "int group;\n");
fprintf(file_event_header
, "int server;\n");
fprintf(file_event_header
, "struct timespec deadline;\n");
fprintf(file_event_header
, "struct timespec wcet;\n");
fprintf(file_event_header
, "int act_number;\n");
fprintf(file_event_header
, "struct timespec *act;\n");
fprintf(file_event_header
, "struct timespec *exec;\n");
fprintf(file_event_header
, "};\n\n");
fprintf(file_event_header
, "#include \"%s\"\n\n",ACT_LIST
);
fprintf(file_event_header
, "struct loader_task loader_task_list[] = {\n");
fclose(file_event_header
);
return 0;
}
int select_basic_par
(char *task_name
)
{
int number
,group
,server
,deadline
,wcet
;
FILE
*file_event_header
;
printf("\nInsert the number of tasks\n");
printf("> ");
scanf("%d",&number
);
printf("Insert the group number\n");
printf("> ");
scanf("%d",&group
);
printf("Insert the server number\n");
printf("> ");
scanf("%d",&server
);
printf("Insert the deadline [us]\n");
printf("> ");
scanf("%d",&deadline
);
printf("Insert the wcet [us]\n");
printf("> ");
scanf("%d",&wcet
);
file_event_header
= fopen(EVENT_HEADER
,"a+");
if (file_event_header
== NULL
) return 1;
fprintf(file_event_header
, " {\"%s\",%d,%d,%d,{%d,%d},{%d,%d},%d,act_%s,exec_%s},\n",
task_name
,number
,group
,server
,deadline
/ 1000000, deadline
% 1000000 * 1000,
wcet
/ 1000000, wcet
% 1000000 * 1000, act_number
, task_name
, task_name
);
fclose(file_event_header
);
return 0;
}
int close_loader
()
{
FILE
*file_event_header
;
file_event_header
= fopen(EVENT_HEADER
,"a+");
if (file_event_header
== NULL
) return 1;
fprintf(file_event_header
,"};\n\n");
fclose(file_event_header
);
return 0;
}
int select_act_type
(void)
{
char act_type
[10];
printf("\nInsert the activation type\n");
printf(" S - Single\n");
printf(" P - Periodic\n");
printf(" M - Sporadic with constant distribution (Mean,Delta)\n");
printf("> ");
scanf("%s",act_type
);
switch (act_type
[0]) {
case 's':
case 'S':
return ACT_SINGLE
;
break;
case 'p':
case 'P':
return ACT_PERIODIC
;
break;
case 'm':
case 'M':
return ACT_MEAN
;
break;
default:
return ACT_INVALID
;
}
return ACT_INVALID
;
}
int select_exec_type
(void)
{
char exec_type
[10];
printf("\nInsert the execution time\n");
printf(" C - Const Exec Time\n");
printf(" M - Variable with constant distribution (Mean,Delta)\n");
printf("> ");
scanf("%s",exec_type
);
switch (exec_type
[0]) {
case 'c':
case 'C':
return EXEC_CONST
;
break;
case 'm':
case 'M':
return EXEC_MEAN
;
break;
default:
return EXEC_INVALID
;
}
return EXEC_INVALID
;
}
int write_single_act
(char *task_name
)
{
FILE
*file_act_header
;
int time_usec
;
file_act_header
= fopen(ACT_LIST
,"a+");
if (file_act_header
== NULL
) return 1;
act_number
= 1;
printf("\nInsert single activation time [us]\n");
printf("> ");
scanf("%d",&time_usec
);
fprintf(file_act_header
,"struct timespec act_%s[] = {{%d,%d}};\n\n",task_name
,
time_usec
/1000000,time_usec
%1000000*1000);
fclose(file_act_header
);
return 0;
}
int write_periodic_act
(char *task_name
)
{
FILE
*file_act_header
;
int i
,first_time_usec
,per_time_usec
;
long long tot_time_usec
;
file_act_header
= fopen(ACT_LIST
,"a+");
if (file_act_header
== NULL
) return 1;
printf("\nInsert the number of activations\n");
printf("> ");
scanf("%d",&act_number
);
printf("Insert first activation time [us]\n");
printf("> ");
scanf("%d",&first_time_usec
);
printf("Insert periodic activation time [us]\n");
printf("> ");
scanf("%d",&per_time_usec
);
fprintf(file_act_header
,"struct timespec act_%s[] = {{%d,%d},\n",task_name
,
first_time_usec
/1000000,first_time_usec
%1000000*1000);
tot_time_usec
= first_time_usec
;
for (i
=0;i
<act_number
-1;i
++) {
tot_time_usec
+= per_time_usec
;
fprintf(file_act_header
," {%d,%d},\n",
(int)tot_time_usec
/1000000,(int)tot_time_usec
%1000000*1000);
}
fprintf(file_act_header
," };\n\n");
fclose(file_act_header
);
return 0;
}
int write_mean_act
(char *task_name
)
{
FILE
*file_act_header
;
int i
,first_time_usec
,mean_time_usec
,delta_time_usec
;
long long tot_time_usec
;
file_act_header
= fopen(ACT_LIST
,"a+");
if (file_act_header
== NULL
) return 1;
printf("\nInsert the number of activations\n");
printf("> ");
scanf("%d",&act_number
);
printf("Insert first activation time [us]\n");
printf("> ");
scanf("%d",&first_time_usec
);
printf("Insert mean peridic time [us]\n");
printf("> ");
scanf("%d",&mean_time_usec
);
printf("Insert delta time [us]\n");
printf("> ");
scanf("%d",&delta_time_usec
);
fprintf(file_act_header
,"struct timespec act_%s[] = {{%d,%d},\n",task_name
,
first_time_usec
/1000000,first_time_usec
%1000000*1000);
tot_time_usec
= first_time_usec
;
for (i
=0;i
<act_number
-1;i
++) {
tot_time_usec
+= mean_time_usec
+ random
() % delta_time_usec
- delta_time_usec
/2;
fprintf(file_act_header
," {%d,%d},\n",
(int)tot_time_usec
/1000000,(int)tot_time_usec
%1000000*1000);
}
fprintf(file_act_header
," };\n\n");
fclose(file_act_header
);
return 0;
}
int write_exec_const
(char *task_name
)
{
FILE
*file_exec_header
;
int exec_time_usec
,i
;
file_exec_header
= fopen(ACT_LIST
,"a+");
if (file_exec_header
== NULL
) return 1;
printf("Insert execution time [us]\n");
printf("> ");
scanf("%d",&exec_time_usec
);
fprintf(file_exec_header
,"struct timespec exec_%s[] = {{%d,%d},\n",task_name
,
exec_time_usec
/1000000,exec_time_usec
%1000000*1000);
for (i
=0; i
< act_number
-1; i
++)
fprintf(file_exec_header
," {%d,%d},\n",
exec_time_usec
/1000000,exec_time_usec
%1000000*1000);
fprintf(file_exec_header
," };\n\n");
fclose(file_exec_header
);
return 0;
}
int write_exec_mean
(char *task_name
)
{
FILE
*file_exec_header
;
int exec_time_usec
,mean_time_usec
,delta_time_usec
,i
;
file_exec_header
= fopen(ACT_LIST
,"a+");
if (file_exec_header
== NULL
) return 1;
printf("Insert mean execution time [us]\n");
printf("> ");
scanf("%d",&mean_time_usec
);
printf("Insert delta execution time [us]\n");
printf("> ");
scanf("%d",&delta_time_usec
);
exec_time_usec
= mean_time_usec
+ random
() % delta_time_usec
- delta_time_usec
/ 2;
fprintf(file_exec_header
,"struct timespec exec_%s[] = {{%d,%d},\n",
exec_time_usec
/1000000,exec_time_usec
%1000000*1000);
for (i
=0; i
< act_number
-1; i
++) {
exec_time_usec
= mean_time_usec
+ random
() % delta_time_usec
- delta_time_usec
/ 2;
fprintf(file_exec_header
," {%d,%d},\n",
exec_time_usec
/1000000,exec_time_usec
%1000000*1000);
}
fprintf(file_exec_header
," };\n\n");
fclose(file_exec_header
);
return 0;
}
int main
(void) {
char task_name
[100];
char act_type
,exec_type
;
int err
;
printf("\nEvent Generator\n\n");
srandom
(12354132);
write_struct
();
while(1) {
printf("Insert the task name\n");
printf("Write \"q\" to quit program\n");
printf("> ");
scanf("%s",task_name
);
if (strlen(task_name
) == 1 && task_name
[0] == 'q') exit(0);
select_basic_par
(task_name
);
while((act_type
= select_act_type
()) == ACT_INVALID
) {
printf("Error: Invalid Act Type\n");
}
switch (act_type
) {
case ACT_SINGLE
:
err
= write_single_act
(task_name
);
if (err
!= 0) {
printf("Error writing activation header\n");
exit(1);
}
break;
case ACT_PERIODIC
:
err
= write_periodic_act
(task_name
);
if (err
!= 0) {
printf("Error writing activation header\n");
exit(1);
}
break;
case ACT_MEAN
:
err
= write_mean_act
(task_name
);
if (err
!= 0) {
printf("Error writing activation header\n");
exit(1);
}
break;
}
while((exec_type
= select_exec_type
()) == EXEC_INVALID
) {
printf("Error: Invalid Exec Type\n");
}
switch (exec_type
) {
case EXEC_CONST
:
err
= write_exec_const
(task_name
);
if (err
!= 0) {
printf("Error writing exec header\n");
exit(1);
}
break;
case EXEC_MEAN
:
err
= write_exec_mean
(task_name
);
if (err
!= 0) {
printf("Error writing exec header\n");
exit(1);
}
break;
}
}
close_loader
();
return 0;
}