Subversion Repositories shark

Rev

Rev 1255 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1254 giacomo 1
#include "func.h"
2
 
3
extern int cal_cycles;
4
extern struct timespec zero_time;
5
extern struct loader_task loader_task_list[];
6
extern struct loader_contract loader_contract_list[];
7
extern int total_loader_task;
8
extern int total_loader_contract;
9
 
10
/* Delay Calibration */
11
int calibrate_cycle()
12
{
13
  long long i;
14
  struct timespec start,end,diff;
15
 
16
  if (cal_cycles != 0) return;
17
 
18
  kern_cli();
19
  kern_gettime(&start);
20
  for (i=0;i<CALIBRATION_DELTA;i++)
21
    __asm__ __volatile__ ("xorl %%eax,%%eax\n\t"
22
                          "cpuid\n\t"
23
                          :::"eax","ebx","ecx","edx");
24
  kern_gettime(&end);
25
  kern_sti();
26
 
27
  SUBTIMESPEC(&end,&start,&diff);
28
  cal_cycles = TIMESPEC2USEC(&diff);
29
  cprintf("Calibration usec/[%d cycles] = %d\n",CALIBRATION_DELTA,cal_cycles);
30
 
31
  return 0;
32
 
33
}
34
 
35
int get_server_from_contract(int contract)
36
{
37
 
38
  int i;
39
 
40
  for(i=0;i<total_loader_contract;i++)
41
    if (loader_contract_list[i].number == contract)
42
      return loader_contract_list[i].server;
43
 
44
  return -1;
45
 
46
}
47
 
48
void *get_task_model(struct loader_task *current) {
49
  if (current->local_scheduler == PAR_POSIX) {
50
    static NRT_TASK_MODEL nrt;
51
 
52
    nrt_task_default_model(nrt);
53
    nrt_task_def_save_arrivals(nrt);
54
    nrt_task_def_ctrl_jet(nrt);
55
    nrt_task_def_group(nrt,current->group);
56
    nrt_task_def_usemath(nrt);
57
 
58
    return &nrt;
59
 
60
  }  
61
 
62
  if (current->local_scheduler == PAR_EDF) {
63
    static HARD_TASK_MODEL ht;
64
 
65
    hard_task_default_model(ht);
66
    hard_task_def_ctrl_jet(ht);          
67
    hard_task_def_mit(ht,TIMESPEC2USEC(&current->deadline));
68
    hard_task_def_wcet(ht,TIMESPEC2USEC(&current->wcet));
69
    hard_task_def_group(ht,current->group);
70
    hard_task_def_usemath(ht);
71
    return &ht;
72
  }  
73
 
74
 
75
  if (current->local_scheduler == PAR_RM) {
76
    static HARD_TASK_MODEL ht;
77
 
78
    hard_task_default_model(ht);
79
    hard_task_def_mit(ht,TIMESPEC2USEC(&current->deadline));
80
    hard_task_def_wcet(ht,TIMESPEC2USEC(&current->wcet));
81
    hard_task_def_ctrl_jet(ht);
82
    hard_task_def_group(ht,current->group);
83
    hard_task_def_usemath(ht);
84
    return &ht;
85
  }  
86
 
87
  return NULL;
88
 
89
}  
90
 
91
void set_simulation_time (struct timespec *total) {
92
  struct timespec end_time;
93
 
94
  ADDTIMESPEC(&zero_time,total,&end_time);
95
  kern_event_post(&end_time,(void *)((void *)(sys_end)),NULL);
96
 
97
}
98
 
99
int calibration_func() {
100
  return kern_gettime(NULL);
101
 
102
}
103
 
104
void start_simulation() {
105
 
106
  int i;
107
  struct loader_task *l = loader_task_list;
108
  struct timespec end_time;
109
 
110
  i  = 0;
111
 
112
  kern_gettime(&zero_time);
113
 
114
  while (i < total_loader_task) {
115
 
116
    if (l->act_number > 0) {
117
      ADDTIMESPEC(&zero_time, &l->act[0], &end_time);
118
      l->act_current++;
119
      kern_event_post(&end_time,(void *)((void *)(loader_task_activate)),l);
120
    }
121
 
122
    i++;
123
    l=&loader_task_list[i];
124
 
125
  }
126
 
127
}
128
 
129
 
130
void loader_task_activate(struct loader_task *l) {
131
 
132
  struct timespec actual_time,end_time;
133
 
134
  kern_gettime(&actual_time);
135
  group_activate(l->group);
136
 
137
  if (l->act_number > l->act_current) {
138
 
139
    ADDTIMESPEC(&actual_time, &l->act[l->act_current], &end_time);
140
 
141
    l->act_current++;
142
    kern_event_post(&end_time,(void *)((void *)(loader_task_activate)),l);
143
 
144
  }
145
 
146
}