Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1670 pj 1
#include "hlpdemo.h"
2
#include <drivers/shark_keyb26.h>
3
 
4
/* #define DEBUG */
5
 
6
/* tipologia di task e mutex */
7
HARD_TASK_MODEL m;
8
 
9
/* scala temporale del sistema in us */
10
#define TIMESCALE (100 * 1000)
11
 
12
/* fine del mondo in TIMESCALE */
13
#define END_OF_WORLD 280
14
 
15
// utility
16
#define CURTIME ((sys_gettime(NULL) - start) / TIMESCALE)
17
 
18
void anykey(int sec)
19
{
20
  /*  char c;
21
  cprintf("Premere il tasto 'c' per continuare\n");
22
  do {
23
    c = keyb_getch(BLOCK);
24
    } while(c != 'c');*/
25
 
26
  TIME last;
27
  last = sys_gettime(NULL);
28
  while (sys_gettime(NULL) - last < sec * 1000 * 1000);
29
}
30
 
31
/* buffer che contiene la configurazione letto in nrt mode */
32
extern char myfilebuf[1000];
33
 
34
extern int read_conf(char *, unsigned int);
35
extern void print_taskconf(taskconf_list_t *);
36
 
37
void trace_info_hlp(void);
38
 
39
/* tempo dell'avvio */
40
TIME start;
41
 
42
/* struttura dati contenente la configurazione */
43
taskconf_list_t *taskconf = NULL;
44
 
45
/* lista dei mutex del sistema */
46
mutex_list_t *mutexes = NULL;
47
 
48
/*--------------------------------------------------------------*/
49
 
50
void load(int time, char *name)
51
{
52
  int i;
53
  TIME last;
54
 
55
  for (i = 0; i < time; i++)
56
    {
57
      last = sys_gettime(NULL);
58
      cprintf(".");
59
      while (sys_gettime(NULL) - last < TIMESCALE - TIMESCALE / 100);
60
    }
61
}
62
 
63
TASK    Ji(void *arg)
64
{
65
  taskconf_list_t *cur = (taskconf_list_t *)arg;
66
  action_list_t *act;
67
 
68
  while (1)
69
    {
70
 
71
      if (CURTIME > END_OF_WORLD)
72
        {
73
          task_kill(cur->pid);
74
          return 0;
75
        }
76
 
77
      act = cur->actionlist;
78
 
79
      while (act)
80
        {
81
          switch (act->type)
82
            {
83
            case LOAD:
84
              cprintf("%ld -- task: %s -- NonCritic section:(exec=%.2d,Shadow=%.2d),load %d",
85
                          CURTIME,
86
                          cur->name,
87
                          exec,
88
                          exec_shadow,
89
                          act->time);
90
 
91
              load(act->time, cur->name);
92
              cprintf("end %ld\n", CURTIME);
93
              break;
94
 
95
            case LOCK: /* task lock */
96
              cprintf("%ld -- Task %s -- locks mutex %s\n", CURTIME, cur->name, act->mutex->name);
97
              mutex_lock(&act->mutex->m);
98
              break;
99
 
100
            case UNLOCK: /* task unlock */
101
              cprintf("%ld -- Task %s -- unlocks mutex %s\n", CURTIME, cur->name, act->mutex->name);
102
              mutex_unlock(&act->mutex->m);
103
              break;
104
            }
105
 
106
          act = act->next;
107
        }
108
      task_endcycle();
109
    }
110
 
111
  return 0;
112
}
113
 
114
void trace_info_hlp()
115
{
116
  HLP_mutex_resource_des *m;
117
  RLEVEL l;
118
  HLP_mutex_t *mutscan;
119
  HLP_tasklist_t *taskscan;
120
  int i = 0;
121
 
122
  if (mutexes)
123
    {
124
      l = mutexes->m.mutexlevel;
125
      m = (HLP_mutex_resource_des *)(resource_table[l]);
126
 
127
      for (mutscan = m->mutexlist; mutscan; mutscan = mutscan->next)
128
        {
129
          cprintf("mutex: %p owner=%d, used by\n", mutscan, mutscan->owner);
130
 
131
          for (i = 1, taskscan = mutscan->tasklist; taskscan; taskscan = taskscan->next, i++)
132
            {
133
              cprintf("task: %p, pid=%d, preempt=%ld\n",
134
                      taskscan,
135
                      taskscan->pid,
136
                      taskscan->preempt);
137
            }
138
        }
139
 
140
      cprintf("All tasks:\n");
141
 
142
      if (taskconf)
143
        for (taskscan = m->tasklist; taskscan; taskscan = taskscan->next, i++)
144
          {
145
            cprintf("task: %p, pid=%d, preempt=%ld\n",
146
                    taskscan,
147
                    taskscan->pid,
148
                    taskscan->preempt);
149
          }
150
    }
151
  else
152
    {
153
      cprintf("No mutexes\n");
154
    }
155
 
156
}
157
 
158
/****************************** MAIN ******************************/
159
 
160
int main(int argc, char **argv)
161
{
162
  int i = 0,  numtask = 0, nummutex = 0;
163
  taskconf_list_t *curtask = NULL;
164
  mutex_list_t *mutexlist = NULL, *curmut = NULL;
165
  PID pid = NIL;
166
 
167
  HLP_mutexattr_t a;
168
  HLP_RES_MODEL r;
169
 
170
 
171
  if (read_conf(myfilebuf, 1000) == -1)
172
    {
173
      sys_shutdown_message("Error reading configuration file");
174
      sys_end();
175
    }
176
 
177
  clear();
178
  print_taskconf(taskconf);
179
  anykey(5);
180
 
181
  for (curtask = taskconf; curtask != NULL; curtask = curtask->next)
182
    numtask++;
183
 
184
  curtask = taskconf;
185
 
186
  for (curmut = mutexes; curmut; curmut = curmut->next)
187
    {
188
      HLP_mutexattr_default(a);
189
      mutex_init(&(curmut->m), &a);
190
    }
191
 
192
  while (curtask) {
193
 
194
    hard_task_default_model(m);
195
    hard_task_def_level(m,0);
196
    hard_task_def_ctrl_jet(m);
197
    hard_task_def_periodic(m);
198
    hard_task_def_wcet(m, (curtask->wcet + 2) * TIMESCALE);
199
    hard_task_def_mit(m, curtask->period * TIMESCALE);
200
    hard_task_def_arg(m,(void *)curtask);
201
    hard_task_def_group(m, 1);
202
 
203
    /* registro i mutex per il pid */
204
    nummutex = 0;
205
    mutexlist = curtask->mutexlist;
206
    while(mutexlist) {
207
      mutexlist = mutexlist->next;
208
      nummutex++;
209
    }
210
 
211
    HLP_res_default_model(r, 1000 - curtask->period );
212
 
213
    switch (nummutex) {
214
    case 0:
215
      pid = task_create(curtask->name, Ji, &m, &r);
216
      break;
217
    case 1:
218
      pid = task_createn(curtask->name, Ji, (TASK_MODEL *)&m, &r,
219
                         HLP_usemutex(&(curtask->mutexlist->m)), NULL);
220
      break;
221
 
222
    case 2:
223
      pid = task_createn(curtask->name, Ji, (TASK_MODEL *)&m, &r,
224
                         HLP_usemutex(&(curtask->mutexlist->m)),
225
                         HLP_usemutex(&(curtask->mutexlist->next->m)), NULL);
226
      break;
227
    case 3:
228
      pid = task_createn(curtask->name, Ji, (TASK_MODEL *)&m, &r,
229
                         HLP_usemutex(&(curtask->mutexlist->m)),
230
                         HLP_usemutex(&(curtask->mutexlist->next->m)),
231
                         HLP_usemutex(&(curtask->mutexlist->next->next->m)), NULL);
232
      break;
233
    default:
234
      sys_shutdown_message("Too many mutexes! I am stupid!");
235
      sys_end();
236
    }
237
 
238
    if (pid == NIL)
239
      {
240
        sys_shutdown_message("Could not create task %s", curtask->name);
241
        sys_end();
242
        print_taskconf(curtask);
243
        perror("errore nella creazione del task");
244
        return 0;
245
      }
246
    else
247
      {
248
        cprintf("Task %s pid %d creato con successo!\n", curtask->name, pid);
249
      }
250
    curtask->pid = pid;
251
    curtask->i = i++;
252
 
253
    curtask = curtask->next;
254
  }
255
 
256
#ifndef USESRP
257
  clear();
258
  cprintf("informazioni dal modulo HLP:\n");
259
  trace_info_hlp();
260
  anykey(5);
261
#endif
262
  clear();
263
  cprintf("Attivazione dei task\n");
264
  anykey(2);
265
  start = sys_gettime(NULL);
266
  group_activate(1);
267
 
268
  while(keyb_getch(BLOCK) != 27); // Ascii code of ESC == 27
269
  anykey(20);
270
 
271
  sys_end();
272
 
273
  return 0;
274
 
275
}
276
 
277
/*--------------------------------------------------------------*/