9,6 → 9,9 |
/* Calibration Loops */ |
#define CALIBRATION_DELTA 1000000 |
|
/* Mutex number */ |
#define MAX_MUTEX 10 |
|
/* Activate task output */ |
#define TASK_OUTPUT |
|
19,6 → 22,8 |
int cal_rit_calc_mean = 0; |
int cal_rit_calc_gauss = 0; |
|
mutex_t mux_table[MAX_MUTEX]; |
|
/* Not Real-Time Task */ |
TASK nrt_test_task(void *arg) |
{ |
25,6 → 30,9 |
long long i,exec_cycles = 0; |
int exec_1,exec_2,exec_3; |
int act_1,act_2,act_3,next_act; |
int crit_1 = 0,crit_2 = 0,crit_3 = 0,crit_4 = 0; |
int crit_start,crit_len; |
long long crit_start_cycles = 0, crit_len_cycles = 0; |
struct timespec next_time; |
static int act= 0; |
struct loader_task *l = (struct loader_task *)(arg); |
31,10 → 39,6 |
|
act++; |
|
#ifdef TASK_OUTPUT |
cprintf("(Act %d Pid %d Grp %d Lev %d)",act,exec_shadow,l->group,l->task_level); |
#endif |
|
act_1 = TIMESPEC2USEC(&l->act_par_2); |
act_2 = TIMESPEC2USEC(&l->act_par_3); |
act_3 = TIMESPEC2USEC(&l->act_par_4); |
62,8 → 66,15 |
exec_2 = TIMESPEC2USEC(&l->exec_par_2); |
exec_3 = TIMESPEC2USEC(&l->exec_par_3); |
|
if (l->crit_type == PAR_CRIT) { |
crit_1 = TIMESPEC2USEC(&l->crit_par_1); |
crit_2 = TIMESPEC2USEC(&l->crit_par_2); |
crit_3 = TIMESPEC2USEC(&l->crit_par_3); |
crit_4 = TIMESPEC2USEC(&l->crit_par_4); |
} |
|
#ifdef TASK_OUTPUT |
printf_xy(exec_shadow % 20 + 60, exec_shadow / 20, GREEN, "S"); |
printf_xy(exec_shadow % 20 + 60, exec_shadow / 20, GREEN, "R"); |
#endif |
|
if (l->exec_type == PAR_EXEC_CONST) |
80,8 → 91,34 |
if (l->exec_type == PAR_EXEC_GAUSS_MAX) |
exec_cycles = 0; |
|
for (i=0;i<exec_cycles;i++); |
if (l->crit_type == PAR_CRIT) { |
crit_start = crit_1 + rand() % crit_2 - crit_2/2; |
crit_len = crit_3 + rand() % crit_4 - crit_4/2; |
crit_start_cycles = (long long)(crit_start) * CALIBRATION_DELTA / cal_cycles; |
crit_len_cycles = (long long)(crit_len) * CALIBRATION_DELTA / cal_cycles; |
exec_cycles -= crit_start_cycles + crit_len_cycles; |
if (exec_cycles < 0) { |
cprintf("Error: exec_cycles < 0\n"); |
sys_end(); |
} |
} |
|
if (l->crit_type == PAR_NO_CRIT) |
for (i=0;i<exec_cycles;i++); |
else { |
for (i=0;i<crit_start_cycles;i++); |
#ifdef TASK_OUTPUT |
printf_xy(exec_shadow % 20 + 59, exec_shadow / 20, RED,"B"); |
#endif |
mutex_lock(&mux_table[l->resource]); |
for (i=0;i<crit_len_cycles;i++); |
mutex_unlock(&mux_table[l->resource]); |
#ifdef TASK_OUTPUT |
printf_xy(exec_shadow % 20 + 59, exec_shadow / 20, GREEN,"R"); |
#endif |
for (i=0;i<exec_cycles;i++); |
} |
|
#ifdef TASK_OUTPUT |
printf_xy(exec_shadow % 20 + 60, exec_shadow / 20, WHITE, "E"); |
#endif |
96,6 → 133,9 |
long long i,exec_cycles = 0; |
int exec_1,exec_2,exec_3; |
int act_1,act_2,act_3,next_act; |
int crit_1 = 0,crit_2 = 0,crit_3 = 0,crit_4 = 0; |
int crit_start,crit_len; |
long long crit_start_cycles = 0, crit_len_cycles = 0; |
struct timespec next_time; |
static int act=0; |
int extra_rit, k; |
103,10 → 143,6 |
|
act++; |
|
#ifdef TASK_OUTPUT |
cprintf("(Act %d Pid %d Grp %d Lev %d)",act,exec_shadow,l->group,l->task_level); |
#endif |
|
act_1 = TIMESPEC2USEC(&l->act_par_2); |
act_2 = TIMESPEC2USEC(&l->act_par_3); |
act_3 = TIMESPEC2USEC(&l->act_par_4); |
117,6 → 153,13 |
|
extra_rit = cal_rit_start; |
|
if (l->crit_type == PAR_CRIT) { |
crit_1 = TIMESPEC2USEC(&l->crit_par_1); |
crit_2 = TIMESPEC2USEC(&l->crit_par_2); |
crit_3 = TIMESPEC2USEC(&l->crit_par_3); |
crit_4 = TIMESPEC2USEC(&l->crit_par_4); |
} |
|
k = 0; |
|
while(1) { |
155,10 → 198,36 |
|
if (l->exec_type == PAR_EXEC_GAUSS_MAX) |
exec_cycles = 0; |
|
|
if (l->crit_type == PAR_CRIT) { |
crit_start = crit_1 + rand() % crit_2 - crit_2/2; |
crit_len = crit_3 + rand() % crit_4 - crit_4/2; |
crit_start_cycles = (long long)(crit_start) * CALIBRATION_DELTA / cal_cycles; |
crit_len_cycles = (long long)(crit_len) * CALIBRATION_DELTA / cal_cycles; |
exec_cycles -= crit_start_cycles + crit_len_cycles; |
if (exec_cycles < 0) { |
cprintf("Error: exec_cycles < 0\n"); |
sys_end(); |
} |
} |
|
extra_rit = 0; |
|
for (i=0;i<exec_cycles;i++); |
if (l->crit_type == PAR_NO_CRIT) |
for (i=0;i<exec_cycles;i++); |
else { |
for (i=0;i<crit_start_cycles;i++); |
#ifdef TASK_OUTPUT |
printf_xy(exec_shadow % 20 + 59, exec_shadow / 20, k,"B"); |
#endif |
mutex_lock(&mux_table[l->resource]); |
for (i=0;i<crit_len_cycles;i++); |
mutex_unlock(&mux_table[l->resource]); |
#ifdef TASK_OUTPUT |
printf_xy(exec_shadow % 20 + 59, exec_shadow / 20, k,"X"); |
#endif |
for (i=0;i<exec_cycles;i++); |
} |
|
task_endcycle(); |
|
222,6 → 291,31 |
|
} |
|
/* Mutex create */ |
void loader_mutex_create(struct loader_task *start_loader_task) |
{ |
|
struct loader_task *current = start_loader_task; |
int res = 0; |
PI_mutexattr_t a; |
|
PI_mutexattr_default(a); |
|
while (current != NULL) { |
|
if (current->crit_type == PAR_CRIT) { |
mutex_init(&mux_table[current->resource],&a); |
res++; |
} |
|
current = current->next; |
|
} |
|
cprintf("Created %d mutex\n",res); |
|
} |
|
/* Task create */ |
void loader_task_create(struct loader_task *start_loader_task) |
{ |
378,6 → 472,8 |
|
calibrate_cycle(); |
|
loader_mutex_create(start_loader_task); |
|
loader_task_create(start_loader_task); |
|
kern_gettime(&zero_time); |