source: rtems/c/src/tests/tmtests/tm26/task1.c @ 3652ad35

4.104.114.84.95
Last change on this file since 3652ad35 was 3652ad35, checked in by Joel Sherrill <joel.sherrill@…>, on 09/19/95 at 14:53:29

Minor bug fixes to get all targets compilable and running. The
single biggest changes were the expansion of the workspace size
macro to include other types of objects and the increase in the
minimum stack size for most CPUs.

  • Property mode set to 100644
File size: 10.4 KB
Line 
1/*
2 *
3 *  COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
4 *  On-Line Applications Research Corporation (OAR).
5 *  All rights assigned to U.S. Government, 1994.
6 *
7 *  This material may be reproduced by or for the U.S. Government pursuant
8 *  to the copyright license under the clause at DFARS 252.227-7013.  This
9 *  notice must appear in all copies of this file and its derivatives.
10 *
11 *  $Id$
12 */
13
14#define TEST_INIT
15#include <rtems.h>
16#include "system.h"
17#include "fptest.h"
18#include <coverhd.h>
19#include <tmacros.h>
20#include <timesys.h>
21
22
23/* TEST DATA */
24rtems_id Semaphore_id;
25
26Objects_Locations location;   /* uses internal RTEMS type */
27
28Thread_Control *Middle_tcb;   /* uses internal RTEMS type */
29
30Thread_Control *Low_tcb;      /* uses internal RTEMS type */
31
32rtems_task High_task(
33  rtems_task_argument argument
34);
35
36rtems_task Middle_task(
37  rtems_task_argument argument
38);
39
40rtems_task Low_task(
41  rtems_task_argument argument
42);
43
44rtems_task Floating_point_task_1(
45  rtems_task_argument argument
46);
47
48rtems_task Floating_point_task_2(
49  rtems_task_argument argument
50);
51
52void complete_test( void );
53
54rtems_task null_task(
55  rtems_task_argument argument
56)
57{
58}
59
60rtems_task Init(
61  rtems_task_argument argument
62)
63{
64  rtems_unsigned32  index;
65  rtems_id          task_id;
66  rtems_status_code status;
67
68  Print_Warning();
69
70  puts( "\n\n*** TIME TEST 26 ***" );
71
72  status = rtems_task_create(
73    rtems_build_name( 'F', 'P', '1', ' ' ),
74    201,
75    RTEMS_MINIMUM_STACK_SIZE,
76    RTEMS_DEFAULT_MODES,
77    RTEMS_FLOATING_POINT,
78    &task_id
79  );
80  directive_failed( status, "rtems_task_create of FP1" );
81
82  status = rtems_task_start( task_id, Floating_point_task_1, 0 );
83  directive_failed( status, "rtems_task_start of FP1" );
84
85  status = rtems_task_create(
86    rtems_build_name( 'F', 'P', '2', ' ' ),
87    202,
88    RTEMS_MINIMUM_STACK_SIZE,
89    RTEMS_DEFAULT_MODES,
90    RTEMS_FLOATING_POINT,
91    &task_id
92  );
93  directive_failed( status, "rtems_task_create of FP2" );
94
95  status = rtems_task_start( task_id, Floating_point_task_2, 0 );
96  directive_failed( status, "rtems_task_start of FP2" );
97
98  status = rtems_task_create(
99    rtems_build_name( 'L', 'O', 'W', ' ' ),
100    200,
101    RTEMS_MINIMUM_STACK_SIZE,
102    RTEMS_DEFAULT_MODES,
103    RTEMS_DEFAULT_ATTRIBUTES,
104    &task_id
105  );
106  directive_failed( status, "rtems_task_create of LOW" );
107
108  status = rtems_task_start( task_id, Low_task, 0 );
109  directive_failed( status, "rtems_task_start of LOW" );
110
111  status = rtems_task_create(
112    rtems_build_name( 'M', 'I', 'D', ' ' ),
113    128,
114    RTEMS_MINIMUM_STACK_SIZE,
115    RTEMS_DEFAULT_MODES,
116    RTEMS_DEFAULT_ATTRIBUTES,
117    &task_id
118  );
119  directive_failed( status, "rtems_task_create of MIDDLE" );
120
121  status = rtems_task_start( task_id, Middle_task, 0 );
122  directive_failed( status, "rtems_task_start of MIDDLE" );
123
124  status = rtems_task_create(
125    rtems_build_name( 'H', 'I', 'G', 'H' ),
126    5,
127    RTEMS_MINIMUM_STACK_SIZE,
128    RTEMS_DEFAULT_MODES,
129    RTEMS_DEFAULT_ATTRIBUTES,
130    &task_id
131  );
132  directive_failed( status, "rtems_task_create of HIGH" );
133
134  status = rtems_task_start( task_id, High_task, 0 );
135  directive_failed( status, "rtems_task_start of HIGH" );
136
137  status = rtems_semaphore_create(
138    rtems_build_name( 'S', 'E', 'M', '1' ),
139    OPERATION_COUNT,
140    RTEMS_DEFAULT_ATTRIBUTES,
141    RTEMS_NO_PRIORITY,
142    &Semaphore_id
143  );
144  directive_failed( status, "rtems_semaphore_create" );
145
146  for ( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
147    status = rtems_task_create(
148      rtems_build_name( 'N', 'U', 'L', 'L' ),
149      254,
150      RTEMS_MINIMUM_STACK_SIZE,
151      RTEMS_DEFAULT_MODES,
152      RTEMS_DEFAULT_ATTRIBUTES,
153      &task_id
154    );
155    directive_failed( status, "rtems_task_create LOOP" );
156
157    status = rtems_task_start( task_id, null_task, 0 );
158    directive_failed( status, "rtems_task_start LOOP" );
159  }
160
161  status = rtems_task_delete( RTEMS_SELF );
162  directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
163}
164
165rtems_task High_task(
166  rtems_task_argument argument
167)
168{
169  rtems_interrupt_level level;
170
171  Timer_initialize();
172    rtems_interrupt_disable( level );
173  end_time = Read_timer();
174 
175  put_time(
176    "INTERRUPT DISABLE",
177    end_time,
178    1,
179    0,
180    0
181  );
182
183  Timer_initialize();
184    rtems_interrupt_flash( level );
185  end_time = Read_timer();
186 
187  put_time(
188    "INTERRUPT FLASH",
189    end_time,
190    1,
191    0,
192    0
193  );
194 
195  Timer_initialize();
196    rtems_interrupt_enable( level );
197  end_time = Read_timer();
198 
199  put_time(
200    "INTERRUPT ENABLE",
201    end_time,
202    1,
203    0,
204    0
205  );
206 
207  Timer_initialize();
208    _Thread_Disable_dispatch();
209  end_time = Read_timer();
210
211  put_time(
212    "THREAD_DISABLE_DISPATCH",
213    end_time,
214    1,
215    0,
216    0
217  );
218
219  Timer_initialize();
220    _Thread_Enable_dispatch();
221  end_time = Read_timer();
222
223  put_time(
224    "THREAD_ENABLE_DISPATCH",
225    end_time,
226    1,
227    0,
228    0
229  );
230
231  Timer_initialize();
232    _Thread_Set_state( _Thread_Executing, STATES_SUSPENDED );
233  end_time = Read_timer();
234
235  put_time(
236    "THREAD_SET_STATE",
237    end_time,
238    1,
239    0,
240    0
241  );
242
243  _Context_Switch_necessary = TRUE;
244
245  Timer_initialize();
246    _Thread_Dispatch();           /* dispatches Middle_task */
247}
248
249rtems_task Middle_task(
250  rtems_task_argument argument
251)
252{
253  end_time = Read_timer();
254
255  put_time(
256    "THREAD_DISPATCH (NO FP)",
257    end_time,
258    1,
259    0,
260    0
261  );
262
263  _Thread_Set_state( _Thread_Executing, STATES_SUSPENDED );
264
265  Middle_tcb   = _Thread_Executing;
266
267  _Thread_Executing =
268        (Thread_Control *) _Thread_Ready_chain[200].first;
269
270  /* do not force context switch */
271
272  _Context_Switch_necessary = FALSE;
273
274  _Thread_Disable_dispatch();
275
276  Timer_initialize();
277    _Context_Switch( &Middle_tcb->Registers, &_Thread_Executing->Registers );
278
279  Timer_initialize();
280    _Context_Switch(&Middle_tcb->Registers, &Low_tcb->Registers);
281}
282
283rtems_task Low_task(
284  rtems_task_argument argument
285)
286{
287  Thread_Control *executing;
288
289  end_time = Read_timer();
290
291  put_time(
292    "CONTEXT_SWITCH (NO FP)",
293    end_time,
294    1,
295    0,
296    0
297  );
298
299  executing    = _Thread_Executing;
300
301  Low_tcb = executing;
302
303  Timer_initialize();
304    _Context_Switch( &executing->Registers, &executing->Registers );
305
306  end_time = Read_timer();
307
308  put_time(
309    "CONTEXT_SWITCH (SELF)",
310    end_time,
311    1,
312    0,
313    0
314  );
315
316  _Context_Switch(&executing->Registers, &Middle_tcb->Registers);
317
318  end_time = Read_timer();
319
320  put_time(
321    "CONTEXT_SWITCH (Initialised)",
322    end_time,
323    1,
324    0,
325    0
326  );
327
328  _Thread_Executing =
329        (Thread_Control *) _Thread_Ready_chain[201].first;
330
331  /* do not force context switch */
332
333  _Context_Switch_necessary = FALSE;
334
335  _Thread_Disable_dispatch();
336
337  Timer_initialize();
338    _Context_Restore_fp( &_Thread_Executing->fp_context );
339    _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
340}
341
342rtems_task Floating_point_task_1(
343  rtems_task_argument argument
344)
345{
346  Thread_Control *executing;
347  FP_DECLARE;
348
349  end_time = Read_timer();
350
351  put_time(
352    "CONTEXT_SWITCH (restore 1st FP)",
353    end_time,
354    1,
355    0,
356    0
357  );
358
359  executing = _Thread_Executing;
360
361  _Thread_Executing =
362        (Thread_Control *) _Thread_Ready_chain[202].first;
363
364  /* do not force context switch */
365
366  _Context_Switch_necessary = FALSE;
367
368  _Thread_Disable_dispatch();
369
370  Timer_initialize();
371    _Context_Save_fp( &executing->fp_context );
372    _Context_Restore_fp( &_Thread_Executing->fp_context );
373    _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
374  /* switch to Floating_point_task_2 */
375
376  end_time = Read_timer();
377
378  put_time(
379    "CONTEXT_SWITCH (used->init FP)",
380    end_time,
381    1,
382    0,
383    0
384  );
385
386  FP_LOAD( 1.0 );
387
388  executing = _Thread_Executing;
389
390  _Thread_Executing =
391       (Thread_Control *) _Thread_Ready_chain[202].first;
392
393  /* do not force context switch */
394
395  _Context_Switch_necessary = FALSE;
396
397  _Thread_Disable_dispatch();
398
399  Timer_initialize();
400    _Context_Save_fp( &executing->fp_context );
401    _Context_Restore_fp( &_Thread_Executing->fp_context );
402    _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
403  /* switch to Floating_point_task_2 */
404}
405
406rtems_task Floating_point_task_2(
407  rtems_task_argument argument
408)
409{
410  Thread_Control *executing;
411  FP_DECLARE;
412
413  end_time = Read_timer();
414
415  put_time(
416    "CONTEXT_SWITCH (init->init FP)",
417    end_time,
418    1,
419    0,
420    0
421  );
422
423  executing = _Thread_Executing;
424
425  _Thread_Executing =
426       (Thread_Control *) _Thread_Ready_chain[201].first;
427
428  FP_LOAD( 1.0 );
429
430  /* do not force context switch */
431
432  _Context_Switch_necessary = FALSE;
433
434  _Thread_Disable_dispatch();
435
436  Timer_initialize();
437    _Context_Save_fp( &executing->fp_context );
438    _Context_Restore_fp( &_Thread_Executing->fp_context );
439    _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
440  /* switch to Floating_point_task_1 */
441
442  end_time = Read_timer();
443
444  put_time(
445    "CONTEXT_SWITCH (used->used FP)",
446    end_time,
447    1,
448    0,
449    0
450  );
451
452  complete_test();
453}
454
455void complete_test( void )
456{
457  rtems_unsigned32  index;
458  rtems_id          task_id;
459
460  Timer_initialize();
461    _Thread_Resume( Middle_tcb );
462  end_time = Read_timer();
463
464  put_time(
465    "THREAD_RESUME",
466    end_time,
467    1,
468    0,
469    0
470  );
471
472  _Thread_Set_state( Middle_tcb, STATES_WAITING_FOR_MESSAGE );
473
474  Timer_initialize();
475    _Thread_Unblock( Middle_tcb );
476  end_time = Read_timer();
477
478  put_time(
479    "THREAD_UNBLOCK",
480    end_time,
481    1,
482    0,
483    0
484  );
485
486  _Thread_Set_state( Middle_tcb, STATES_WAITING_FOR_MESSAGE );
487
488  Timer_initialize();
489    _Thread_Ready( Middle_tcb );
490  end_time = Read_timer();
491
492  put_time(
493    "THREAD_READY",
494    end_time,
495    1,
496    0,
497    0
498  );
499
500  Timer_initialize();
501    for ( index=1 ; index <= OPERATION_COUNT ; index++ )
502      (void) Empty_function();
503  overhead = Read_timer();
504
505  task_id = Middle_tcb->Object.id;
506
507  Timer_initialize();
508    for ( index=1 ; index <= OPERATION_COUNT ; index++ )
509      (void) _Thread_Get( task_id, &location );
510  end_time = Read_timer();
511
512  put_time(
513    "THREAD_GET",
514    end_time,
515    OPERATION_COUNT,
516    0,
517    0
518  );
519
520  Timer_initialize();
521    for ( index=1 ; index <= OPERATION_COUNT ; index++ )
522      (void) _Semaphore_Get( Semaphore_id, &location );
523  end_time = Read_timer();
524
525  put_time(
526    "SEMAPHORE_GET",
527    end_time,
528    OPERATION_COUNT,
529    0,
530    0
531  );
532
533  Timer_initialize();
534    for ( index=1 ; index <= OPERATION_COUNT ; index++ )
535      (void) _Thread_Get( 0x3, &location );
536  end_time = Read_timer();
537
538  put_time(
539    "THREAD_GET invalid id",
540    end_time,
541    OPERATION_COUNT,
542    0,
543    0
544  );
545
546  puts( "*** END OF TEST 26 ***" );
547  exit( 0 );
548}
549
Note: See TracBrowser for help on using the repository browser.