Subversion Repositories shark

Rev

Rev 1547 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1098 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
 * Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai
21
 *
22
 * This program is free software; you can redistribute it and/or modify
23
 * it under the terms of the GNU General Public License as published by
24
 * the Free Software Foundation; either version 2 of the License, or
25
 * (at your option) any later version.
26
 *
27
 * This program is distributed in the hope that it will be useful,
28
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
30
 * GNU General Public License for more details.
31
 *
32
 * You should have received a copy of the GNU General Public License
33
 * along with this program; if not, write to the Free Software
34
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
35
 *
36
 *
1552 pj 37
 * CVS :        $Id: cabs.c,v 1.9 2005-02-25 11:10:46 pj Exp $
1098 pj 38
 */
39
 
1085 pj 40
/*--------------------------------------------------------------*/
41
/*                    TEST ON CABS                              */
42
/*--------------------------------------------------------------*/
43
 
44
#include <kernel/kern.h>
1552 pj 45
#include <cabs/cabs/cabs.h>
1085 pj 46
#include <string.h>
47
 
1377 giacomo 48
#include <drivers/shark_fb26.h>
49
#include <drivers/shark_keyb26.h>
50
 
1085 pj 51
#define NCAB    4               /* max number of CABs   */
52
#define NCAR    26              /* generated characters */
53
 
54
#define YP      32              /* level of arrows      */
55
#define R       20              /* task radius          */
56
#define YY      (YP+R+32)       /* level of writing     */
57
#define DELTA   (2*R+72)        /* total channel hight  */
58
#define X1      120             /* start column for P1  */
59
#define X2      360             /* start column for P2  */
60
 
61
#define XP1     (X1+64)         /* X position of task 1 */
62
#define XP2     (X2+64)         /* X position of task 2 */
63
#define XC      (XP1+96)        /* X position of CAB    */
64
#define L       52              /* CAB rectangle length */
65
 
66
void    my_exit(KEY_EVT *k);
67
void    draw_channel(int i);
68
void    create_channel(int i);
69
void    get_data();
70
 
71
TASK    producer(void *arg);
72
TASK    consumer(void *arg);
73
 
74
char    *cname[NCAB] = {"cab1", "cab2", "cab3", "cab4"};
75
char    *pname1[NCAB] = {"wr1", "wr2", "wr3", "wr4"};
76
char    *pname2[NCAB] = {"rd1", "rd2", "rd3", "rd4"};
77
 
78
CAB     cid[NCAB];              /* CAB identifiers      */
79
PID     p1[NCAB], p2[NCAB];     /* task identifiers     */
80
 
81
/* Task Periods */
82
TIME    t1[NCAB] = {200000, 100000, 300000, 800000};
83
TIME    t2[NCAB] = {400000, 400000, 150000, 200000};
84
 
85
/* Task WCETS */
86
TIME    w1[NCAB] = {10000, 10000, 10000, 10000};
87
TIME    w2[NCAB] = {10000, 10000, 10000, 10000};
88
 
89
/****************************************************************/
90
 
91
/* This function is called when Alt-X is pressed.
92
*/
93
void my_end(KEY_EVT* e)
94
{
1547 pj 95
  exit(0);
1085 pj 96
}
97
 
98
/******************************************************************/
99
 
100
/* This function is called when the system exit correctly after Alt-X.
101
   It exits from the graphic mode and then it prints a small greeting.
102
   Note that:
103
   - The function calls grx_exit, so it must be registered using
104
     RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
105
     at that point the kernel is already returned in real mode!!!)
106
   - When an exception is raised, the exception handler is called.
107
     Since the exception handler already exits from the graphic mode,
108
     this funcion has not to be called. For this reason:
109
     . we registered byebye using the flag NO_AT_ABORT
1547 pj 110
     . the exception handler exits using exit; in that way byebye is
1085 pj 111
       NOT called
112
*/
113
 
114
/*--------------------------------------------------------------*/
115
/* Main task                                                    */
116
/*--------------------------------------------------------------*/
117
 
118
/****************************** MAIN ******************************/
119
 
120
int main(int argc, char **argv)
121
{
122
    char c = 0;         /* character from keyboard      */
123
 
124
    grx_clear(BLACK);
125
 
1386 giacomo 126
    grx_text("Press a key [1-4]", 10, 16, rgb16(255,255,255), 0);
127
    grx_text("to create a pair",  10, 24, rgb16(255,255,255), 0);
128
    grx_text("ESC to exit demo",  10, 48, rgb16(255,255,255), 0);
1085 pj 129
 
130
    while (c != 27) {
131
      c = keyb_getch(BLOCK);
132
      if ((c >= '1') && (c <= '1'+NCAB-1))
133
        create_channel(c-'1');
134
    }
135
 
1547 pj 136
    exit(0);
1085 pj 137
 
138
    return 0;
139
}
140
 
141
 
142
/*--------------------------------------------------------------*/
143
/* write data in a cab                                          */
144
/*--------------------------------------------------------------*/
145
 
146
TASK    producer(void *arg)
147
{
148
int     i = (int)arg;
149
char    c;                      /* message character            */
150
char    *p;                     /* pointer to a cab buffer      */
151
char    s[2];                   /* string to display            */
152
int     k = 0;
153
int     x, y;
1386 giacomo 154
int     col = rgb16(0,0,255);
1085 pj 155
int     ybase = YY + i*DELTA;
156
 
157
        x = X1;
158
        y = ybase;
159
        s[1] = 0;
160
 
161
        k = 0;
162
        while (1) {
163
                c = 'A' + k;
164
                p = cab_reserve(cid[i]);
165
                *p = c;
166
                cab_putmes(cid[i], p);
167
 
168
                s[0] = c;
169
                k = (k + 1) % NCAR;
170
                grx_text(s,x,y,col,0);
171
 
172
                x += 8;
173
                if (x >= (X1 + NCAR*8)) {
174
                        x = X1;
175
                        y = y + 8;
176
                        if (y >= ybase+16) {
177
                                y = ybase;
178
                        }
179
                }
180
 
181
                task_endcycle();
182
        }
183
}
184
 
185
/*--------------------------------------------------------------*/
186
/* read data from a cab                                         */
187
/*--------------------------------------------------------------*/
188
 
189
TASK    consumer(void *arg)
190
{
191
int     i = (int)arg;
192
char    *p;
193
char    s[2];
194
int     x, y;
195
int     col = 13;
196
int     ybase = YY + i*DELTA;
197
 
198
        x = X2;
199
        y = ybase;
200
        s[1] = 0;
201
 
202
        while (1) {
203
                p = cab_getmes(cid[i]);
204
                s[0] = *p - 'A' + 'a';
205
                cab_unget(cid[i], p);
206
 
207
                grx_text(s,x,y,col,0);
208
                x += 8;
209
 
210
                if (x >= (X2 + NCAR*8)) {
211
                        x = X2;
212
                        y = y + 8;
213
                        if (y >= ybase+16) {
214
                                y = ybase;
215
                                col = col % 15 + 1;
216
                        }
217
                }
218
                task_endcycle();
219
        }
220
}
221
 
222
/*--------------------------------------------------------------*/
223
/* create the two tasks and a channel                           */
224
/*--------------------------------------------------------------*/
225
 
226
void    create_channel(int i)
227
{
228
        HARD_TASK_MODEL m;
229
 
230
        draw_channel(i);
231
        cid[i] = cab_create(cname[i], 1, 2);
232
 
233
        hard_task_default_model(m);
234
        hard_task_def_ctrl_jet (m);
235
        hard_task_def_arg      (m, (void *)i);
236
        hard_task_def_wcet     (m, w1[i]);
237
        hard_task_def_mit      (m, t1[i]);
238
        hard_task_def_usemath  (m);
239
        p1[i] = task_create(pname1[i], producer, &m, NULL);
240
        if (p1[i] == NIL) {
1377 giacomo 241
          sys_shutdown_message("Could not create task <producer>");
1547 pj 242
          exit(1);
1377 giacomo 243
          return;
1085 pj 244
        }
245
        task_activate(p1[i]);
246
 
247
        hard_task_default_model(m);
248
        hard_task_def_ctrl_jet (m);
249
        hard_task_def_arg      (m, (void *)i);
250
        hard_task_def_wcet     (m, w2[i]);
251
        hard_task_def_mit      (m, t2[i]);
252
        hard_task_def_usemath  (m);
253
        p2[i] = task_create(pname2[i], consumer, &m, NULL);
254
        if (p2[i] == NIL) {
1377 giacomo 255
          sys_shutdown_message("Could not create task <consumer>");
1547 pj 256
          exit(1);
1377 giacomo 257
          return;
1085 pj 258
        }
259
        task_activate(p2[i]);
260
}
261
 
262
/*--------------------------------------------------------------*/
263
/* Disegna i processi e il canale di comunicazione              */
264
/*--------------------------------------------------------------*/
265
 
266
void    draw_channel(int i)
267
{
268
char    buffer[32];                     /* buffer per sprintf   */
269
int     yc = YP + i*DELTA;              /* altezza del canale   */
270
 
1386 giacomo 271
        grx_circle(XP1,yc,R,rgb16(255,0,0));
272
        grx_text("P1",XP1-8,yc-4,rgb16(255,255,255),0);
1085 pj 273
 
1386 giacomo 274
        grx_circle(XP2,yc,R,rgb16(255,0,0));
275
        grx_text("P2",XP2-8,yc-4,rgb16(255,255,255),0);
1085 pj 276
 
1386 giacomo 277
        grx_rect(XC,yc-R,XC+L,yc+R,rgb16(255,255,255));
278
        grx_text("CAB",XC+16,yc-4,rgb16(255,255,255),0);
1085 pj 279
 
1386 giacomo 280
        grx_line(XP1+R,yc,XC,yc,rgb16(255,255,255));
281
        grx_line(XC+L,yc,XP2-R,yc,rgb16(255,255,255));
1085 pj 282
 
1386 giacomo 283
        grx_text("T1 =          ms",X1+40,yc+R+16,rgb16(255,255,255),0);
1085 pj 284
        sprintf(buffer,"%ld", t1[i]);
1386 giacomo 285
        grx_text(buffer,X1+88,yc+R+16,rgb16(255,255,255),0);
1085 pj 286
 
1386 giacomo 287
        grx_text("T2 =          ms",X2+40,yc+R+16,rgb16(255,255,255),0);
1085 pj 288
        sprintf(buffer,"%ld", t2[i]);
1386 giacomo 289
        grx_text(buffer,X2+88,yc+R+16,rgb16(255,255,255),0);
1085 pj 290
}