Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1562 trimarchi 1
/*
2
 * Project: S.Ha.R.K.
3
 *
4
 * Coordinators:
5
 *   Giorgio Buttazzo    <giorgio@sssup.it>
6
 *   Paolo Gai           <pj@gandalf.sssup.it>
7
 *
8
 * Authors     :
9
 *   Giacomo Guidi       <giacomo@gandalf.sssup.it>
10
 *
11
 * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
12
 *
13
 * http://www.sssup.it
14
 * http://retis.sssup.it
15
 * http://shark.sssup.it
16
 */
17
 
18
/*
19
 * Copyright (C) 2000 Paolo Gai
20
 *
21
 * This program is free software; you can redistribute it and/or modify
22
 * it under the terms of the GNU General Public License as published by
23
 * the Free Software Foundation; either version 2 of the License, or
24
 * (at your option) any later version.
25
 *
26
 * This program is distributed in the hope that it will be useful,
27
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29
 * GNU General Public License for more details.
30
 *
31
 * You should have received a copy of the GNU General Public License
32
 * along with this program; if not, write to the Free Software
33
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
34
 */
35
 
36
#include "kernel/kern.h"
37
 
38
#include "fsf.h"
39
#include "fsf_server.h"
40
 
41
#include "stdlib.h"
42
#include "unistd.h"
43
#include "string.h"
44
#include "pistar.h"
45
 
46
#include "pthread.h"
47
 
48
#include "drivers/glib.h"
49
#include "global.h"
50
 
51
#include <drivers/shark_keyb26.h>
52
 
53
 
54
char *readFilePortName = "readFilePort";
55
char *displayPortName = "displayPortName";
56
 
57
#define TEST_PERIOD 50000
58
 
59
mutex_t mux;
60
int main_chunk;
61
 
62
 
63
 
64
 
65
 
66
void program_end()
67
{
68
 
69
  grx_close();
70
  exit(0);
71
}
72
 
73
void *mpeg2decoder(void *arg);
74
void *readTask(void *arg);
75
void *displayTask(void *arg);
76
void *overLoadTask(void *arg);
77
 
78
/***************************************************************
79
 *
80
 * Create the display task and bind it to a server
81
 *
82
 * Author: Robert Bäckgren
83
 ******************************************************************/
84
void addDisplayTaskToServer(fsf_server_id_t server)
85
{
86
  int err;
87
  pthread_t j = -1;
88
  HARD_TASK_MODEL ht;
89
  static fsf_sched_params_t pr;
90
 
91
 
92
  pr.policy=FSF_EDF;
93
  pr.params=&ht;
94
 
95
 
96
  hard_task_default_model(ht);
97
  hard_task_def_mit(ht,40000);
98
  hard_task_def_wcet(ht,18000);
99
  nrt_task_def_group(ht,3);
100
 
101
 
102
  err = pthread_create(&j, NULL, displayTask, NULL);
103
  if (err) {  
104
    grx_close();
105
      grx_text("failed to create displayTask",0,0,rgb16(255,255,255),0);
106
    exit(err);
107
  }
108
 
109
 err=fsf_bind_local_thread_to_server(server, j,(fsf_sched_params_t *)(&pr));
110
 if (err) {
111
   grx_close();
112
   exit(err);
113
 
114
 }
115
}
116
 
117
/*********************************************************************'
118
 *
119
 * Create the input task and bind it to a server
120
 *
121
 * Author: Robert Bäckgren
122
 *********************************************************************/
123
void addReadTaskToServer(fsf_server_id_t server)
124
{
125
  int err;
126
  pthread_t j = -1;
127
  NRT_TASK_MODEL ht;
128
  static fsf_sched_params_t pr;
129
 
130
 
131
  pr.policy=FSF_RR;
132
  pr.params=&ht;
133
 
134
 
135
  nrt_task_default_model(ht);
136
  nrt_task_def_group(ht,1);
137
 
138
 
139
  err = pthread_create(&j, NULL, readTask, NULL);
140
  if (err) {  
141
    grx_close();
142
    perror("Could not create task...");
143
    exit(err);
144
  }
145
 
146
 err=fsf_bind_local_thread_to_server(server, j,(fsf_sched_params_t *)(&pr));
147
 if (err) {
148
   grx_close();
149
   //perror("Could not bind task..");
150
   exit(err);
151
 }
152
}
153
 
154
/**********************************************************************
155
 *
156
 * Create the decoder task and bind it to a server
157
 *
158
 * Author: Robert Bäckgren
159
 **********************************************************************/
160
void addDecoderThreadToServer(fsf_server_id_t server)
161
{
162
 
163
  int err;
164
  pthread_t j = -1;
165
  NRT_TASK_MODEL ht;
166
  static fsf_sched_params_t pr;
167
 
168
 
169
 
170
  pr.policy=FSF_RR;
171
  pr.params=&ht;
172
 
173
 
174
  nrt_task_default_model(ht);
175
  nrt_task_def_group(ht,1);
176
 
177
 
178
  err = pthread_create(&j, NULL, mpeg2decoder, NULL);
179
  if (err) {  
180
    grx_close();
181
    perror("Could not create task...");
182
    exit(err);
183
  }
184
 
185
 err=fsf_bind_local_thread_to_server(server, j,(fsf_sched_params_t *)(&pr));
186
 if (err) {
187
   grx_close();
188
   //perror("Could not bind task..");
189
   exit(err);
190
}
191
}
192
 
193
 
194
/***************************************************************************
195
 *
196
 * Create a dummy task and bind it to a server
197
 *
198
 * Author: Robert Bäckgren
199
 *****************************************************************************/
200
int  addOverLoadTaskToServer(fsf_server_id_t server)
201
{
202
  int err;
203
  pthread_t j = -1;
204
  HARD_TASK_MODEL ht;
205
  static fsf_sched_params_t pr;
206
 
207
 
208
 
209
  pr.policy=FSF_EDF;
210
  pr.params=&ht;
211
 
212
 
213
  hard_task_default_model(ht);
214
  hard_task_def_mit(ht,200000);
215
  hard_task_def_wcet(ht,20000);
216
  nrt_task_def_group(ht,4);
217
 
218
 
219
  err = pthread_create(&j, NULL, overLoadTask, NULL);
220
  if (err) {
221
   grx_text("Failed to create the decoder task",270,270,rgb16(255,255,255),0);  
222
    return 0;
223
  }
224
 
225
 err=fsf_bind_local_thread_to_server(server, j,(fsf_sched_params_t *)(&pr));
226
 if (err) {
227
   grx_close();
228
   //perror("Could not bind task..");
229
   exit(err);
230
 }
231
 
232
 return 1;
233
}
234
void ending_system(KEY_EVT *e) {
235
 
236
  grx_close();
237
 
238
  exit(0);
239
}
240
 
241
 
242
int main(int argc, char **argv)
243
{
244
 
245
  char ch;
246
  int err;
247
  int i = 1;
248
  char tmp[100];
249
  //KEY_EVT k;
250
 
251
  PI_mutexattr_t a;
252
  KEY_EVT ev;
253
 
254
 
255
  struct timespec decoderPeriod = {0,30000000};
256
  struct timespec decoderBudget = {0,3000000};
257
 
258
  struct timespec readTaskPeriod = {0,30000000};
259
  struct timespec readTaskBudget = {0,3000000};
260
 
261
  struct timespec displayPeriod = {0,40000000};
262
  struct timespec displayBudget = {0,18000000};
263
 
264
  // 30 %
265
  struct timespec overloadPeriod = {0,10000000};
266
  struct timespec overloadBudget = {0,3000000};
267
 
268
  fsf_server_id_t decoderServer;
269
  fsf_server_id_t readTaskServer;
270
  fsf_server_id_t displayServer;
271
  fsf_server_id_t overloadServer;
272
 
273
  fsf_contract_parameters_t overloadContract;
274
  fsf_contract_parameters_t decoderContract;
275
  fsf_contract_parameters_t readTaskContract;
276
  fsf_contract_parameters_t displayContract;
277
 
278
  union sigval sval;
279
 
280
 
281
  ev.ascii = 'c';
282
  ev.scan  = KEY_C;
283
  ev.status = KEY_PRESSED;
284
  ev.flag = CNTR_BIT;
285
  keyb_hook(ev, ending_system, FALSE);
286
 
287
  PI_mutexattr_default(a);
288
  FSF_start_service_task();
289
 
290
  mutex_init(&mux,&a);
291
 
292
  // Set up the different servers
293
  fsf_initialize_contract(&readTaskContract);
294
  fsf_set_contract_basic_parameters(&readTaskContract,&readTaskBudget,&readTaskPeriod,FSF_DEFAULT_WORKLOAD);
295
  fsf_set_contract_scheduling_policy(&readTaskContract, FSF_RR);
296
 
297
  fsf_initialize_contract(&decoderContract);
298
  fsf_set_contract_basic_parameters(&decoderContract,&decoderBudget,&decoderPeriod,FSF_DEFAULT_WORKLOAD);
299
  fsf_set_contract_scheduling_policy(&decoderContract, FSF_RR);
300
 
301
  fsf_initialize_contract(&displayContract);
302
  fsf_set_contract_basic_parameters(&displayContract,&displayBudget,&displayPeriod,FSF_DEFAULT_WORKLOAD);
303
  fsf_set_contract_scheduling_policy(&displayContract, FSF_EDF);
304
 
305
  fsf_initialize_contract(&overloadContract);
306
  fsf_set_contract_basic_parameters(&overloadContract,&overloadBudget,&overloadPeriod,FSF_DEFAULT_WORKLOAD);
307
  fsf_set_contract_scheduling_policy(&overloadContract, FSF_EDF);
308
 
309
  err = fsf_negotiate_contract(&readTaskContract,&readTaskServer);
310
  if (err) cprintf("(FSF ERROR %d)",err);
311
  err = fsf_negotiate_contract(&decoderContract,&decoderServer);
312
  if (err) cprintf("(FSF ERROR %d)",err);
313
  err = fsf_negotiate_contract(&displayContract,&displayServer);
314
  if (err) cprintf("(FSF ERROR %d)",err);
315
  err = fsf_negotiate_contract(&overloadContract,&overloadServer);
316
  if (err) cprintf("(FSF ERROR %d)",err);
317
 
318
 
319
  // Create and bind different ports to communication links (This ports a declared in global.h)
320
  if((readTaskPort = port_create(readFilePortName, sizeof(struct readDecodeMessage), NUMBER_OF_MESSAGE, STREAM, WRITE)) == -1)
321
    {
322
      grx_text("failed to create readTask Port",0,0,rgb16(255,255,255),0);
323
      exit(-1);
324
    }
325
  if((decoderTaskPort->displayTaskPort = port_create(displayPortName, sizeof(struct decodeDisplayMessage), NUMBER_OF_MESSAGE, STREAM, WRITE)) == -1)
326
    {
327
      grx_text("failed to create displayTask Port",0,0,rgb16(255,255,255),0);
328
      exit(-1);
329
    }
330
  if((decoderTaskPort->readTaskPort = port_connect(readFilePortName, sizeof(struct readDecodeMessage), STREAM, READ)) == -1)
331
    {
332
      grx_text("failed to connect to readTask Port",0,0,rgb16(255,255,255),0);
333
      exit(-1);
334
    }
335
  if((displayTaskPort = port_connect(displayPortName, sizeof(struct decodeDisplayMessage), STREAM, READ)) == -1)
336
    {
337
      grx_text("failed to connect to displayTask Port",0,0,rgb16(255,255,255),0);
338
    exit(-1);
339
    }
340
 
341
  //graphic card Initialization
342
  if (grx_init() < 1) {
343
    exit(-1);
344
  }
345
 
346
  if (grx_open(800, 600, 16) < 0) {
347
    cprintf("GRX Err\n");
348
    exit(-1);
349
  }
350
 
351
 
352
  ch = keyb_getch(BLOCK);
353
 
354
  while(ch != ESC) {
355
 
356
      switch (ch)
357
        {
358
 
359
            case '1':
360
              addReadTaskToServer(readTaskServer);
361
              addDecoderThreadToServer(decoderServer);
362
              addDisplayTaskToServer(displayServer);
363
            break;
364
            case '2':
365
              sprintf(tmp,"Number of dummy task: %d", i);
366
              grx_text(tmp,0,0,rgb16(255,255,255),0);
367
              i++;
368
              addOverLoadTaskToServer(overloadServer);
369
            break;
370
            case '4':
371
              ending_system(NULL);
372
              break;
373
        }
374
 
375
    ch = keyb_getch(BLOCK);
376
 
377
  }
378
 
379
  ending_system(NULL);
380
 
381
 return 0;
382
 
383
}
384