Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1244 → Rev 1245

/demos/trunk/loader/func.h
8,7 → 8,7
#include "shark.h"
 
#define get_current_exec_task() exec_shadow
#define generic_calibration_func calibration_func
#define generic_get_server_from_contract get_server_from_contract
#define generic_create_thread fsf_create_thread
#define generic_calibrate_cycle calibrate_cycle
#define generic_set_next_activation set_next_activation
/demos/trunk/loader/fsfinit.c
1,51 → 1,46
#include "kernel/kern.h"
#include "fsf_server.h"
#include "fsf_contract.h"
#include "func.h"
 
extern struct loader_contract loader_contract_list[];
extern int total_loader_contract;
 
void fsfinit()
{
 
struct timespec period1 = {0,10000000}; //30%
struct timespec period2 = {0,30000000}; //20%
struct timespec period3 = {0,30000000}; //10%
struct timespec budget1 = {0,3000000};
struct timespec budget2 = {0,6000000};
struct timespec budget3 = {0,3000000};
struct loader_contract *c = loader_contract_list;
fsf_contract_parameters_t contract;
fsf_server_id_t server;
int i;
long long bw;
 
fsf_server_id_t server1 = -1;
fsf_server_id_t server2 = -1;
fsf_server_id_t server3 = -1;
fsf_server_id_t server4 = -1;
for (i=0;i<total_loader_contract;i++) {
 
fsf_contract_parameters_t contract;
fsf_initialize_contract(&contract);
 
int bw;
fsf_set_contract_basic_parameters(&contract,&c->cmin,&c->tmax,&c->cmax,&c->tmin,c->workload);
 
fsf_initialize_contract(&contract);
 
fsf_set_contract_basic_parameters(&contract,&budget1,&period1,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_negotiate_contract(&contract,&server1);
bw = MAX_BANDWIDTH / TIMESPEC2USEC(&period1) * TIMESPEC2USEC(&budget1);
cprintf("FSF SERVER LEVEL %d BW %d.%03d\n",server1, (int)( (long long)bw * 100 / MAX_BANDWIDTH),
(int)( (long long)bw * 100000 / MAX_BANDWIDTH % 1000));
if (c->local_scheduler != PAR_POSIX) {
fsf_set_contract_basic_parameters(&contract,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_negotiate_contract(&contract,&server2);
bw = MAX_BANDWIDTH / TIMESPEC2USEC(&period2) * TIMESPEC2USEC(&budget2);
cprintf("FSF SERVER LEVEL %d BW %d.%03d\n",server2, (int)( (long long)bw * 100 / MAX_BANDWIDTH),
(int)( (long long)bw * 100000 / MAX_BANDWIDTH % 1000));
switch (c->local_scheduler) {
case PAR_EDF:
fsf_set_local_scheduler_parameter(&contract,FSF_SCHEDULER_EDF);
break;
case PAR_RM:
fsf_set_local_scheduler_parameter(&contract,FSF_SCHEDULER_RM);
break;
}
 
fsf_set_contract_basic_parameters(&contract,&budget3,&period3,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_negotiate_contract(&contract,&server3);
bw = MAX_BANDWIDTH / TIMESPEC2USEC(&period3) * TIMESPEC2USEC(&budget3);
cprintf("FSF SERVER LEVEL %d BW %d.%03d\n",server3, (int)( (long long)bw * 100 / MAX_BANDWIDTH),
(int)( (long long)bw * 100000 / MAX_BANDWIDTH % 1000));
}
fsf_negotiate_contract(&contract,&server);
c->server = server;
bw = MAX_BANDWIDTH * TIMESPEC2USEC(&c->tmax) / TIMESPEC2USEC(&c->cmin);
cprintf("FSF CONTRACT %d SERVER %d MIN BW %d.%03d\n", c->number, c->server,
(int)(bw * 100 / MAX_BANDWIDTH),
(int)(bw * 100000 / MAX_BANDWIDTH % 1000));
fsf_set_contract_basic_parameters(&contract,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
fsf_set_local_scheduler_parameter(&contract, FSF_SCHEDULER_EDF);
fsf_negotiate_contract(&contract,&server4);
bw = MAX_BANDWIDTH / TIMESPEC2USEC(&period2) * TIMESPEC2USEC(&budget2);
cprintf("FSF SERVER LEVEL %d BW %d.%03d\n",server4, (int)( (long long)bw * 100 / MAX_BANDWIDTH),
(int)( (long long)bw * 100000 / MAX_BANDWIDTH % 1000));
}
 
}
/demos/trunk/loader/lparser.c
475,11 → 475,29
res = find_break(pbuf,PAR_TIME, &time, &val);
if (res == PAR_FOUND) {
#ifdef PARSER_DEBUG
printf(",[%ld][%ld]\n",time.tv_sec,time.tv_nsec/1000);
printf(",[%ld][%ld],",time.tv_sec,time.tv_nsec/1000);
#endif
TIMESPEC_ASSIGN(&lc->tmin,&time);
} else par_error(line_num);
 
res = find_break(pbuf,PAR_TASK_NUMBER, &time, &val);
if (res == PAR_FOUND) {
#ifdef PARSER_DEBUG
printf(",[%d]\n",val);
#endif
lc->workload = val;
} else par_error(line_num);
res = find_break(pbuf,PAR_LOCAL_SCHEDULER, &time, &val);
if (res == PAR_FOUND) {
#ifdef PARSER_DEBUG
printf("LOCAL SCHEDULER = %d\n",val);
#endif
lc->local_scheduler = val;
} else par_error(line_num);
return 2;
 
}
/demos/trunk/loader/shark.c
3,7 → 3,9
extern int cal_cycles;
extern struct timespec zero_time;
extern struct loader_task loader_task_list[];
extern struct loader_contract loader_contract_list[];
extern int total_loader_task;
extern int total_loader_contract;
 
/* Delay Calibration */
int calibrate_cycle()
13,7 → 15,10
 
kern_cli();
kern_gettime(&start);
for (i=0;i<CALIBRATION_DELTA;i++) kern_gettime(NULL);
for (i=0;i<CALIBRATION_DELTA;i++)
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t"
"cpuid\n\t"
:::"eax","ebx","ecx","edx");
kern_gettime(&end);
kern_sti();
 
25,6 → 30,19
 
}
 
int get_server_from_contract(int contract)
{
 
int i;
 
for(i=0;i<total_loader_contract;i++)
if (loader_contract_list[i].number == contract)
return loader_contract_list[i].server;
 
return -1;
 
}
 
void *get_task_model(struct loader_task *current) {
if (current->local_scheduler == PAR_POSIX) {
static NRT_TASK_MODEL nrt;
/demos/trunk/loader/event_gen.c
43,6 → 43,20
 
}
 
int write_contract_start(void)
{
FILE *file_event_header;
file_event_header = fopen(EVENT_DEFINE,"a+");
if (file_event_header == NULL) return 1;
fprintf(file_event_header, "struct loader_contract loader_contract_list[] = {\n");
fclose(file_event_header);
}
 
int write_basic_par(struct loader_task *c)
{
 
63,9 → 77,30
 
}
 
int close_loader(int total_task_number)
int write_contract(struct loader_contract *c)
{
FILE *file_event_header;
file_event_header = fopen(EVENT_DEFINE,"a+");
if (file_event_header == NULL) return 1;
fprintf(file_event_header, " {%d,{%d,%d},{%d,%d},{%d,%d},{%d,%d},%d,%d,-1},\n",
c->number,c->cmin.tv_sec,c->cmin.tv_nsec,
c->tmax.tv_sec,c->tmax.tv_nsec,
c->cmax.tv_sec,c->cmax.tv_nsec,
c->tmin.tv_sec,c->tmin.tv_nsec,
c->workload,c->local_scheduler);
 
fclose(file_event_header);
return 0;
}
 
int close_loader_task(int total_task_number)
{
 
FILE *file_event_header;
 
file_event_header = fopen(EVENT_DEFINE,"a+");
81,6 → 116,24
 
}
 
int close_loader_contract(int total_contract_number)
{
FILE *file_event_header;
file_event_header = fopen(EVENT_DEFINE,"a+");
if (file_event_header == NULL) return 1;
fprintf(file_event_header,"};\n\n");
fprintf(file_event_header,"int total_loader_contract = %d;\n\n",total_contract_number);
fclose(file_event_header);
return 0;
}
 
int write_single_act(struct timespec *t, struct loader_task *c)
{
 
232,6 → 285,7
struct loader_contract *start_loader_contract = NULL, *current_c;
int err,ldnum;
int total_task_number;
int total_contract_number;
 
printf("\nEvent Generator\n");
 
315,8 → 369,24
 
}
 
close_loader(total_task_number);
close_loader_task(total_task_number);
 
write_contract_start();
 
total_contract_number = 0;
current_c = start_loader_contract;
while(current_c != NULL) {
 
write_contract(current_c);
 
current_c = current_c->next;
total_contract_number++;
 
}
 
close_loader_contract(total_contract_number);
 
return 0;
 
}
/demos/trunk/loader/load.txt
1,12 → 1,19
# CONTRACT SECTION
#
# CONTRACT NUMBER:CMIN:TMAX:CMAX:TMIN:WORKLOAD
# CONTRACT NUMBER:CMIN:TMAX:CMAX:TMIN:WORKLOAD:LOCAL SCHEDULER
#
# CONTRACT NUMBER IS THE SERVER NUMBER
# WORKLOAD
# 0 BOUNDED
# 1 INDETERMINATED
#
# LOCAL SCHEDULER
# POSIX - DEFAULT FOR THE FRAMEWORK
# EDF
# RM
#
# TASK SECTION
#
# TASK TYPE:SERVER NUMBER:LOCAL SCHEDULER:NUMBER OF TASK:DEADLINE:WCET:TASK ACT TYPE (PAR1,PAR2,...):
# TASK TYPE:CONTRACT NUMBER:LOCAL SCHEDULER:NUMBER OF TASK:DEADLINE:WCET:TASK ACT TYPE (PAR1,PAR2,...):
# :TASK EXEC TYPE (PAR1,PAR2,...):CRITICAL SESSION (PAR1,PAR2,PAR3,PAR4);
#
# TASK TYPE
34,10 → 41,10
 
CONTRACT SECTION
 
[0]:[0][3000]:[0][10000]:[0][3000]:[0][10000];
[1]:[0][6000]:[0][30000]:[0][6000]:[0][30000];
[2]:[0][3000]:[0][30000]:[0][3000]:[0][30000];
[3]:[0][6000]:[0][30000]:[0][6000]:[0][30000];
[0]:[0][3000]:[0][10000]:[0][3000]:[0][10000]:[0]:POSIX;
[1]:[0][6000]:[0][30000]:[0][6000]:[0][30000]:[0]:POSIX;
[2]:[0][3000]:[0][30000]:[0][3000]:[0][30000]:[0]:POSIX;
[3]:[0][6000]:[0][30000]:[0][6000]:[0][30000]:[0]:POSIX;
 
END
 
/demos/trunk/loader/lparser.h
47,6 → 47,7
struct timespec cmax;
struct timespec tmin;
int workload;
int local_scheduler;
 
struct loader_contract *next;
 
/demos/trunk/loader/shark.h
10,6 → 10,6
void set_simulation_time (struct timespec *total);
void set_next_activation(struct timespec *next);
void loader_task_activate(struct loader_task *l);
int calibration_func();
int get_server_from_contract(int contract);
 
#endif
/demos/trunk/loader/event_gen.h
6,7 → 6,7
 
char name[20];
int task_type;
int server;
int contract;
int local_scheduler;
int number;
int group;
30,6 → 30,8
struct timespec cmax;
struct timespec tmin;
int workload;
int local_scheduler;
int server;
 
}
};
 
/demos/trunk/loader/newloader.c
27,7 → 27,10
 
exec_cycles = (long long)(TIMESPEC2USEC(&l->exec[act])) * CALIBRATION_DELTA / cal_cycles;
for (i=0;i<exec_cycles;i++) calibration_func();
for (i=0;i<exec_cycles;i++)
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t"
"cpuid\n\t"
:::"eax","ebx","ecx","edx");
generic_task_endcycle();
51,7 → 54,10
exec_cycles = (long long)(TIMESPEC2USEC(&l->exec[act])) * CALIBRATION_DELTA / cal_cycles;
for (i=0;i<exec_cycles;i++) calibration_func();
for (i=0;i<exec_cycles;i++)
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t"
"cpuid\n\t"
:::"eax","ebx","ecx","edx");
generic_task_endcycle();
78,7 → 84,10
exec_cycles = (long long)(TIMESPEC2USEC(&l->exec[0])) * CALIBRATION_DELTA / cal_cycles;
for (i=0;i<exec_cycles;i++) calibration_func();
for (i=0;i<exec_cycles;i++)
__asm__ __volatile__ ("xorl %%eax,%%eax\n\t"
"cpuid\n\t"
:::"eax","ebx","ecx","edx");
act++;
106,13 → 115,16
switch(current->task_type) {
case PAR_TASK_OS:
err = generic_create_thread(current->server,&j,NULL,oneshot_task,(void *)current,generic_get_task_model(current));
err = generic_create_thread(generic_get_server_from_contract(current->contract),&j,NULL,
oneshot_task,(void *)current,generic_get_task_model(current));
break;
case PAR_TASK_BT:
err = generic_create_thread(current->server,&j,NULL,back_task,(void *)current,generic_get_task_model(current));
err = generic_create_thread(generic_get_server_from_contract(current->contract),&j,NULL,
back_task,(void *)current,generic_get_task_model(current));
break;
case PAR_TASK_CT:
err = generic_create_thread(current->server,&j,NULL,periodic_task,(void *)current,generic_get_task_model(current));
err = generic_create_thread(generic_get_server_from_contract(current->contract),&j,NULL,
periodic_task,(void *)current,generic_get_task_model(current));
break;
}
if (err) {
/demos/trunk/loader/makefile
12,7 → 12,7
include $(BASE)/config/example.mk
 
newloader:
#make -f $(SUBMAKE) APP=newloader INIT= OTHEROBJS="fsfinit.o initfile.o shark.o eventc.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __FIRST__"
make -f $(SUBMAKE) APP=newloader INIT= OTHEROBJS="fsfinit.o initfile.o shark.o eventc.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __FIRST__"
gcc -o lread.o -c lread.c
gcc -o lparser.o -c lparser.c
gcc -o event_gen event_gen.c lparser.o lread.o