source: rtems/testsuites/sptests/sp13/task1.c @ 458bd34

4.104.114.84.95
Last change on this file since 458bd34 was 458bd34, checked in by Joel Sherrill <joel.sherrill@…>, on 11/05/99 at 16:44:02

This is another pass at making sure that nothing outside the BSP
unnecessarily uses any variables defined by the BSP. On this
sweep, use of BSP_Configuration and Cpu_table was eliminated.

A significant part of this modification was the addition of
macros to access fields in the RTEMS configuration structures.

This is necessary to strengthen the division between the BSP independent
parts of RTEMS and the BSPs themselves. This started after
comments and analysis by Ralf Corsepius <corsepiu@…>.

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