Subversion Repositories shark

Rev

Rev 1123 | Rev 1382 | Go to most recent revision | 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
 *
1377 giacomo 37
 * CVS :        $Id: cabs.c,v 1.4 2004-04-17 11:36:13 giacomo Exp $
1098 pj 38
 */
39
 
1085 pj 40
/*--------------------------------------------------------------*/
41
/*		      TEST ON CABS				*/
42
/*--------------------------------------------------------------*/
43
 
44
#include <kernel/kern.h>
45
#include <modules/cabs.h>
46
#include <string.h>
47
 
1377 giacomo 48
#include <drivers/shark_linuxc26.h>
49
#include <drivers/shark_pci26.h>
50
#include <drivers/shark_fb26.h>
51
#include <drivers/shark_input26.h>
52
#include <drivers/shark_keyb26.h>
53
 
54
#define FRAME_BUFFER_DEVICE 0
55
 
1085 pj 56
#define	NCAB	4		/* max number of CABs	*/
57
#define	NCAR	26		/* generated characters	*/
58
 
59
#define	YP	32		/* level of arrows	*/
60
#define	R	20		/* task radius		*/
61
#define	YY	(YP+R+32)	/* level of writing	*/
62
#define	DELTA	(2*R+72)	/* total channel hight	*/
63
#define	X1	120		/* start column for P1	*/
64
#define	X2	360		/* start column for P2	*/
65
 
66
#define	XP1	(X1+64)		/* X position of task 1	*/
67
#define	XP2	(X2+64)		/* X position of task 2	*/
68
#define	XC	(XP1+96)	/* X position of CAB	*/
69
#define	L	52		/* CAB rectangle length	*/
70
 
71
void	my_exit(KEY_EVT *k);
72
void	draw_channel(int i);
73
void	create_channel(int i);
74
void	get_data();
75
 
76
TASK	producer(void *arg);
77
TASK	consumer(void *arg);
78
 
79
char	*cname[NCAB] = {"cab1", "cab2", "cab3", "cab4"};
80
char	*pname1[NCAB] = {"wr1", "wr2", "wr3", "wr4"};
81
char	*pname2[NCAB] = {"rd1", "rd2", "rd3", "rd4"};
82
 
83
CAB	cid[NCAB];		/* CAB identifiers	*/
84
PID	p1[NCAB], p2[NCAB];	/* task identifiers	*/
85
 
86
/* Task Periods */
87
TIME	t1[NCAB] = {200000, 100000, 300000, 800000};
88
TIME    t2[NCAB] = {400000, 400000, 150000, 200000};
89
 
90
/* Task WCETS */
91
TIME	w1[NCAB] = {10000, 10000, 10000, 10000};
92
TIME    w2[NCAB] = {10000, 10000, 10000, 10000};
93
 
1377 giacomo 94
PID shutdown_task_PID = -1;
1085 pj 95
 
1377 giacomo 96
int device_drivers_init() {
97
 
98
	KEYB_PARMS kparms = BASE_KEYB;
99
 
100
        LINUXC26_register_module();
101
 
102
	PCI26_init();
103
 
104
	keyb_def_ctrlC(kparms, NULL);
105
 
106
        INPUT26_init();
107
 
108
	KEYB26_init(&kparms);
109
 
110
	FB26_init();
111
 
112
        FB26_open(FRAME_BUFFER_DEVICE);
113
 
114
        FB26_use_grx(FRAME_BUFFER_DEVICE);
115
 
116
        FB26_setmode(FRAME_BUFFER_DEVICE,"640x480-16");
117
 
118
	return 0;
119
 
120
}
121
 
122
int device_drivers_close() {
123
 
124
	FB26_close(FRAME_BUFFER_DEVICE);
125
 
126
	KEYB26_close();
127
 
128
	INPUT26_close();
129
 
130
	return 0;
131
 
132
}
133
 
134
TASK shutdown_task_body(void *arg) {
135
 
136
	device_drivers_close();
137
 
138
	sys_shutdown_message("-- S.Ha.R.K. Closed --\n");
139
 
140
	sys_end();
141
 
142
	return NULL;
143
 
144
}
145
 
146
void set_shutdown_task() {
147
 
148
	NRT_TASK_MODEL nrt;
149
 
150
	nrt_task_default_model(nrt);
151
 
152
	shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL);
153
	if (shutdown_task_PID == NIL) {
154
		sys_shutdown_message("Error: Cannot create shutdown task\n");
155
		sys_end();
156
	}
157
 
158
}
159
 
160
 
1085 pj 161
/****************************************************************/
162
 
163
/* This function is called when Alt-X is pressed.
164
*/
165
void my_end(KEY_EVT* e)
166
{
1377 giacomo 167
	task_activate(shutdown_task_PID);
1085 pj 168
}
169
 
170
/******************************************************************/
171
 
172
/* This function is called when the system exit correctly after Alt-X.
173
   It exits from the graphic mode and then it prints a small greeting.
174
   Note that:
175
   - The function calls grx_exit, so it must be registered using
176
     RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
177
     at that point the kernel is already returned in real mode!!!)
178
   - When an exception is raised, the exception handler is called.
179
     Since the exception handler already exits from the graphic mode,
180
     this funcion has not to be called. For this reason:
181
     . we registered byebye using the flag NO_AT_ABORT
182
     . the exception handler exits using sys_abort; in that way byebye is
183
       NOT called
184
*/
185
 
186
/*--------------------------------------------------------------*/
187
/* Main task							*/
188
/*--------------------------------------------------------------*/
189
 
190
/****************************** MAIN ******************************/
191
 
192
int main(int argc, char **argv)
193
{
194
    char c = 0;		/* character from keyboard	*/
195
 
1377 giacomo 196
    set_shutdown_task();
1085 pj 197
 
1377 giacomo 198
    device_drivers_init();
1085 pj 199
 
200
    grx_clear(BLACK);
201
 
202
    grx_text("Press a key [1-4]", 10, 16, 7, 0);
203
    grx_text("to create a pair",  10, 24, 7, 0);
204
    grx_text("ESC to exit demo",  10, 48, 7, 0);
205
 
206
    while (c != 27) {
207
      c = keyb_getch(BLOCK);
208
      if ((c >= '1') && (c <= '1'+NCAB-1))
209
        create_channel(c-'1');
210
    }
211
 
1377 giacomo 212
    task_activate(shutdown_task_PID);
1085 pj 213
 
214
    return 0;
215
}
216
 
217
 
218
/*--------------------------------------------------------------*/
219
/* write data in a cab						*/
220
/*--------------------------------------------------------------*/
221
 
222
TASK	producer(void *arg)
223
{
224
int     i = (int)arg;
225
char	c;			/* message character		*/
226
char	*p;			/* pointer to a cab buffer	*/
227
char	s[2];			/* string to display		*/
228
int	k = 0;
229
int	x, y;
230
int	col = 13;
231
int	ybase = YY + i*DELTA;
232
 
233
	x = X1;
234
	y = ybase;
235
	s[1] = 0;
236
 
237
	k = 0;
238
	while (1) {
239
		c = 'A' + k;
240
		p = cab_reserve(cid[i]);
241
		*p = c;
242
		cab_putmes(cid[i], p);
243
 
244
		s[0] = c;
245
		k = (k + 1) % NCAR;
246
		grx_text(s,x,y,col,0);
247
 
248
		x += 8;
249
		if (x >= (X1 + NCAR*8)) {
250
			x = X1;
251
			y = y + 8;
252
			if (y >= ybase+16) {
253
				y = ybase;
254
				col = col % 15 + 1;
255
			}
256
		}
257
 
258
		task_endcycle();
259
	}
260
}
261
 
262
/*--------------------------------------------------------------*/
263
/* read data from a cab						*/
264
/*--------------------------------------------------------------*/
265
 
266
TASK	consumer(void *arg)
267
{
268
int     i = (int)arg;
269
char	*p;
270
char	s[2];
271
int	x, y;
272
int	col = 13;
273
int	ybase = YY + i*DELTA;
274
 
275
	x = X2;
276
	y = ybase;
277
	s[1] = 0;
278
 
279
	while (1) {
280
		p = cab_getmes(cid[i]);
281
		s[0] = *p - 'A' + 'a';
282
		cab_unget(cid[i], p);
283
 
284
		grx_text(s,x,y,col,0);
285
		x += 8;
286
 
287
		if (x >= (X2 + NCAR*8)) {
288
			x = X2;
289
			y = y + 8;
290
			if (y >= ybase+16) {
291
				y = ybase;
292
				col = col % 15 + 1;
293
			}
294
		}
295
		task_endcycle();
296
	}
297
}
298
 
299
/*--------------------------------------------------------------*/
300
/* create the two tasks and a channel				*/
301
/*--------------------------------------------------------------*/
302
 
303
void	create_channel(int i)
304
{
305
        HARD_TASK_MODEL m;
306
 
307
	draw_channel(i);
308
	cid[i] = cab_create(cname[i], 1, 2);
309
 
310
        hard_task_default_model(m);
311
        hard_task_def_ctrl_jet (m);
312
        hard_task_def_arg      (m, (void *)i);
313
        hard_task_def_wcet     (m, w1[i]);
314
        hard_task_def_mit      (m, t1[i]);
315
        hard_task_def_usemath  (m);
316
        p1[i] = task_create(pname1[i], producer, &m, NULL);
317
        if (p1[i] == NIL) {
1377 giacomo 318
          sys_shutdown_message("Could not create task <producer>");
319
          task_activate(shutdown_task_PID);
320
	  return;
1085 pj 321
        }
322
        task_activate(p1[i]);
323
 
324
        hard_task_default_model(m);
325
        hard_task_def_ctrl_jet (m);
326
        hard_task_def_arg      (m, (void *)i);
327
        hard_task_def_wcet     (m, w2[i]);
328
        hard_task_def_mit      (m, t2[i]);
329
        hard_task_def_usemath  (m);
330
        p2[i] = task_create(pname2[i], consumer, &m, NULL);
331
        if (p2[i] == NIL) {
1377 giacomo 332
          sys_shutdown_message("Could not create task <consumer>");
333
          task_activate(shutdown_task_PID);
334
          return;
1085 pj 335
        }
336
        task_activate(p2[i]);
337
}
338
 
339
/*--------------------------------------------------------------*/
340
/* Disegna i processi e il canale di comunicazione		*/
341
/*--------------------------------------------------------------*/
342
 
343
void	draw_channel(int i)
344
{
345
char	buffer[32];			/* buffer per sprintf	*/
346
int	yc = YP + i*DELTA;		/* altezza del canale	*/
347
 
348
	grx_circle(XP1,yc,R,2);
349
	grx_text("P1",XP1-8,yc-4,12,0);
350
 
351
	grx_circle(XP2,yc,R,2);
352
	grx_text("P2",XP2-8,yc-4,12,0);
353
 
354
	grx_rect(XC,yc-R,XC+L,yc+R,3);
355
	grx_text("CAB",XC+16,yc-4,12,0);
356
 
357
	grx_line(XP1+R,yc,XC,yc,4);
358
	grx_line(XC+L,yc,XP2-R,yc,4);
359
 
360
	grx_text("T1 =          ms",X1+40,yc+R+16,14,0);
361
	sprintf(buffer,"%ld", t1[i]);
362
	grx_text(buffer,X1+88,yc+R+16,14,0);
363
 
364
	grx_text("T2 =          ms",X2+40,yc+R+16,14,0);
365
	sprintf(buffer,"%ld", t2[i]);
366
	grx_text(buffer,X2+88,yc+R+16,14,0);
367
}
368