/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}; |
fsf_server_id_t server1 = -1; |
fsf_server_id_t server2 = -1; |
fsf_server_id_t server3 = -1; |
fsf_server_id_t server4 = -1; |
struct loader_contract *c = loader_contract_list; |
fsf_contract_parameters_t contract; |
fsf_server_id_t server; |
int i; |
long long bw; |
int bw; |
for (i=0;i<total_loader_contract;i++) { |
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)); |
fsf_set_contract_basic_parameters(&contract,&c->cmin,&c->tmax,&c->cmax,&c->tmin,c->workload); |
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)); |
if (c->local_scheduler != PAR_POSIX) { |
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_set_contract_basic_parameters(&contract,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD); |
switch (c->local_scheduler) { |
case PAR_EDF: |
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)); |
break; |
case PAR_RM: |
fsf_set_local_scheduler_parameter(&contract,FSF_SCHEDULER_RM); |
break; |
} |
} |
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)); |
} |
} |
/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,7 → 77,7 |
} |
int close_loader(int total_task_number) |
int write_contract(struct loader_contract *c) |
{ |
FILE *file_event_header; |
71,6 → 85,27 |
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+"); |
if (file_event_header == NULL) return 1; |
fprintf(file_event_header,"};\n\n"); |
fprintf(file_event_header,"int total_loader_task = %d;\n\n",total_task_number); |
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 |