source: rtems/c/src/tests/sptests/sp13/task1.c @ 3aa4c2e0

4.104.114.84.95
Last change on this file since 3aa4c2e0 was 3aa4c2e0, checked in by Joel Sherrill <joel.sherrill@…>, on 08/02/02 at 00:52:14

2002-08-01 Joel Sherrill <joel@…>

  • Per PR47 add support for buffered test output. This involved adding defines to redirect output to a buffer and dump it when full, at "test pause", and at exit. To avoid problems when redefining exit(), all tests were modified to call rtems_test_exit(). Some tests, notable psxtests, had to be modified to include the standard test macro .h file (pmacros.h or tmacros.h) to enable this support.
  • sp01/task1.c, sp02/task1.c, sp03/task2.c, sp04/task1.c, sp05/task1.c, sp06/task1.c, sp07/taskexit.c, sp08/task1.c, sp09/task1.c, sp11/task1.c, sp12/pritask.c, sp12/task5.c, sp13/task1.c, sp14/task2.c, sp15/task1.c, sp16/task1.c, sp17/task1.c, sp19/fptask.c, sp20/task1.c, sp21/task1.c, sp22/task1.c, sp23/task1.c, sp24/task1.c, sp25/task1.c, sp26/init.c, sp26/task1.c, sp30/task1.c, sp31/task1.c, spsize/init.c, spsize/size.c: Modified.
  • Property mode set to 100644
File size: 12.3 KB
Line 
1/*  Task_1
2 *
3 *  This routine serves as a test task.  It verifies the message manager.
4 *
5 *  Input parameters:
6 *    argument - task argument
7 *
8 *  Output parameters:  NONE
9 *
10 *  COPYRIGHT (c) 1989-1999.
11 *  On-Line Applications Research Corporation (OAR).
12 *
13 *  The license and distribution terms for this file may be
14 *  found in the file LICENSE in this distribution or at
15 *  http://www.OARcorp.com/rtems/license.html.
16 *
17 *  $Id$
18 */
19
20#include "system.h"
21#include <string.h>             /* for memcmp */
22
23char    big_send_buffer[2048];
24char    big_receive_buffer[2048];
25
26long    buffer[ 4 ];
27
28#define MESSAGE_SIZE (sizeof(long) * 4)
29
30void dope_buffer(unsigned char *buff,
31                 int   buff_size,
32                 unsigned32 v)
33{
34    int i;
35    unsigned char ch;
36
37    ch = (' ' + (v % (0x7f - ' ')));
38   
39    for (i=0; i<buff_size; i++)
40    {
41        *buff++ = ch++;
42        if (ch >= 0x7f)
43            ch = ' ';
44    }
45}
46
47rtems_task Task_1(
48  rtems_task_argument argument
49)
50{
51  rtems_id          qid;
52  rtems_unsigned32  index;
53  rtems_unsigned32  count;
54  rtems_status_code status;
55  rtems_unsigned32  size;
56  rtems_unsigned32  queue_size;
57  char             *cp;
58 
59  status = rtems_message_queue_ident(
60    Queue_name[ 1 ],
61    RTEMS_SEARCH_ALL_NODES,
62    &qid
63  );
64  printf( "TA1 - rtems_message_queue_ident - qid => %08x\n", qid );
65  directive_failed( status, "rtems_message_queue_ident" );
66
67  Fill_buffer( "BUFFER 1 TO Q 1", buffer );
68  puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1" );
69  status = rtems_message_queue_send( Queue_id[ 1 ], buffer, MESSAGE_SIZE );
70  directive_failed( status, "rtems_message_queue_send" );
71
72  Fill_buffer( "BUFFER 2 TO Q 1", buffer );
73  puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1" );
74  status = rtems_message_queue_send( Queue_id[ 1 ], buffer, MESSAGE_SIZE );
75  directive_failed( status, "rtems_message_queue_send" );
76
77  puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
78  status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
79  directive_failed( status, "rtems_task_wake_after" );
80
81  Fill_buffer( "BUFFER 3 TO Q 1", buffer );
82  puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1" );
83  status = rtems_message_queue_send( Queue_id[ 1 ], buffer, MESSAGE_SIZE );
84  directive_failed( status, "rtems_message_queue_send" );
85
86  puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
87  status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
88  directive_failed( status, "rtems_task_wake_after" );
89
90rtems_test_pause();
91
92  Fill_buffer( "BUFFER 1 TO Q 2", buffer );
93  puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 2" );
94  status = rtems_message_queue_send( Queue_id[ 2 ], buffer, MESSAGE_SIZE );
95  directive_failed( status, "rtems_message_queue_send" );
96
97  puts_nocr( "TA1 - rtems_message_queue_receive - receive from queue 1 - " );
98  puts     ( "10 second timeout" );
99  status = rtems_message_queue_receive(
100    Queue_id[ 1 ],
101    buffer,
102    &size,
103    RTEMS_DEFAULT_OPTIONS,
104    10 * TICKS_PER_SECOND
105  );
106  directive_failed( status, "rtems_message_queue_receive" );
107  puts_nocr( "TA1 - buffer received: " );
108  Put_buffer( buffer );
109  new_line;
110
111  puts( "TA1 - rtems_task_delete - delete TA2" );
112  status = rtems_task_delete( Task_id[ 2 ] );
113  directive_failed( status, "rtems_task_delete" );
114
115  Fill_buffer( "BUFFER 1 TO Q 3", buffer );
116  puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 3" );
117  status = rtems_message_queue_send( Queue_id[ 3 ], buffer, MESSAGE_SIZE );
118  directive_failed( status, "rtems_message_queue_send" );
119
120  puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
121  status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
122  directive_failed( status, "rtems_task_wake_after" );
123
124rtems_test_pause();
125
126  Fill_buffer( "BUFFER 2 TO Q 3", buffer );
127  puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 3" );
128  status = rtems_message_queue_send( Queue_id[ 3 ], buffer, MESSAGE_SIZE );
129  directive_failed( status, "rtems_message_queue_send" );
130
131  Fill_buffer( "BUFFER 3 TO Q 3", buffer );
132  puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 3" );
133  status = rtems_message_queue_send( Queue_id[ 3 ], buffer, MESSAGE_SIZE );
134  directive_failed( status, "rtems_message_queue_send" );
135
136  Fill_buffer( "BUFFER 4 TO Q 3", buffer );
137  puts( "TA1 - rtems_message_queue_send - BUFFER 4 TO Q 3" );
138  status = rtems_message_queue_send( Queue_id[ 3 ], buffer, MESSAGE_SIZE );
139  directive_failed( status, "rtems_message_queue_send" );
140
141  Fill_buffer( "BUFFER 5 TO Q 3", buffer );
142  puts( "TA1 - rtems_message_queue_urgent - BUFFER 5 TO Q 3" );
143  status = rtems_message_queue_urgent( Queue_id[ 3 ], buffer, MESSAGE_SIZE );
144  directive_failed( status, "rtems_message_queue_urgent" );
145
146  for ( index = 1 ; index <= 4 ; index++ ) {
147    puts(
148      "TA1 - rtems_message_queue_receive - receive from queue 3 - "
149        "RTEMS_WAIT FOREVER"
150    );
151    status = rtems_message_queue_receive(
152      Queue_id[ 3 ],
153      buffer,
154      &size,
155      RTEMS_DEFAULT_OPTIONS,
156      RTEMS_NO_TIMEOUT
157    );
158    directive_failed( status, "rtems_message_queue_receive" );
159    puts_nocr( "TA1 - buffer received: " );
160    Put_buffer( buffer );
161    new_line;
162  }
163
164  Fill_buffer( "BUFFER 3 TO Q 2", buffer );
165  puts( "TA1 - rtems_message_queue_urgent - BUFFER 3 TO Q 2" );
166  status = rtems_message_queue_urgent( Queue_id[ 2 ], buffer, MESSAGE_SIZE );
167  directive_failed( status, "rtems_message_queue_urgent" );
168
169  puts(
170    "TA1 - rtems_message_queue_receive - receive from queue 2 - "
171      "RTEMS_WAIT FOREVER"
172  );
173  status = rtems_message_queue_receive(
174    Queue_id[ 2 ],
175    buffer,
176    &size,
177    RTEMS_DEFAULT_OPTIONS,
178    RTEMS_NO_TIMEOUT
179  );
180  directive_failed( status, "rtems_message_queue_receive" );
181  puts_nocr( "TA1 - buffer received: " );
182  Put_buffer( buffer );
183  new_line;
184
185rtems_test_pause();
186
187  puts( "TA1 - rtems_message_queue_delete - delete queue 1" );
188  status = rtems_message_queue_delete( Queue_id[ 1 ] );
189  directive_failed( status, "rtems_message_queue_delete" );
190
191  Fill_buffer( "BUFFER 3 TO Q 2", buffer );
192  puts( "TA1 - rtems_message_queue_urgent - BUFFER 3 TO Q 2" );
193  status = rtems_message_queue_urgent( Queue_id[ 2 ], buffer, MESSAGE_SIZE );
194  directive_failed( status, "rtems_message_queue_urgent" );
195
196  puts( "TA1 - rtems_message_queue_delete - delete queue 2" );
197  status = rtems_message_queue_delete( Queue_id[ 2 ] );
198  directive_failed( status, "rtems_message_queue_delete" );
199
200  puts( "TA1 - rtems_message_queue_get_number_pending - SUCCESSFUL\n" );
201  status = rtems_message_queue_get_number_pending( Queue_id[ 3 ], &count );
202  printf( "TA1 - %d messages are pending on Q 3\n", count );
203
204  puts( "TA1 - rtems_message_queue_flush - empty Q 3" );
205  status = rtems_message_queue_flush( Queue_id[ 3 ], &count );
206  printf( "TA1 - %d messages were flushed from Q 3\n", count );
207
208  Fill_buffer( "BUFFER 1 TO Q 3", buffer );
209  puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 3" );
210  status = rtems_message_queue_send( Queue_id[ 3 ], buffer, MESSAGE_SIZE );
211  directive_failed( status, "rtems_message_queue_send" );
212
213  Fill_buffer( "BUFFER 2 TO Q 3", buffer );
214  puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 3" );
215  status = rtems_message_queue_send( Queue_id[ 3 ], buffer, MESSAGE_SIZE );
216  directive_failed( status, "rtems_message_queue_send" );
217
218  /* this broadcast should have no effect on the queue */
219  Fill_buffer( "NO BUFFER TO Q1", (long *)buffer );
220  puts( "TA3 - rtems_message_queue_broadcast - NO BUFFER TO Q1" );
221  status = rtems_message_queue_broadcast(
222    Queue_id[ 1 ],
223    (long (*)[4])buffer,
224    16,
225    &count
226  );
227  printf( "TA3 - number of tasks awakened = %d\n", count );
228
229
230  puts( "TA1 - rtems_message_queue_get_number_pending - SUCCESSFUL\n" );
231  status = rtems_message_queue_get_number_pending( Queue_id[ 3 ], &count );
232  printf( "TA1 - %d messages are pending on Q 3\n", count );
233
234  Fill_buffer( "BUFFER 3 TO Q 3", buffer );
235  puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 3" );
236  status = rtems_message_queue_send( Queue_id[ 3 ], buffer, MESSAGE_SIZE );
237  directive_failed( status, "rtems_message_queue_send" );
238
239  puts( "TA1 - rtems_message_queue_flush - Q 3" );
240  status = rtems_message_queue_flush( Queue_id[ 3 ], &count );
241  printf( "TA1 - %d messages were flushed from Q 3\n", count );
242
243  puts( "TA1 - rtems_message_queue_send until all message buffers consumed" );
244  while ( FOREVER ) {
245    status = rtems_message_queue_send( Queue_id[ 3 ], buffer, MESSAGE_SIZE );
246    if ( status == RTEMS_TOO_MANY ) break;
247    directive_failed( status, "rtems_message_queue_send loop" );
248  }
249
250  puts( "TA1 - all message buffers consumed" );
251  puts( "TA1 - rtems_message_queue_flush - Q 3" );
252  status = rtems_message_queue_flush( Queue_id[ 3 ], &count );
253  printf( "TA1 - %d messages were flushed from Q 3\n", count );
254
255rtems_test_pause();
256
257  puts( "TA1 - create message queue of 20 bytes on queue 1" );
258  status = rtems_message_queue_create(
259    Queue_name[ 1 ],
260    100,
261    20,
262    RTEMS_DEFAULT_ATTRIBUTES,
263    &Queue_id[ 1 ]
264  );
265  directive_failed( status, "rtems_message_queue_create of Q1; 20 bytes each" );
266  status = rtems_message_queue_send( Queue_id[ 3 ], big_send_buffer, 40 );
267  fatal_directive_status(status, RTEMS_INVALID_SIZE, "expected RTEMS_INVALID_SIZE");
268 
269  puts( "TA1 - rtems_message_queue_delete - delete queue 1" );
270  status = rtems_message_queue_delete( Queue_id[ 1 ] );
271  directive_failed( status, "rtems_message_queue_delete" );
272
273rtems_test_pause();
274 
275  puts( "TA1 - rtems_message_queue_create - variable sizes " );
276  for (queue_size = 1; queue_size < 1030; queue_size++)
277  {
278      status = rtems_message_queue_create(
279          Queue_name[ 1 ],
280          2,            /* just 2 msgs each */
281          queue_size,
282          RTEMS_DEFAULT_ATTRIBUTES,
283          &Queue_id[ 1 ]
284          );
285      if (status != RTEMS_SUCCESSFUL)
286      {
287          printf("TA1 - msq que size: %d\n", queue_size);
288          directive_failed( status, "rtems_message_queue_create of Q1" );
289      }
290
291      status = rtems_message_queue_delete( Queue_id[ 1 ] );
292      directive_failed( status, "rtems_message_queue_delete" );
293  }
294 
295  puts( "TA1 - rtems_message_queue_create and send - variable sizes " );
296  for (queue_size = 1; queue_size < 1030; queue_size++)
297  {
298      /* printf("TA1 - message queue size: %d\n", queue_size); */
299
300      status = rtems_message_queue_create(
301          Queue_name[ 1 ],
302          2,            /* just 2 msgs each */
303          queue_size,
304          RTEMS_DEFAULT_ATTRIBUTES,
305          &Queue_id[ 1 ]
306          );
307
308      directive_failed( status, "rtems_message_queue_create of Q1" );
309
310      dope_buffer(big_send_buffer, sizeof(big_send_buffer), queue_size);
311      memset(big_receive_buffer, 'Z', sizeof(big_receive_buffer));
312
313      /* send a msg too big */
314      status = rtems_message_queue_send( Queue_id[ 1 ],
315                                         big_send_buffer,
316                                         queue_size + 1 );
317
318      fatal_directive_status(status,
319                             RTEMS_INVALID_SIZE,
320                             "rtems_message_queue_send too large");
321
322      /* send a msg that is just right */
323      status = rtems_message_queue_send(Queue_id[ 1 ],
324                                        big_send_buffer,
325                                        queue_size);
326      directive_failed(status, "rtems_message_queue_send exact size");
327
328      /* now read and verify the message just sent */
329      status = rtems_message_queue_receive(Queue_id[ 1 ],
330                                           big_receive_buffer,
331                                           &size,
332                                           RTEMS_DEFAULT_OPTIONS,
333                                           1 * TICKS_PER_SECOND);
334      directive_failed(status, "rtems_message_queue_receive exact size");
335      if (size != queue_size)
336      {
337          puts("TA1 - exact size size match failed");
338          rtems_test_exit(1);
339      }
340
341      if (memcmp(big_send_buffer, big_receive_buffer, size) != 0)
342      {
343          puts("TA1 - exact size data match failed");
344          rtems_test_exit(1);
345      }
346
347      for (cp = (big_receive_buffer + size);
348           cp < (big_receive_buffer + sizeof(big_receive_buffer));
349           cp++)
350          if (*cp != 'Z')
351          {
352              puts("TA1 - exact size overrun match failed");
353              rtems_test_exit(1);
354          }
355         
356      /* all done with this one; delete it */
357      status = rtems_message_queue_delete( Queue_id[ 1 ] );
358      directive_failed( status, "rtems_message_queue_delete" );
359  }
360 
361  puts( "*** END OF TEST 13 ***" );
362  rtems_test_exit( 0 );
363}
Note: See TracBrowser for help on using the repository browser.