source: rtems/testsuites/ada/sptests/sp13/sptest.adb @ 76bd25e

5
Last change on this file since 76bd25e was f6c9334d, checked in by Sebastian Huber <sebastian.huber@…>, on Dec 1, 2017 at 7:51:17 AM

ada: Add standard test begin/end message

  • Property mode set to 100644
File size: 27.0 KB
Line 
1--
2--  SPTEST / BODY
3--
4--  DESCRIPTION:
5--
6--  This package is the implementation of Test 13 of the RTEMS
7--  Single Processor Test Suite.
8--
9--  DEPENDENCIES:
10--
11-- 
12--
13--  COPYRIGHT (c) 1989-2011.
14--  On-Line Applications Research Corporation (OAR).
15--
16--  The license and distribution terms for this file may in
17--  the file LICENSE in this distribution or at
18--  http://www.rtems.org/license/LICENSE.
19--
20
21with INTERFACES; use INTERFACES;
22with RTEMS;
23with RTEMS.MESSAGE_QUEUE;
24with TEST_SUPPORT;
25with TEXT_IO;
26with UNSIGNED32_IO;
27use type RTEMS.STATUS_CODES;
28
29package body SPTEST is
30
31   type BIG_BUFFER_TYPE is array (1 .. 2048) of RTEMS.UNSIGNED8;
32
33
34--
35--  INIT
36--
37
38   procedure INIT (
39      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
40   ) is
41      pragma Unreferenced(ARGUMENT);
42      STATUS : RTEMS.STATUS_CODES;
43   begin
44
45      TEXT_IO.NEW_LINE( 2 );
46      TEST_SUPPORT.ADA_TEST_BEGIN;
47
48      SPTEST.TASK_NAME( 1 ) := RTEMS.BUILD_NAME(  'T', 'A', '1', ' ' );
49      SPTEST.TASK_NAME( 2 ) := RTEMS.BUILD_NAME(  'T', 'A', '2', ' ' );
50      SPTEST.TASK_NAME( 3 ) := RTEMS.BUILD_NAME(  'T', 'A', '3', ' ' );
51
52      RTEMS.TASKS.CREATE( 
53         SPTEST.TASK_NAME( 1 ), 
54         4, 
55         2048, 
56         RTEMS.DEFAULT_MODES,
57         RTEMS.DEFAULT_ATTRIBUTES,
58         SPTEST.TASK_ID( 1 ),
59         STATUS
60      );
61      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA1" );
62
63      RTEMS.TASKS.CREATE( 
64         SPTEST.TASK_NAME( 2 ), 
65         4, 
66         2048, 
67         RTEMS.DEFAULT_MODES,
68         RTEMS.DEFAULT_ATTRIBUTES,
69         SPTEST.TASK_ID( 2 ),
70         STATUS
71      );
72      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA2" );
73
74      RTEMS.TASKS.CREATE( 
75         SPTEST.TASK_NAME( 3 ), 
76         4, 
77         2048, 
78         RTEMS.DEFAULT_MODES,
79         RTEMS.DEFAULT_ATTRIBUTES,
80         SPTEST.TASK_ID( 3 ),
81         STATUS
82      );
83      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA3" );
84
85      RTEMS.TASKS.START(
86         SPTEST.TASK_ID( 1 ),
87         SPTEST.TASK_1'ACCESS,
88         0,
89         STATUS
90      );
91      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA1" );
92
93      RTEMS.TASKS.START(
94         SPTEST.TASK_ID( 2 ),
95         SPTEST.TASK_2'ACCESS,
96         0,
97         STATUS
98      );
99      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA2" );
100
101      RTEMS.TASKS.START(
102         SPTEST.TASK_ID( 3 ),
103         SPTEST.TASK_3'ACCESS,
104         0,
105         STATUS
106      );
107      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA3" );
108
109      SPTEST.QUEUE_NAME( 1 ) := RTEMS.BUILD_NAME(  'Q', '1', ' ', ' ' );
110      SPTEST.QUEUE_NAME( 2 ) := RTEMS.BUILD_NAME(  'Q', '2', ' ', ' ' );
111      SPTEST.QUEUE_NAME( 3 ) := RTEMS.BUILD_NAME(  'Q', '3', ' ', ' ' );
112
113      RTEMS.MESSAGE_QUEUE.CREATE(
114         SPTEST.QUEUE_NAME( 1 ),
115         100,
116         16,
117         RTEMS.DEFAULT_ATTRIBUTES,
118         SPTEST.QUEUE_ID( 1 ),
119         STATUS
120      );
121      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q1" );
122
123      RTEMS.MESSAGE_QUEUE.CREATE(
124         SPTEST.QUEUE_NAME( 2 ),
125         10,
126         16,
127         RTEMS.PRIORITY,
128         SPTEST.QUEUE_ID( 2 ),
129         STATUS
130      );
131      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q2" );
132
133      RTEMS.MESSAGE_QUEUE.CREATE(
134         SPTEST.QUEUE_NAME( 3 ),
135         100,
136         16,
137         RTEMS.DEFAULT_ATTRIBUTES,
138         SPTEST.QUEUE_ID( 3 ),
139         STATUS
140      );
141      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "QUEUE_CREATE OF Q3" );
142
143      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
144      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
145
146   end INIT;
147
148--
149--  FILL_BUFFER
150--
151
152--
153-- Depends on tricks to make the copy work.
154--
155
156   procedure FILL_BUFFER (
157      SOURCE : in     STRING;
158      BUFFER :    out SPTEST.BUFFER
159   ) is
160   begin
161
162      BUFFER.FIELD1 := RTEMS.BUILD_NAME(
163         SOURCE( SOURCE'FIRST ),
164         SOURCE( SOURCE'FIRST + 1 ),
165         SOURCE( SOURCE'FIRST + 2 ),
166         SOURCE( SOURCE'FIRST + 3 )
167      );
168
169      BUFFER.FIELD2 := RTEMS.BUILD_NAME(
170         SOURCE( SOURCE'FIRST + 4 ),
171         SOURCE( SOURCE'FIRST + 5 ),
172         SOURCE( SOURCE'FIRST + 6 ),
173         SOURCE( SOURCE'FIRST + 7 )
174      );
175
176      BUFFER.FIELD3 := RTEMS.BUILD_NAME(
177         SOURCE( SOURCE'FIRST + 8 ),
178         SOURCE( SOURCE'FIRST + 9 ),
179         SOURCE( SOURCE'FIRST + 10 ),
180         SOURCE( SOURCE'FIRST + 11 )
181      );
182
183      BUFFER.FIELD4 := RTEMS.BUILD_NAME(
184         SOURCE( SOURCE'FIRST + 12 ),
185         SOURCE( SOURCE'FIRST + 13 ),
186         SOURCE( SOURCE'FIRST + 14 ),
187         SOURCE( SOURCE'FIRST + 15 )
188      );
189
190   end FILL_BUFFER;
191
192--
193--  PUT_BUFFER
194--
195
196--
197-- Depends on tricks to make the output work.
198--
199
200   procedure PUT_BUFFER (
201      BUFFER : in     SPTEST.BUFFER
202   ) is
203   begin
204
205      TEST_SUPPORT.PUT_NAME( BUFFER.FIELD1, FALSE );
206      TEST_SUPPORT.PUT_NAME( BUFFER.FIELD2, FALSE );
207      TEST_SUPPORT.PUT_NAME( BUFFER.FIELD3, FALSE );
208      TEST_SUPPORT.PUT_NAME( BUFFER.FIELD4, FALSE );
209     
210   end PUT_BUFFER;
211
212--
213--  TASK_1
214--
215
216   procedure TASK_1 (
217      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
218   ) is
219      pragma Unreferenced(ARGUMENT);
220      QID                        : RTEMS.ID;
221      BIG_SEND_BUFFER            : BIG_BUFFER_TYPE;
222      BIG_SEND_BUFFER_POINTER    : constant RTEMS.ADDRESS
223                                      := BIG_SEND_BUFFER'ADDRESS;
224      BIG_RECEIVE_BUFFER         : BIG_BUFFER_TYPE;
225      BIG_RECEIVE_BUFFER_POINTER : constant RTEMS.ADDRESS
226                                      := BIG_RECEIVE_BUFFER'ADDRESS;
227      BUFFER                     : SPTEST.BUFFER;
228      BUFFER_POINTER             : constant RTEMS.ADDRESS := BUFFER'ADDRESS;
229      COUNT                      : RTEMS.UNSIGNED32;
230      MESSAGE_SIZE               : RTEMS.UNSIGNED32 := 0;
231      STATUS                     : RTEMS.STATUS_CODES;
232      SIZE                       : RTEMS.UNSIGNED32 := 0;
233   begin
234
235      RTEMS.MESSAGE_QUEUE.IDENT( 
236         SPTEST.QUEUE_NAME( 1 ), 
237         RTEMS.SEARCH_ALL_NODES, 
238         QID, 
239         STATUS
240      );
241      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_IDENT" );
242      TEXT_IO.PUT( "TA1 - message_queue_ident - qid => " );
243      UNSIGNED32_IO.PUT( QID, WIDTH => 8, BASE => 16 );
244      TEXT_IO.NEW_LINE;
245
246      SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 1 ", BUFFER );
247      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 1" );
248      RTEMS.MESSAGE_QUEUE.SEND( 
249         SPTEST.QUEUE_ID( 1 ), 
250         BUFFER_POINTER, 
251         16,
252         STATUS
253      );
254      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
255   
256      SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 1 ", BUFFER );
257      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 1" );
258      RTEMS.MESSAGE_QUEUE.SEND( 
259         SPTEST.QUEUE_ID( 1 ), 
260         BUFFER_POINTER, 
261         16,
262         STATUS
263      );
264      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
265
266      TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" );
267      RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
268      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
269         
270      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 1 ", BUFFER );
271      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 1" );
272      RTEMS.MESSAGE_QUEUE.SEND( 
273         SPTEST.QUEUE_ID( 1 ), 
274         BUFFER_POINTER, 
275         16,
276         STATUS
277      );
278      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
279
280      TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" );
281      RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
282      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
283         
284TEST_SUPPORT.PAUSE;
285
286      SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 2 ", BUFFER );
287      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 2" );
288      RTEMS.MESSAGE_QUEUE.SEND( 
289         SPTEST.QUEUE_ID( 2 ), 
290         BUFFER_POINTER, 
291         16,
292         STATUS
293      );
294      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
295
296      TEXT_IO.PUT( 
297         "TA1 - message_queue_receive - receive from queue 1 - "
298      );
299      TEXT_IO.PUT_LINE( "10 second timeout" );
300      RTEMS.MESSAGE_QUEUE.RECEIVE(
301         SPTEST.QUEUE_ID( 1 ),
302         BUFFER_POINTER,
303         RTEMS.DEFAULT_OPTIONS,
304         10 * TEST_SUPPORT.TICKS_PER_SECOND,
305         MESSAGE_SIZE,
306         STATUS
307      );
308      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
309      TEXT_IO.PUT( "TA1 - buffer received: " );
310      SPTEST.PUT_BUFFER( BUFFER );
311      TEXT_IO.NEW_LINE;
312
313      TEXT_IO.PUT_LINE( "TA1 - task_delete - delete TA2" );
314      RTEMS.TASKS.DELETE( SPTEST.TASK_ID( 2 ), STATUS );
315      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE" );
316
317      SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 3 ", BUFFER );
318      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 3" );
319      RTEMS.MESSAGE_QUEUE.SEND( 
320         SPTEST.QUEUE_ID( 3 ), 
321         BUFFER_POINTER, 
322         16,
323         STATUS
324      );
325      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
326
327      TEXT_IO.PUT_LINE( "TA1 - task_wake_after - sleep 5 seconds" );
328      RTEMS.TASKS.WAKE_AFTER( 5 * TEST_SUPPORT.TICKS_PER_SECOND, STATUS );
329      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
330         
331TEST_SUPPORT.PAUSE;
332
333      SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 3 ", BUFFER );
334      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 3" );
335      RTEMS.MESSAGE_QUEUE.SEND( 
336         SPTEST.QUEUE_ID( 3 ), 
337         BUFFER_POINTER, 
338         16,
339         STATUS
340      );
341      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
342
343      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 3 ", BUFFER );
344      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 3" );
345      RTEMS.MESSAGE_QUEUE.SEND( 
346         SPTEST.QUEUE_ID( 3 ), 
347         BUFFER_POINTER, 
348         16,
349         STATUS
350      );
351      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
352
353      SPTEST.FILL_BUFFER( "BUFFER 4 TO Q 3 ", BUFFER );
354      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 4 TO Q 3" );
355      RTEMS.MESSAGE_QUEUE.SEND( 
356         SPTEST.QUEUE_ID( 3 ), 
357         BUFFER_POINTER, 
358         16,
359         STATUS
360      );
361      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
362
363      SPTEST.FILL_BUFFER( "BUFFER 5 TO Q 3 ", BUFFER );
364      TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 5 TO Q 3" );
365      RTEMS.MESSAGE_QUEUE.URGENT( 
366         SPTEST.QUEUE_ID( 3 ), 
367         BUFFER_POINTER, 
368         16,
369         STATUS
370      );
371      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
372
373      for TIMES in 1 .. 4 
374      loop
375         TEXT_IO.PUT( 
376            "TA1 - message_queue_receive - receive from queue 3 - "
377         );
378         TEXT_IO.PUT_LINE( "WAIT FOREVER" );
379         RTEMS.MESSAGE_QUEUE.RECEIVE(
380            SPTEST.QUEUE_ID( 3 ),
381            BUFFER_POINTER,
382            RTEMS.DEFAULT_OPTIONS,
383            RTEMS.NO_TIMEOUT,
384            MESSAGE_SIZE,
385            STATUS
386         );
387         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
388         TEXT_IO.PUT( "TA1 - buffer received: " );
389         SPTEST.PUT_BUFFER( BUFFER );
390         TEXT_IO.NEW_LINE;
391      end loop;
392
393      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 2 ", BUFFER );
394      TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 3 TO Q 2" );
395      RTEMS.MESSAGE_QUEUE.URGENT( 
396         SPTEST.QUEUE_ID( 2 ), 
397         BUFFER_POINTER, 
398         16,
399         STATUS
400      );
401      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
402
403      TEXT_IO.PUT( 
404        "TA1 - message_queue_receive - receive from queue 2 - " 
405      );
406      TEXT_IO.PUT_LINE( "WAIT FOREVER" );
407      RTEMS.MESSAGE_QUEUE.RECEIVE(
408         SPTEST.QUEUE_ID( 2 ),
409         BUFFER_POINTER,
410         RTEMS.DEFAULT_OPTIONS,
411         RTEMS.NO_TIMEOUT,
412         MESSAGE_SIZE,
413         STATUS
414      );
415      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
416      TEXT_IO.PUT( "TA1 - buffer received: " );
417      SPTEST.PUT_BUFFER( BUFFER );
418      TEXT_IO.NEW_LINE;
419
420TEST_SUPPORT.PAUSE;
421
422      TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 1" );
423      RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
424      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
425   
426      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 2 ", BUFFER );
427      TEXT_IO.PUT_LINE( "TA1 - message_queue_urgent - BUFFER 3 TO Q 2" );
428      RTEMS.MESSAGE_QUEUE.URGENT( 
429         SPTEST.QUEUE_ID( 2 ), 
430         BUFFER_POINTER, 
431         16,
432         STATUS
433      );
434      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
435
436      TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 2" );
437      RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 2 ), STATUS );
438      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
439   
440      TEXT_IO.PUT_LINE( "TA1 - message_queue_get_number_pending - check Q 3" );
441      RTEMS.MESSAGE_QUEUE.GET_NUMBER_PENDING(
442         SPTEST.QUEUE_ID( 3 ), COUNT, STATUS
443      );
444      TEST_SUPPORT.DIRECTIVE_FAILED(
445         STATUS, "MESSAGE_QUEUE_GET_NUMBER_PENDING"
446      );
447      TEXT_IO.PUT( "TA1 - " );
448      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
449      TEXT_IO.PUT_LINE( " messages are pending on Q 3" );
450   
451      TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - empty Q 3" );
452      RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS );
453      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
454      TEXT_IO.PUT( "TA1 - " );
455      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
456      TEXT_IO.PUT_LINE( " messages were flushed from Q 3" );
457     
458      SPTEST.FILL_BUFFER( "BUFFER 1 TO Q 3 ", BUFFER );
459      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 1 TO Q 3" );
460      RTEMS.MESSAGE_QUEUE.SEND( 
461         SPTEST.QUEUE_ID( 3 ), 
462         BUFFER_POINTER, 
463         16,
464         STATUS
465      );
466      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
467
468      SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 3 ", BUFFER );
469      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 2 TO Q 3" );
470      RTEMS.MESSAGE_QUEUE.SEND( 
471         SPTEST.QUEUE_ID( 3 ), 
472         BUFFER_POINTER, 
473         16,
474         STATUS
475      );
476      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
477
478      -- this broadcast should have no effect on the queue
479      SPTEST.FIlL_BUFFER( "NO BUFFER TO Q1 ", BUFFER );
480      TEXT_IO.PUT_LINE( "TA1 - message_queue_broadcast - NO BUFFER TO Q1" );
481      RTEMS.MESSAGE_QUEUE.BROADCAST(
482         SPTEST.QUEUE_ID( 1 ),
483         BUFFER_POINTER,
484         16,
485         COUNT,
486         STATUS
487      );
488      TEXT_IO.PUT( "TA1 - number of tasks awakened = " );
489      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
490      TEXT_IO.NEW_LINE;
491   
492      TEXT_IO.PUT_LINE( "TA1 - message_queue_get_number_pending - check Q 3" );
493      RTEMS.MESSAGE_QUEUE.GET_NUMBER_PENDING(
494         SPTEST.QUEUE_ID( 3 ), COUNT, STATUS
495      );
496      TEST_SUPPORT.DIRECTIVE_FAILED(
497         STATUS, "MESSAGE_QUEUE_GET_NUMBER_PENDING"
498      );
499      TEXT_IO.PUT( "TA1 - " );
500      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
501      TEXT_IO.PUT_LINE( " messages are pending on Q 3" );
502
503      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 3 ", BUFFER );
504      TEXT_IO.PUT_LINE( "TA1 - message_queue_send - BUFFER 3 TO Q 3" );
505      RTEMS.MESSAGE_QUEUE.SEND( 
506         SPTEST.QUEUE_ID( 3 ), 
507         BUFFER_POINTER, 
508         16,
509         STATUS
510      );
511      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
512
513      TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - Q 3" );
514      RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS );
515      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
516      TEXT_IO.PUT( "TA1 - " );
517      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
518      TEXT_IO.PUT_LINE( " messages were flushed from Q 3" );
519     
520      TEXT_IO.PUT_LINE( 
521         "TA1 - message_queue_send - until all message buffers consumed"
522      );
523      loop
524
525         RTEMS.MESSAGE_QUEUE.SEND( 
526            SPTEST.QUEUE_ID( 3 ), 
527            BUFFER_POINTER, 
528            16,
529            STATUS
530         );
531         
532         exit when RTEMS.ARE_STATUSES_EQUAL( STATUS, RTEMS.TOO_MANY );
533
534         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
535         
536      end loop;
537
538      TEXT_IO.PUT_LINE( 
539         "TA1 - message_queue_send - all message buffers consumed"
540      );
541
542      TEXT_IO.PUT_LINE( "TA1 - message_queue_flush - Q 3" );
543      RTEMS.MESSAGE_QUEUE.FLUSH( SPTEST.QUEUE_ID( 3 ), COUNT, STATUS );
544      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_FLUSH" );
545      TEXT_IO.PUT( "TA1 - " );
546      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
547      TEXT_IO.PUT_LINE( " messages were flushed from Q 3" );
548
549TEST_SUPPORT.PAUSE;
550     
551      TEXT_IO.PUT_LINE( "TA1 - create message queue of 20 bytes on queue 1" );
552      RTEMS.MESSAGE_QUEUE.CREATE(
553         SPTEST.QUEUE_NAME( 1 ),
554         100,
555         20,
556         RTEMS.DEFAULT_ATTRIBUTES,
557         SPTEST.QUEUE_ID( 1 ),
558         STATUS
559      );
560      TEST_SUPPORT.DIRECTIVE_FAILED(
561         STATUS, "MESSAGE_QUEUE_CREATE of Q1; 20 bytes each"
562      );
563      RTEMS.MESSAGE_QUEUE.SEND(
564         SPTEST.QUEUE_ID( 1 ), BIG_SEND_BUFFER_POINTER, 40, STATUS
565      );
566      TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
567         STATUS, RTEMS.INVALID_SIZE, "expected INVALID_SIZE"
568      );
569
570      TEXT_IO.PUT_LINE( "TA1 - message_queue_delete - delete queue 1" );
571      RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
572      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
573
574TEST_SUPPORT.PAUSE;
575
576      TEXT_IO.PUT_LINE( "TA1 - message_queue_create - variable sizes " );
577      for QUEUE_SIZE in 1 .. 1029 loop
578          RTEMS.MESSAGE_QUEUE.CREATE(
579              SPTEST.QUEUE_NAME( 1 ),
580              2,            -- just 2 msgs each
581              RTEMS.UNSIGNED32( QUEUE_SIZE ),
582              RTEMS.DEFAULT_ATTRIBUTES,
583              QUEUE_ID( 1 ),
584              STATUS
585          );
586          if STATUS /= RTEMS.SUCCESSFUL then
587              TEXT_IO.PUT( "TA1 - msq que size: " );
588              UNSIGNED32_IO.PUT(
589                 RTEMS.UNSIGNED32( QUEUE_SIZE ), WIDTH => 3, BASE => 10
590              );
591              TEXT_IO.NEW_LINE;
592              TEST_SUPPORT.DIRECTIVE_FAILED(
593                 STATUS, "message_queue_create of Q1"
594              );
595          end if;
596
597          RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
598          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "message_queue_delete" );
599      end loop;
600
601      TEXT_IO.PUT_LINE(
602         "TA1 - message_queue_create and send - variable sizes "
603      );
604      for QUEUE_SIZE in 1 .. 1029 loop
605
606          RTEMS.MESSAGE_QUEUE.CREATE(
607              SPTEST.QUEUE_NAME( 1 ),
608              2,            -- just 2 msgs each
609              RTEMS.UNSIGNED32( QUEUE_SIZE ),
610              RTEMS.DEFAULT_ATTRIBUTES,
611              SPTEST.QUEUE_ID( 1 ),
612              STATUS
613          );
614          TEST_SUPPORT.DIRECTIVE_FAILED(status, "message_queue_create of Q1");
615
616          BIG_SEND_BUFFER := (others => CHARACTER'POS( 'A' ));
617          BIG_RECEIVE_BUFFER := (others => CHARACTER'POS( 'Z' ));
618
619          -- send a msg too big
620          RTEMS.MESSAGE_QUEUE.SEND(
621             SPTEST.QUEUE_ID( 1 ),
622             BIG_SEND_BUFFER_POINTER,
623             RTEMS.UNSIGNED32( QUEUE_SIZE + 1 ),
624             STATUS
625          );
626          TEST_SUPPORT.FATAL_DIRECTIVE_STATUS(
627             STATUS, RTEMS.INVALID_SIZE, "message_queue_send too large"
628          );
629
630          -- send a msg that is just right
631          RTEMS.MESSAGE_QUEUE.SEND(
632             SPTEST.QUEUE_ID( 1 ),
633             BIG_SEND_BUFFER_POINTER,
634             RTEMS.UNSIGNED32( QUEUE_SIZE ),
635             STATUS
636          );
637          TEST_SUPPORT.DIRECTIVE_FAILED(
638             STATUS, "message_queue_send exact size"
639          );
640
641          -- now read and verify the message just sent
642          SIZE := INTERFACES.UNSIGNED_32(QUEUE_SIZE);
643          RTEMS.MESSAGE_QUEUE.RECEIVE(
644             SPTEST.QUEUE_ID( 1 ),
645             BIG_RECEIVE_BUFFER_POINTER,
646             RTEMS.DEFAULT_OPTIONS,
647             1 * TEST_SUPPORT.TICKS_PER_SECOND,
648             SIZE,
649             STATUS
650          );
651          TEST_SUPPORT.DIRECTIVE_FAILED(
652             STATUS, "message_queue_receive exact size"
653          );
654          if SIZE /= RTEMS.UNSIGNED32( QUEUE_SIZE ) then
655              TEXT_IO.PUT(
656                 "TA1 - exact size size match failed for queue_size = "
657              );
658              UNSIGNED32_IO.PUT(
659                 RTEMS.UNSIGNED32( QUEUE_SIZE ), WIDTH => 3, BASE => 10
660              );
661              TEXT_IO.NEW_LINE;
662          end if;
663
664          if (BIG_SEND_BUFFER( BIG_SEND_BUFFER'FIRST .. Integer( SIZE )) /=
665            BIG_RECEIVE_BUFFER( BIG_RECEIVE_BUFFER'FIRST .. Integer( SIZE )))
666          then
667              TEXT_IO.PUT_LINE("TA1 - exact size data match failed");
668          end if;
669
670          for I in Integer( SIZE + 1 ) .. BIG_RECEIVE_BUFFER'LAST loop
671              if BIG_RECEIVE_BUFFER( I ) /= CHARACTER'POS( 'Z' ) then
672                  TEXT_IO.PUT_LINE("TA1 - exact size overrun match failed");
673              end if;
674          end loop;
675
676          -- all done with this one; delete it
677          RTEMS.MESSAGE_QUEUE.DELETE( SPTEST.QUEUE_ID( 1 ), STATUS );
678          TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "message_queue_delete" );
679      end loop;
680
681      TEST_SUPPORT.ADA_TEST_END;
682      RTEMS.SHUTDOWN_EXECUTIVE( 0 );
683
684   end TASK_1;
685
686--
687--  TASK_2
688--
689
690   procedure TASK_2 (
691      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
692   ) is
693      pragma Unreferenced(ARGUMENT);
694      BUFFER            : SPTEST.BUFFER;
695      BUFFER_POINTER    : RTEMS.ADDRESS;
696      PREVIOUS_PRIORITY : RTEMS.TASKS.PRIORITY;
697      MESSAGE_SIZE      : RTEMS.UNSIGNED32 := 0;
698      STATUS            : RTEMS.STATUS_CODES;
699   begin
700
701      BUFFER_POINTER := BUFFER'ADDRESS;
702
703      TEXT_IO.PUT_LINE( 
704         "TA2 - message_queue_receive - receive from queue 1 - NO_WAIT"
705      );
706      RTEMS.MESSAGE_QUEUE.RECEIVE(
707         SPTEST.QUEUE_ID( 1 ),
708         BUFFER_POINTER,
709         RTEMS.NO_WAIT,
710         RTEMS.NO_TIMEOUT,
711         MESSAGE_SIZE,
712         STATUS
713      );
714      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
715      TEXT_IO.PUT( "TA2 - buffer received: " );
716      SPTEST.PUT_BUFFER( BUFFER );
717      TEXT_IO.NEW_LINE;
718
719      TEXT_IO.PUT_LINE( 
720         "TA2 - message_queue_receive - receive from queue 1 - WAIT FOREVER"
721      );
722      RTEMS.MESSAGE_QUEUE.RECEIVE(
723         SPTEST.QUEUE_ID( 1 ),
724         BUFFER_POINTER,
725         RTEMS.DEFAULT_OPTIONS,
726         RTEMS.NO_TIMEOUT,
727         MESSAGE_SIZE,
728         STATUS
729      );
730      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
731      TEXT_IO.PUT( "TA2 - buffer received: " );
732      SPTEST.PUT_BUFFER( BUFFER );
733      TEXT_IO.NEW_LINE;
734
735      TEXT_IO.PUT_LINE( 
736         "TA2 - message_queue_receive - receive from queue 1 - WAIT FOREVER"
737      );
738      RTEMS.MESSAGE_QUEUE.RECEIVE(
739         SPTEST.QUEUE_ID( 1 ),
740         BUFFER_POINTER,
741         RTEMS.DEFAULT_OPTIONS,
742         RTEMS.NO_TIMEOUT,
743         MESSAGE_SIZE,
744         STATUS
745      );
746      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
747      TEXT_IO.PUT( "TA2 - buffer received: " );
748      SPTEST.PUT_BUFFER( BUFFER );
749      TEXT_IO.NEW_LINE;
750
751      TEXT_IO.PUT_LINE( 
752         "TA2 - task_set_priority - make self highest priority task"
753      );
754      RTEMS.TASKS.SET_PRIORITY(
755         RTEMS.SELF,
756         3,
757         PREVIOUS_PRIORITY,
758         STATUS
759      );
760      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" );
761
762      TEXT_IO.PUT_LINE( 
763         "TA2 - message_queue_receive - receive from queue 2 - WAIT FOREVER"
764      );
765      RTEMS.MESSAGE_QUEUE.RECEIVE(
766         SPTEST.QUEUE_ID( 2 ),
767         BUFFER_POINTER,
768         RTEMS.DEFAULT_OPTIONS,
769         RTEMS.NO_TIMEOUT,
770         MESSAGE_SIZE,
771         STATUS
772      );
773      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
774      TEXT_IO.PUT( "TA2 - buffer received: " );
775      SPTEST.PUT_BUFFER( BUFFER );
776      TEXT_IO.NEW_LINE;
777
778      SPTEST.FILL_BUFFER( "BUFFER 2 TO Q 2 ", BUFFER );
779      TEXT_IO.PUT_LINE( "TA2 - message_queue_send - BUFFER 2 TO Q 2" );
780      RTEMS.MESSAGE_QUEUE.SEND( 
781         SPTEST.QUEUE_ID( 2 ), 
782         BUFFER_POINTER, 
783         16,
784         STATUS
785      );
786      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_SEND" );
787   
788      TEXT_IO.PUT_LINE( 
789    "TA2 - message_queue_receive - receive from queue 1 - 10 second timeout"
790      );
791      RTEMS.MESSAGE_QUEUE.RECEIVE(
792         SPTEST.QUEUE_ID( 1 ),
793         BUFFER_POINTER,
794         RTEMS.DEFAULT_OPTIONS,
795         10 * TEST_SUPPORT.TICKS_PER_SECOND,
796         MESSAGE_SIZE,
797         STATUS
798      );
799      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
800      TEXT_IO.PUT( "TA2 - buffer received: " );
801      SPTEST.PUT_BUFFER( BUFFER );
802      TEXT_IO.NEW_LINE;
803
804      TEXT_IO.PUT_LINE( 
805         "TA2 - message_queue_receive - receive from queue 3 - WAIT FOREVER"
806      );
807      RTEMS.MESSAGE_QUEUE.RECEIVE(
808         SPTEST.QUEUE_ID( 3 ),
809         BUFFER_POINTER,
810         RTEMS.DEFAULT_OPTIONS,
811         RTEMS.NO_TIMEOUT,
812         MESSAGE_SIZE,
813         STATUS
814      );
815      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
816      TEXT_IO.PUT( "TA2 - buffer received: " );
817      SPTEST.PUT_BUFFER( BUFFER );
818      TEXT_IO.NEW_LINE;
819
820   end TASK_2;
821
822--
823--  TASK_3
824--
825
826   procedure TASK_3 (
827      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
828   ) is
829      pragma Unreferenced(ARGUMENT);
830      BUFFER         : SPTEST.BUFFER;
831      BUFFER_POINTER : RTEMS.ADDRESS;
832      COUNT          : RTEMS.UNSIGNED32;
833      MESSAGE_SIZE   : RTEMS.UNSIGNED32 := 0;
834      STATUS         : RTEMS.STATUS_CODES;
835   begin
836
837      BUFFER_POINTER := BUFFER'ADDRESS;
838
839      TEXT_IO.PUT_LINE( 
840         "TA3 - message_queue_receive - receive from queue 2 - WAIT FOREVER"
841      );
842      RTEMS.MESSAGE_QUEUE.RECEIVE(
843         SPTEST.QUEUE_ID( 2 ),
844         BUFFER_POINTER,
845         RTEMS.DEFAULT_OPTIONS,
846         RTEMS.NO_TIMEOUT,
847         MESSAGE_SIZE,
848         STATUS
849      );
850      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
851      TEXT_IO.PUT( "TA3 - buffer received: " );
852      SPTEST.PUT_BUFFER( BUFFER );
853      TEXT_IO.NEW_LINE;
854
855      SPTEST.FILL_BUFFER( "BUFFER 3 TO Q 1 ", BUFFER );
856      TEXT_IO.PUT_LINE( "TA3 - message_queue_broadcast - BUFFER 3 TO Q 1" );
857      RTEMS.MESSAGE_QUEUE.BROADCAST( 
858         SPTEST.QUEUE_ID( 1 ), 
859         BUFFER_POINTER, 
860         16,
861         COUNT,
862         STATUS
863      );
864      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_BROADCAST" );
865      TEXT_IO.PUT( "TA3 - number of tasks awakened = " );
866      UNSIGNED32_IO.PUT( COUNT, WIDTH => 3, BASE => 10 );
867      TEXT_IO.NEW_LINE;
868     
869      TEXT_IO.PUT_LINE( 
870         "TA3 - message_queue_receive - receive from queue 3 - WAIT FOREVER"
871      );
872      RTEMS.MESSAGE_QUEUE.RECEIVE(
873         SPTEST.QUEUE_ID( 3 ),
874         BUFFER_POINTER,
875         RTEMS.DEFAULT_OPTIONS,
876         RTEMS.NO_TIMEOUT,
877         MESSAGE_SIZE,
878         STATUS
879      );
880      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
881      TEXT_IO.PUT( "TA3 - buffer received: " );
882      SPTEST.PUT_BUFFER( BUFFER );
883      TEXT_IO.NEW_LINE;
884
885      TEXT_IO.PUT_LINE( "TA3 - task_delete - delete self" );
886      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
887      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
888
889   end TASK_3;
890
891end SPTEST;
Note: See TracBrowser for help on using the repository browser.