Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1668 pj 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
 *   Paolo Gai           <pj@gandalf.sssup.it>
10
 *   (see the web pages for full authors list)
11
 *
12
 * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
13
 *
14
 * http://www.sssup.it
15
 * http://retis.sssup.it
16
 * http://shark.sssup.it
17
 */
18
 
19
/**
20
 ------------
21
 CVS :        $Id: lupo.c,v 1.1 2004-08-05 11:34:36 pj Exp $
22
 
23
 File:        $File$
24
 Revision:    $Revision: 1.1 $
25
 Last update: $Date: 2004-08-05 11:34:36 $
26
 ------------
27
**/
28
 
29
/*
30
 * Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
31
 *
32
 * This program is free software; you can redistribute it and/or modify
33
 * it under the terms of the GNU General Public License as published by
34
 * the Free Software Foundation; either version 2 of the License, or
35
 * (at your option) any later version.
36
 *
37
 * This program is distributed in the hope that it will be useful,
38
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
39
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
40
 * GNU General Public License for more details.
41
 *
42
 * You should have received a copy of the GNU General Public License
43
 * along with this program; if not, write to the Free Software
44
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
45
 *
46
 */
47
 
48
/*--------------------------------------------------------------*/
49
/*              SIMULATION OF RANDOM FLIES                      */
50
/*--------------------------------------------------------------*/
51
 
52
#include <kernel/kern.h>
53
#include <drivers/glib.h>
54
#include <drivers/keyb.h>
55
#include <drivers/mouse.h>
56
#include <semaphore.h>
57
#include <stdlib.h>
58
#include <math.h>
59
 
60
#define YMENU           10             /* menu level                   */
61
#define XMIN            50
62
#define XMAX            600
63
#define YMIN            100
64
#define YMAX            450
65
#define VEL             5                       /* Velocità della pecora (def. = 5)*/
66
#define VELWOLF         4                       /* Velocità del lupo(def. = 4)     */
67
#define ANG             30                      /* angolo massimo sterzata (30)    */
68
#define D               3                       /* raggio pecore e lupi            */
69
#define ESC             27                      /* ASCII code of ESCAPE key        */
70
#define MAXPECORE       4                       /* Massimo numero di pecore        */
71
#define MAXLUPI         3                       /* Massimo numero di lupi          */
72
#define WOLFGROUP       1
73
#define SHEEPGROUP      1
74
#define HUNTGROUP       1
75
 
76
 
77
/* Variabili globali utilizzate nel programma*/
78
double  tick = 1.0;                             /* system tick = 1 ms             */
79
int     hunt_period     = 40000;                /* Periodo del task cacciatore    */
80
int     sheep_period    = 40000;                /* Periodo del task lupo          */
81
int     wolf_period     = 40000;                /* Periodo del task pecora        */
82
int     hunt_wcet       = 100;          /* wcet del task cacciatore       */
83
int     sheep_wcet      = 100;          /* wcet del task pecora           */
84
int     wolf_wcet       = 100;                  /* wcet del task lupo             */
85
int     num_p = 0;                              /* numero iniziale di pecore      */
86
int     num_l = 0;                              /* numero iniziale di lupi        */
87
int     num_c = 0;                              /* numero iniziale di cacciatori  */
88
PID     pidp,pidl,pidc;                         /* etichetta creata dal S.O. attribuita ad ogni task*/
89
sem_t   mutex;                                  /* semaforo di mutua              */
90
 
91
/*--------------------------------------------------------------*/
92
/*Definizione della struttura posizione*/
93
struct pos {
94
int x , y;                                      /*Posizione nel piano di ogni singolo task*/
95
sem_t priv;                                     /*Semaforo relativo alla posizione di ogni singolo task*/
96
int death;                                      /*Flag di vita o di morte di ogni singolo task*/
97
 };
98
 
99
/*--------------------------------------------------------------*/
100
/*Generazione di vettori di struttura posizione per ogni task*/
101
struct pos pecora[MAXPECORE];
102
struct pos lupo[MAXLUPI];
103
struct pos caccia[1];
104
 
105
/*--------------------------------------------------------------*/
106
/*Funzione per disegnare a video lupi e pecore*/
107
 
108
void    draw_obj(int x, int y, int c)
109
{
110
        sem_wait(&mutex);                       /*Semaforo di mutua per proteggere la scrittura a video*/
111
        grx_disc(x, y, D, c);
112
        sem_post(&mutex);
113
}
114
 
115
/*--------------------------------------------------------------*/
116
/*Funzione di inizializzazione per tutti le variabili di ogni task*/
117
void init_sem()
118
{
119
int i;
120
sem_init(&mutex,0,1);
121
 
122
/*Inizializzazione del vettore di struttura posizione pecora*/
123
 
124
for (i=0;i<MAXPECORE;i++){
125
        sem_init(&pecora[i].priv,0,1);
126
        pecora[i].x = 0;
127
        pecora[i].y = 0;
128
        pecora[i].death = 0;
129
}
130
 
131
/*Inizializzazione del vettore di struttura posizione lupi*/
132
 
133
for (i=0;i<MAXLUPI;i++){
134
        sem_init(&lupo[i].priv,0,1);
135
        lupo[i].x = 0;
136
        lupo[i].y = 0;
137
        lupo[i].death = 0;
138
}
139
 
140
/*Inizializzazione del vettore di struttura posizione cacciatore*/
141
 
142
sem_init(&caccia[0].priv,0,1);
143
caccia[0].x = 0;
144
caccia[0].y = 0;
145
caccia[0].death = 0;
146
}
147
 
148
/******************************************************************/
149
/*Task pecora*/
150
TASK    sheep(void *arg)
151
{
152
int     x, y;                                           /*Posizione futura*/
153
int     ox, oy;                                         /*Posizione attuale*/
154
int     dx, dy, da;                                     /*Spostamento lungo x e y e angolare*/
155
int     teta, col;                                      /*Angolo di direzione dello spostamento e colore pecora*/
156
int     outx, outy,i_libera,i;                          /*Limiti perimetrali*/
157
double  r;                                              /*Angolo di direzione dello spostamento in radianti*/
158
 
159
        i_libera = 0;                                   /*Inizializzazione della prima posizione libera nel vettore di                                                                  struttura pecora*/
160
 
161
        for(i=0;i<MAXPECORE;i++){                       /*Ciclo per cercare la prima posizione libera*/
162
                sem_wait(&pecora[i].priv);              /*Proteggiamo la lettura di ogni singola posizione del vettore */
163
                if (!pecora[i].x) i_libera = i;         /*Le posizioni libere si contraddistinguono per x=0 e y=0*/
164
                sem_post(&pecora[i].priv);
165
                }
166
 
167
        num_p++;                                        /*Incremento del numero di pecore*/
168
 
169
        i = i_libera;                                   /*La posizione nel vettore attribuita al task è la prima libera                                                                 trovata*/
170
 
171
        sem_wait(&pecora[i].priv);                      /*Proteggiamo l'attribuzione della posizione di origine della                                                                   pecora*/
172
        pecora[i].x = ox = x = XMAX - 20;
173
        pecora[i].y = oy = y = YMAX - 20;
174
        //pecora[i].pid = pidp;
175
        sem_post(&pecora[i].priv);
176
 
177
        teta = 0;                                       /*Inizializzazione dell' angolo di direzione dello spostamento*/
178
        col = 29;                                       /* colore della pecora*/
179
 
180
        while (1) {                                     /*Ciclo infinito del task*/
181
 
182
/*Calcolo casuale della posizione della pecora*/
183
                da = rand()%(2*ANG) - ANG;              /*  da = [-ANG,ANG] */
184
                teta += da;
185
 
186
                if (teta > 360) teta -= 360;
187
                if (teta < 0) teta += 360;
188
                r = (double)teta * PI / 180.;
189
 
190
                dx = (float)(VEL * cos(r));
191
                dy = (float)(VEL * sin(r));
192
                x += dx;
193
                y += dy;
194
 
195
                outx = (x >= XMAX) || (x <= XMIN);      /*Controllo posizione all'interno del perimetro*/
196
                outy = (y >= YMAX) || (y <= YMIN);
197
 
198
                if (outx || outy) {                     /*In caso di uscita dal perimetro voluto ricalcolo dx e dy
199
                                                                in modo che la pecora non esca da esso*/
200
                        x = x - dx;
201
                        y = y - dy;
202
                        if (outx) teta = 180 - teta;
203
                        if (outy) teta = -teta;
204
                        if (teta > 360) teta -= 360;
205
                        if (teta < 0) teta += 360;
206
                        r = (double)teta * PI / 180.;
207
 
208
                        dx = (float)(VEL * cos(r));
209
                        dy = (float)(VEL * sin(r));
210
 
211
                        x += dx;
212
                        y += dy;
213
                }
214
 
215
                sem_wait(&pecora[i].priv);
216
                if (pecora[i].death == 1) {             /*Controllo sul flag di vita o di morte del task pecora.*/
217
                        pecora[i].x = 0;                /* Se il flag è uguale a 1 la pecora "deve morire". */
218
                        pecora[i].y = 0;                /*Questo lo indichiamo mettendo le sue posizioni in 0*/
219
                        pecora[i].death = 0;            /*Rimettiamo il flag di vita o morte a 0*/
220
                        num_p--;                        /*Decremento del numero di pecore*/
221
                        draw_obj(ox, oy, 0);            /*Chiamata della funzione per disegnare a video una pecora                                                                      nera=morta*/
222
                        sem_post(&pecora[i].priv);
223
                        return 0;
224
                        }
225
                pecora[i].x = x;                        /*Attribuzione delle nuove posizioni*/
226
                pecora[i].y = y;
227
                sem_post(&pecora[i].priv);
228
 
229
                draw_obj(ox, oy, 0);                    /*Disegno della nuova posizione cancellando precedentemante quella                                                              vecchia*/
230
                draw_obj(x, y, col);
231
                ox = x; oy = y;                         /*Nuove posizioni attuali*/
232
 
233
                task_endcycle();
234
        }
235
}
236
 
237
/****************************************************************/
238
/*Task lupo*/
239
TASK    wolf(void *arg)
240
{
241
int     x, y;                                           /*Posizione futura*/
242
int     ox, oy;                                         /*Posizione attuale*/
243
int     dx, dy;                                         /*Spostamento lungo x e y*/
244
int     deltax,deltay;                                  /*Distanza lupo pecora lungo l'asse x e lungo l'asse y*/
245
int     ipo,ipo_min;                                    /*Ipotenusa e ipotenusa minima di distanza tra lupo e pecora*/
246
int     i_min,i,j_libera,j;                             /*indici della pecora più vicina, della prima posizione libera sul                                                              vettore*/
247
int     teta, col;                                      /*Angolo di direzione dello spostamento e colore lupo*/
248
int     outx, outy;                                     /*Limiti perimetrali*/
249
double  r=0;                                            /*Angolo di direzione dello spostamento in radianti*/
250
 
251
 
252
        j_libera = 0;                                   /*Inizializzazione della prima posizione libera nel vettore di                                                                  struttura lupo*/
253
 
254
        for(j=0;j<MAXLUPI;j++){                         /*Ciclo per cercare la prima posizione libera*/
255
                sem_wait(&lupo[j].priv);                /*Proteggiamo la lettura di ogni singola posizione del vettore */
256
                if (!lupo[j].x) j_libera = j;           /*Le posizioni libere si contraddistinguono per x=0 e y=0*/
257
                sem_post(&lupo[j].priv);
258
                }
259
 
260
        num_l++;                                        /*Incremento del numero di lupi*/
261
 
262
        j = j_libera;                                   /*La posizione nel vettore attribuita al task è la prima libera                                                                 trovata*/
263
 
264
        sem_wait(&lupo[j].priv);                        /*Proteggiamo l'attribuzione della posizione di origine del lupo */
265
        lupo[j].x = ox = x = XMIN + 20;
266
        lupo[j].y = oy = y = YMIN + 20;
267
        sem_post(&lupo[j].priv);
268
 
269
        teta = 0;                                       /*Inizializzazione dell' angolo di direzione dello spostamento*/
270
        col = 4;                                          /* colore lupo*/
271
 
272
        while (1) {                                     /*Ciclo infinito del task*/
273
 
274
 
275
/*controllo posizione cacciatore*/
276
 
277
        sem_wait(&caccia[0].priv);
278
        deltax = caccia[0].x-ox;                        /*Calcolo della distanza tra lupo e cacciatore*/
279
        deltay = caccia[0].y-oy;
280
        sem_post(&caccia[0].priv);
281
 
282
        if (abs(deltax)<30 && abs(deltay)<30){          /*Se la distanza è minore di 30 pixel il lupo deve scappare dal                                                                 cacciatore*/
283
                if (deltax==0){                         /*calcolo degli angoli di spostamento per fuggire dal cacciatore*/
284
                        if (deltay>0) teta=-45;
285
                        if (deltay<0) teta=45;
286
                        }
287
                else{
288
                        teta=(180/PI)*atan(deltay/deltax);
289
                        if (deltax<0) teta=45+teta;
290
                        if (deltax>0) teta=-(teta+90);
291
                        }
292
 
293
        }else
294
        {
295
 
296
/*controllo pecora piu vicina*/
297
                ipo_min=6000;                           /*ipotenusa in modo da averne sempre una minore*/
298
                i_min=0;                                /*Inizializzazione dell' indice della pecora più vicina*/
299
                for(i=0;i<MAXPECORE;i++){               /*Per ogni pecora controllo la distanza lupo-pecora*/
300
                        sem_wait(&pecora[i].priv);
301
                        if (pecora[i].x){               /*la posizione della pecora è 0 quando è morta*/
302
                        deltax=pecora[i].x-ox;          /*calcolo distanza lupo-pecora lungo x*/
303
                        deltay=pecora[i].y-oy;          /*calcolo distanza lupo-pecora lungo y*/
304
                        sem_post(&pecora[i].priv);
305
                        ipo=sqrt(deltax*deltax+deltay*deltay);  /*Calcolo dell'ipotenusa=distanza tra lupo e pecora*/
306
                        if (ipo<ipo_min) {ipo_min=ipo;i_min=i;} /*Calcolo l'ipotenusa più piccola*/
307
                        }else
308
                        sem_post(&pecora[i].priv);
309
                }
310
/*calcolo la distanza della pecora piu vicina*/
311
                sem_wait(&pecora[i_min].priv);
312
                deltax=pecora[i_min].x-ox;
313
                deltay=pecora[i_min].y-oy;
314
                if (deltax==0){                         /*Calcolo angoli per far inseguire al lupo la pecora più vicina*/
315
                        if (deltay>0) teta=90;
316
                        if (deltay<0) teta=-90;
317
                        }
318
                else{
319
                        teta=(180/PI)*atan(deltay/deltax);
320
                        if (deltax<0) teta=180+teta;
321
                        }
322
 
323
//controllo se posso uccidere la pecora
324
                if ((abs(deltax)<2)&&(abs(deltay)<2)) pecora[i_min].death = 1;  /*Se il lupo è sopra la pecora,questa deve                                                                                      morire*/
325
 
326
                sem_post(&pecora[i_min].priv);
327
        }
328
        r = (double)teta * PI / 180.;                   /*Calcolo l'angolo in radianti*/
329
                dx = (float)((VELWOLF+j) * cos(r));     /*Una volta calcolato l'angolo di spostamento,*/
330
                dy = (float)((VELWOLF+j) * sin(r));     /*calcolo i relativi spostamenti lungo x e y*/
331
 
332
                x += dx;                                /*calcolo le nuove posizioni*/
333
                y += dy;
334
 
335
 
336
                outx = (x >= XMAX) || (x <= XMIN);      /*Controllo posizione all'interno del perimetro*/
337
                outy = (y >= YMAX) || (y <= YMIN);
338
 
339
                if (outx || outy) {                     /*In caso di uscita dal perimetro voluto ricalcolo dx e dy
340
                                                                in modo che il lupo non esca da esso*/
341
                        x = x - dx;
342
                        y = y - dy;
343
                        if (outx) teta = 180 - teta;
344
                        if (outy) teta = -teta;
345
                        if (teta > 360) teta -= 360;
346
                        if (teta < 0) teta += 360;
347
                        r = (double)teta * PI / 180.;
348
 
349
                        dx = (float)(VEL * cos(r));
350
                        dy = (float)(VEL * sin(r));
351
 
352
                        x += dx;
353
                        y += dy;
354
                }
355
 
356
 
357
                sem_wait(&lupo[j].priv);
358
 
359
                if (lupo[j].death == 1) {               /*Controllo sul flag di vita o di morte del task lupo*/
360
                        lupo[j].x = 0;                  /* Se il flag è uguale a 1 il lupo "deve morire". */
361
                        lupo[j].y = 0;                  /*Questo lo indichiamo mettendo le sue posizioni in 0*/
362
                        lupo[j].death = 0;              /*Rimettiamo il flag di vita o morte a 0*/
363
                        num_l--;                        /*Decremento del numero di lupi*/
364
                        draw_obj(ox, oy, 0);            /*Chiamata della funzione per disegnare a video un lupo                                                                         nero=morto*/
365
                        sem_post(&lupo[j].priv);
366
                        return 0;
367
                        }
368
                lupo[j].x = x ;                         /*Attribuzione delle nuove posizioni*/
369
                lupo[j].y = y ;
370
                sem_post(&lupo[j].priv);
371
 
372
 
373
                draw_obj(ox, oy, 0);                    /*Disegno della nuova posizione cancellando precedentemante quella                                                              vecchia*/
374
                draw_obj(x, y, col);
375
                ox = x; oy = y;                         /*Nuove posizioni attuali*/
376
 
377
                task_endcycle();
378
        }
379
}
380
 
381
/****************************************************************/
382
void my_mouse_handler(MOUSE_EVT *m)
383
{
384
        grx_box(caccia[0].x-3,caccia[0].y-3,caccia[0].x+3,caccia[0].y+3,0);     /*Cancella la posizione precedente del                                                                                  cacciatore disegnando un rettangolo nero*/
385
        grx_box(m->x-3,m->y-3,m->x+3,m->y+3,2);                                 /*disegno del cursore a forma di                                                                                        rettangolino attorno alla posizione                                                                                     attuale*/
386
 
387
        sem_wait(&caccia[0].priv);
388
        caccia[0].x = m->x;                             /*Attribuisco al cacciatore le nuove coordinate del mouse*/
389
        caccia[0].y = m->y;
390
        sem_post(&caccia[0].priv);
391
}
392
 
393
/****************************************************************/
394
TASK cacciatore(void *arg)
395
{
396
int i = 0;
397
int deltax,deltay;                                      /*Distanza cacciatore-lupo lungo l'asse x e lungo l'asse y*/
398
 
399
        num_c++;                                        /*incremento del numero di cacciatori*/
400
 
401
        mouse_on();                                     /*attivazione e visualizzazione del mouse*/
402
        mouse_hook(my_mouse_handler);                   /*chiamata all'hook*/
403
 
404
        while(1){                                       /*controllo infinito per vedere se il lupo è da ammazzare*/
405
 
406
                if (i == MAXLUPI) i = 0;                /*Se ha controllato tutti i lupi ricomincia dal primo nel vettore*/
407
 
408
                sem_wait(&lupo[i].priv);
409
 
410
                if (lupo[i].x){                         /*la posizione del lupo è 0 solo quando è morto*/
411
                        deltax=lupo[i].x-caccia[0].x;   /*calcolo la distanza tra lupo e cacciatore*/
412
                        deltay=lupo[i].y-caccia[0].y;
413
                        if (abs(deltax)<4 && abs(deltay)<4) lupo[i].death=1;    /*Se il cacciatore è vicino al lupo questo                                                                                      deve morire*/
414
                        }
415
                sem_post(&lupo[i].priv);
416
 
417
                i++;                                    /*Incrementa i per controllare il lupo successivo*/
418
 
419
 
420
 
421
        task_endcycle();
422
        }
423
        return 0;
424
}
425
 
426
 
427
/****************************************************************/
428
/* This function is called when the system exits */
429
void byebye(void *arg)
430
{
431
  mouse_end();
432
  grx_close();
433
  cprintf("Bye Bye!\n");
434
}
435
 
436
/****************************** MAIN ******************************/
437
 
438
int main(int argc, char **argv)
439
{
440
    HARD_TASK_MODEL m;
441
 
442
    char c;             /* caratere dalla tastiera      */
443
    int  i = 0;         /* numero di tasks creati      */
444
    TIME seme;          /* used to init the random seed */
445
 
446
// Inizializzazione del mouse
447
        MOUSE_PARMS mouse = BASE_MOUSE;
448
 
449
        mouse_def_ps2(mouse);
450
        mouse_init(&mouse);
451
        mouse_limit(XMIN,YMIN,XMAX,YMAX);       /* limiti del mouse all'interno del rettangolo di gioco*/
452
        mouse_position(XMIN+20,YMAX-20);        /* posizione di partenza cacciatore*/
453
        mouse_threshold(10);                    /* sensibilità del mouse */
454
 
455
// Inizializzazione dei vettori di strutture
456
        init_sem();
457
 
458
    /* Set the closing function */
459
    sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
460
 
461
    /* graphic card Initialization */
462
    if (grx_init() < 1) {
463
       sys_abort(1);
464
    }
465
 
466
    if (grx_open(640, 480, 8) < 0) {
467
        cprintf("GRX Err\n");
468
        sys_abort(1);
469
    }
470
 
471
    /* The scenario */
472
    grx_rect(XMIN-D-1, YMIN-D-1, XMAX+D+1, YMAX+D+1, 14);
473
    grx_text("Simulazione di caccia al Lupo", XMIN, YMENU+10, 13, 0);
474
    grx_text("p crea una pecora"        , XMIN, YMENU+20, 12, 0);
475
    grx_text("l crea un lupo"        , XMIN, YMENU+30, 12, 0);
476
    grx_text("c crea un cacciatore "        , XMIN, YMENU+40, 12, 0);
477
    grx_text("ESC   exit to DOS"         , XMIN, YMENU+50, 12, 0);
478
 
479
    /* The program waits a space to create a fly */
480
    c = keyb_getch(BLOCK);
481
 
482
    /* randomize!!!! */
483
    seme = sys_gettime(NULL);
484
    srand(seme);
485
 
486
    do {
487
        if ((c == 'p')&&(num_p<MAXPECORE)) {            /*se il numero di pecore max è raggiunto non crearne altre*/
488
            hard_task_default_model(m);
489
            hard_task_def_ctrl_jet (m);
490
            hard_task_def_arg      (m, (void *)i);
491
            hard_task_def_wcet     (m, sheep_wcet);
492
            hard_task_def_mit      (m, sheep_period);
493
            hard_task_def_group    (m, SHEEPGROUP);
494
            hard_task_def_usemath  (m);
495
            pidp = task_create("sheep", sheep, &m, NULL);
496
            if (pidp == NIL) {
497
              grx_close();
498
              perror("Could not create task <sheep>");
499
              sys_abort(1);
500
            }
501
            task_activate(pidp);
502
 
503
        }
504
        if ((c == 'l')&&(num_l<MAXLUPI)) {      /*se il numero di lupi max è raggiunto non crearne altri*/
505
            hard_task_default_model(m);
506
            hard_task_def_ctrl_jet (m);
507
            hard_task_def_arg      (m, (void *)i);
508
            hard_task_def_wcet     (m, wolf_wcet);
509
            hard_task_def_mit      (m, wolf_period);
510
            hard_task_def_group    (m, WOLFGROUP);
511
            hard_task_def_usemath  (m);
512
            pidl = task_create("wolf", wolf, &m, NULL);
513
            if (pidl == NIL) {
514
              grx_close();
515
              perror("Could not create task <wolf>");
516
              sys_abort(1);
517
            }
518
            task_activate(pidl);
519
 
520
 
521
 
522
        }
523
        if ((c == 'c') && (num_c == 0)) {       /*se il caccaiatore è già stato creato non crearne altri*/
524
            hard_task_default_model(m);
525
            hard_task_def_ctrl_jet (m);
526
            hard_task_def_arg      (m, (void *)i);
527
            hard_task_def_wcet     (m, hunt_wcet);
528
            hard_task_def_mit      (m, hunt_period);
529
            hard_task_def_group    (m, HUNTGROUP);
530
            hard_task_def_usemath  (m);
531
            pidc = task_create("cacciatore", cacciatore, &m, NULL);
532
            if (pidc == NIL) {
533
              grx_close();
534
              perror("Could not create task <cacciatore>");
535
              sys_abort(1);
536
            }
537
            task_activate(pidc);
538
 
539
 
540
        }
541
 
542
 
543
 
544
        c = keyb_getch(BLOCK);
545
 
546
    } while (c != ESC);
547
 
548
    sys_end();
549
 
550
    return 0;
551
}
552
 
553
/*--------------------------------------------------------------*/