Rev 1241 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
#include <kernel/kern.h>
#include "fsf_contract.h"
#include "fsf_server.h"
#include "func.h"
/* Activate task output */
#define TASK_OUTPUT
int cal_cycles
=0;
struct timespec zero_time
;
extern struct loader_task
*loader_task_list
;
extern int total_loader_task
;
/* oneshot Soft and hard Task */
void *oneshot_task
(void *arg
)
{
long long i
,exec_cycles
= 0;
int act
= 0;
struct loader_task
*l
= (struct loader_task
*)(arg
);
char tmp
[20];
#ifdef TASK_OUTPUT
sprintf(tmp
,"X[%06d]",act
);
printf_xy
((get_current_exec_task
() % 5) * 9 + 34,get_current_exec_task
() / 5 + 5, GREEN
, tmp
);
#endif
exec_cycles
= (long long)(TIMESPEC2USEC
(&l
->exec
[act
])) * CALIBRATION_DELTA
/ cal_cycles
;
for (i
=0;i
<exec_cycles
;i
++) calibration_func
();
generic_task_endcycle
();
return NULL
;
}
void * periodic_task
(void *arg
)
{
long long i
,exec_cycles
= 0;
int act
= 0;
struct loader_task
*l
= (struct loader_task
*)(arg
);
char tmp
[20];
while(1) {
#ifdef TASK_OUTPUT
sprintf(tmp
,"X[%06d]",act
);
printf_xy
((get_current_exec_task
() % 5) * 9 + 34,get_current_exec_task
() / 5 + 5, GREEN
, tmp
);
#endif
exec_cycles
= (long long)(TIMESPEC2USEC
(&l
->exec
[act
])) * CALIBRATION_DELTA
/ cal_cycles
;
for (i
=0;i
<exec_cycles
;i
++) calibration_func
();
generic_task_endcycle
();
act
++;
}
return NULL
;
}
void * back_task
(void *arg
)
{
long long i
,exec_cycles
= 0;
int act
= 0;
struct loader_task
*l
= (struct loader_task
*)(arg
);
char tmp
[20];
while(1) {
#ifdef TASK_OUTPUT
sprintf(tmp
,"X[%06d]",act
);
printf_xy
((get_current_exec_task
() % 5) * 9 + 34,get_current_exec_task
() / 5 + 5, GREEN
, tmp
);
#endif
exec_cycles
= (long long)(TIMESPEC2USEC
(&l
->exec
[0])) * CALIBRATION_DELTA
/ cal_cycles
;
for (i
=0;i
<exec_cycles
;i
++) calibration_func
();
act
++;
}
return NULL
;
}
/* Task create */
/* this function create the task struct in memory */
void loader_task_create
()
{
struct loader_task
*current
= loader_task_list
;
int i
=0, k
=0;
while (k
<total_loader_task
) {
k
++;
for (i
=0; i
< current
->number
; i
++) {
pthread_t j
;
int err
;
cprintf
("(tp%d)",current
->task_type
);
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
));
break;
case PAR_TASK_BT
:
err
= generic_create_thread
(current
->server
,&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
));
break;
}
if (err
) {
cprintf
("Error fsf task creating\n");
sys_end
();
}
}
current
= &loader_task_list
[k
];
}
cprintf
("Created %d loader tasks\n",k
);
}
int start_environment
()
{
struct timespec total
= {20,0};
generic_calibrate_cycle
();
kern_gettime
(&zero_time
);
generic_fsfinit
();
loader_task_create
();
generic_set_simulation_time
(&total
);
generic_start_simulation
();
return 0;
}