source: rtems/testsuites/tmtests/tm26/task1.c @ 17508d02

4.104.114.84.95
Last change on this file since 17508d02 was 08311cc3, checked in by Joel Sherrill <joel.sherrill@…>, on 11/17/99 at 17:51:34

Updated copyright notice.

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