source: rtems/c/src/ada-tests/tmtests/tm04/tmtest.adb @ d0d73ec

4.104.114.84.95
Last change on this file since d0d73ec was c7f646b5, checked in by Joel Sherrill <joel.sherrill@…>, on 06/03/97 at 21:43:20

Fixed all references to Semaphore_Create to have the correct
argument sequence.

  • Property mode set to 100644
File size: 12.6 KB
Line 
1--
2--  TMTEST / BODY
3--
4--  DESCRIPTION:
5--
6--  This package is the implementation of Test 4 of the RTEMS
7--  Timing Test Suite.
8--
9--  DEPENDENCIES:
10--
11-- 
12--
13--  COPYRIGHT (c) 1989-1997.
14--  On-Line Applications Research Corporation (OAR).
15--  Copyright assigned to U.S. Government, 1994.
16--
17--  The license and distribution terms for this file may in
18--  the file LICENSE in this distribution or at
19--  http://www.OARcorp.com/rtems/license.html.
20--
21--  $Id$
22--
23
24with INTERFACES; use INTERFACES;
25with RTEMS;
26with RTEMS_CALLING_OVERHEAD;
27with TEST_SUPPORT;
28with TEXT_IO;
29with TIME_TEST_SUPPORT;
30with UNSIGNED32_IO;
31
32package body TMTEST is
33
34--PAGE
35--
36--  INIT
37--
38
39   procedure INIT (
40      ARGUMENT : in     RTEMS.TASK_ARGUMENT
41   ) is
42      STATUS  : RTEMS.STATUS_CODES;
43   begin
44
45      TEXT_IO.NEW_LINE( 2 );
46      TEXT_IO.PUT_LINE( "*** TIME TEST 4 ***" );
47
48      TMTEST.TEST_INIT;
49
50      RTEMS.TASK_DELETE( RTEMS.SELF, STATUS );
51      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
52
53   end INIT;
54
55--PAGE
56--
57--  TEST_INIT
58--
59
60   procedure TEST_INIT
61   is
62      INDEX    : RTEMS.UNSIGNED32;
63      STATUS   : RTEMS.STATUS_CODES;
64   begin
65
66      TMTEST.TASK_COUNT := TIME_TEST_SUPPORT.OPERATION_COUNT;
67
68      for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
69      loop
70
71         RTEMS.TASK_CREATE(
72            RTEMS.BUILD_NAME( 'T', 'I', 'M', 'E' ),
73            10,
74            1024,
75            RTEMS.NO_PREEMPT,
76            RTEMS.DEFAULT_ATTRIBUTES,
77            TMTEST.TASK_ID( INDEX ),
78            STATUS
79         );
80         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE LOOP" );
81
82         RTEMS.TASK_START(
83            TMTEST.TASK_ID( INDEX ),
84            TMTEST.LOW_TASKS'ACCESS,
85            0,
86            STATUS
87         );
88         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START LOOP" );
89
90      end loop;
91
92      RTEMS.SEMAPHORE_CREATE(
93         RTEMS.BUILD_NAME( 'S', 'M', '1', ' ' ),
94         0,
95         RTEMS.DEFAULT_ATTRIBUTES,
96         RTEMS.NO_PRIORITY,
97         TMTEST.SEMAPHORE_ID,
98         STATUS
99      );
100      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_CREATE OF SM1" );
101
102   end TEST_INIT;
103
104--PAGE
105--
106--  HIGHEST_TASK
107--
108
109   procedure HIGHEST_TASK (
110      ARGUMENT : in     RTEMS.TASK_ARGUMENT
111   ) is
112      OLD_PRIORITY : RTEMS.TASK_PRIORITY;
113      STATUS       : RTEMS.STATUS_CODES;
114   begin
115
116      if ARGUMENT = 1 then
117
118         TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
119
120         TIME_TEST_SUPPORT.PUT_TIME(
121            "TASK_RESTART (blocked, preempt)",
122            TMTEST.END_TIME,
123            1,
124            0,
125            RTEMS_CALLING_OVERHEAD.TASK_RESTART
126         );
127 
128         RTEMS.TASK_SET_PRIORITY( RTEMS.SELF, 254, OLD_PRIORITY, STATUS );
129         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" );
130
131      elsif ARGUMENT = 2 then
132
133         TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
134
135         TIME_TEST_SUPPORT.PUT_TIME(
136            "TASK_RESTART (ready, preempt)",
137            TMTEST.END_TIME,
138            1,
139            0,
140            RTEMS_CALLING_OVERHEAD.TASK_RESTART
141         );
142
143         RTEMS.TASK_DELETE( RTEMS.SELF, STATUS );
144         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE" );
145 
146      else
147
148         RTEMS.SEMAPHORE_OBTAIN(
149            TMTEST.SEMAPHORE_ID,
150            RTEMS.DEFAULT_OPTIONS,
151            RTEMS.NO_TIMEOUT,
152            STATUS
153         );
154
155      end if;
156
157   end HIGHEST_TASK;
158
159--PAGE
160--
161--  HIGH_TASK
162--
163
164   procedure HIGH_TASK (
165      ARGUMENT : in     RTEMS.TASK_ARGUMENT
166   ) is
167      OLD_PRIORITY : RTEMS.TASK_PRIORITY;
168      INDEX        : RTEMS.UNSIGNED32;
169      OVERHEAD     : RTEMS.UNSIGNED32;
170      NAME         : RTEMS.NAME;
171      STATUS       : RTEMS.STATUS_CODES;
172   begin
173 
174      TIMER_DRIVER.INITIALIZE;
175         RTEMS.TASK_RESTART( TMTEST.HIGHEST_ID, 1, STATUS );
176      -- preempted by Higher_task
177
178      TIMER_DRIVER.INITIALIZE;
179         RTEMS.TASK_RESTART( TMTEST.HIGHEST_ID, 2, STATUS );
180      -- preempted by Higher_task
181
182      TIMER_DRIVER.INITIALIZE;
183         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
184         loop
185            TIMER_DRIVER.EMPTY_FUNCTION;
186         end loop;
187      OVERHEAD := TIMER_DRIVER.READ_TIMER;
188
189      TIMER_DRIVER.INITIALIZE;
190         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
191         loop
192            RTEMS.SEMAPHORE_RELEASE( TMTEST.SEMAPHORE_ID, STATUS );
193         end loop;
194      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
195
196      TIME_TEST_SUPPORT.PUT_TIME(
197         "SEMAPHORE_RELEASE (readying)",
198         TMTEST.END_TIME,
199         TIME_TEST_SUPPORT.OPERATION_COUNT,
200         OVERHEAD,
201         RTEMS_CALLING_OVERHEAD.SEMAPHORE_RELEASE
202      );
203
204      for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
205      loop
206         RTEMS.TASK_DELETE( TMTEST.TASK_ID( INDEX ), STATUS );
207         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE" );
208      end loop;
209     
210      NAME := RTEMS.BUILD_NAME( 'T', 'I', 'M', 'E' );
211
212      TIMER_DRIVER.INITIALIZE;
213         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
214         loop
215            RTEMS.TASK_CREATE(
216               NAME,
217               10,
218               1024,
219               RTEMS.NO_PREEMPT,
220               RTEMS.DEFAULT_ATTRIBUTES,
221               TMTEST.TASK_ID( INDEX ),
222               STATUS
223            );
224         end loop;
225      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
226
227      TIME_TEST_SUPPORT.PUT_TIME(
228         "TASK_CREATE",
229         TMTEST.END_TIME,
230         TIME_TEST_SUPPORT.OPERATION_COUNT,
231         OVERHEAD,
232         RTEMS_CALLING_OVERHEAD.TASK_CREATE
233      );
234
235      TIMER_DRIVER.INITIALIZE;
236         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
237         loop
238            RTEMS.TASK_START(
239               TMTEST.TASK_ID( INDEX ),
240               TMTEST.LOW_TASKS'ACCESS,
241               0,
242               STATUS
243            );
244         end loop;
245      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
246
247      TIME_TEST_SUPPORT.PUT_TIME(
248         "TASK_START",
249         TMTEST.END_TIME,
250         TIME_TEST_SUPPORT.OPERATION_COUNT,
251         OVERHEAD,
252         RTEMS_CALLING_OVERHEAD.TASK_START
253      );
254
255      for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
256      loop
257         RTEMS.TASK_DELETE( TMTEST.TASK_ID( INDEX ), STATUS );
258         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE LOOP" );
259      end loop;
260     
261      for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
262      loop
263         RTEMS.TASK_CREATE(
264            NAME,
265            250,
266            1024,
267            RTEMS.NO_PREEMPT,
268            RTEMS.DEFAULT_ATTRIBUTES,
269            TMTEST.TASK_ID( INDEX ),
270            STATUS
271         );
272         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE LOOP" );
273         RTEMS.TASK_START(
274            TMTEST.TASK_ID( INDEX ),
275            TMTEST.RESTART_TASK'ACCESS,
276            0,
277            STATUS
278         );
279         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START LOOP" );
280         RTEMS.TASK_SUSPEND( TMTEST.TASK_ID( INDEX ), STATUS );
281         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SUSPEND LOOP" );
282      end loop;
283     
284      TIMER_DRIVER.INITIALIZE;
285         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
286         loop
287            RTEMS.TASK_RESTART( TMTEST.TASK_ID( INDEX ), 0, STATUS );
288         end loop;
289      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
290
291      TIME_TEST_SUPPORT.PUT_TIME(
292         "TASK_RESTART (suspended)",
293         TMTEST.END_TIME,
294         TIME_TEST_SUPPORT.OPERATION_COUNT,
295         OVERHEAD,
296         RTEMS_CALLING_OVERHEAD.TASK_RESTART
297      );
298
299      for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
300      loop
301         RTEMS.TASK_SUSPEND( TMTEST.TASK_ID( INDEX ), STATUS );
302         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SUSPEND LOOP" );
303      end loop;
304
305      TIMER_DRIVER.INITIALIZE;
306         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
307         loop
308            RTEMS.TASK_DELETE( TMTEST.TASK_ID( INDEX ), STATUS );
309         end loop;
310      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
311
312      TIME_TEST_SUPPORT.PUT_TIME(
313         "TASK_DELETE (suspended)",
314         TMTEST.END_TIME,
315         TIME_TEST_SUPPORT.OPERATION_COUNT,
316         OVERHEAD,
317         RTEMS_CALLING_OVERHEAD.TASK_DELETE
318      );
319
320      for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
321      loop
322         RTEMS.TASK_CREATE(
323            NAME,
324            250,
325            1024,
326            RTEMS.DEFAULT_OPTIONS,
327            RTEMS.DEFAULT_ATTRIBUTES,
328            TMTEST.TASK_ID( INDEX ),
329            STATUS
330         );
331         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE LOOP" );
332         RTEMS.TASK_START(
333            TMTEST.TASK_ID( INDEX ),
334            TMTEST.RESTART_TASK'ACCESS,
335            0,
336            STATUS
337         );
338         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START LOOP" );
339      end loop;
340     
341      TIMER_DRIVER.INITIALIZE;
342         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
343         loop
344            RTEMS.TASK_RESTART( TMTEST.TASK_ID( INDEX ), 1, STATUS );
345         end loop;
346      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
347
348      TIME_TEST_SUPPORT.PUT_TIME(
349         "TASK_RESTART (ready)",
350         TMTEST.END_TIME,
351         TIME_TEST_SUPPORT.OPERATION_COUNT,
352         OVERHEAD,
353         RTEMS_CALLING_OVERHEAD.TASK_RESTART
354      );
355
356      for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
357      loop
358         RTEMS.TASK_SET_PRIORITY(
359            TMTEST.TASK_ID( INDEX ),
360            5,
361            OLD_PRIORITY,
362            STATUS
363         );
364         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY LOOP" );
365      end loop;
366
367      -- yield processor -- tasks block
368      RTEMS.TASK_WAKE_AFTER( RTEMS.YIELD_PROCESSOR, STATUS );
369      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
370   
371      TIMER_DRIVER.INITIALIZE;
372         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
373         loop
374            RTEMS.TASK_RESTART( TMTEST.TASK_ID( INDEX ), 1, STATUS );
375         end loop;
376      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
377
378      TIME_TEST_SUPPORT.PUT_TIME(
379         "TASK_RESTART (blocked, no preempt)",
380         TMTEST.END_TIME,
381         TIME_TEST_SUPPORT.OPERATION_COUNT,
382         OVERHEAD,
383         RTEMS_CALLING_OVERHEAD.TASK_RESTART
384      );
385
386      -- yield processor -- tasks block
387      RTEMS.TASK_WAKE_AFTER( RTEMS.YIELD_PROCESSOR, STATUS );
388      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
389   
390      TIMER_DRIVER.INITIALIZE;
391         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
392         loop
393            RTEMS.TASK_DELETE( TMTEST.TASK_ID( INDEX ), STATUS );
394         end loop;
395      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
396
397      TIME_TEST_SUPPORT.PUT_TIME(
398         "TASK_DELETE (blocked)",
399         TMTEST.END_TIME,
400         TIME_TEST_SUPPORT.OPERATION_COUNT,
401         OVERHEAD,
402         RTEMS_CALLING_OVERHEAD.TASK_DELETE
403      );
404
405      RTEMS.SHUTDOWN_EXECUTIVE( 0 );
406
407   end HIGH_TASK;
408
409--PAGE
410--
411--  LOW_TASKS
412--
413
414   procedure LOW_TASKS (
415      ARGUMENT : in     RTEMS.TASK_ARGUMENT
416   ) is
417      ID         : RTEMS.ID;
418      STATUS     : RTEMS.STATUS_CODES;
419   begin
420   
421      TMTEST.TASK_COUNT := TMTEST.TASK_COUNT - 1;
422
423      if TMTEST.TASK_COUNT = 0 then
424
425         RTEMS.TASK_CREATE(
426            RTEMS.BUILD_NAME( 'H', 'I', ' ', ' ' ),
427            5,
428            2048,
429            RTEMS.DEFAULT_OPTIONS,
430            RTEMS.DEFAULT_ATTRIBUTES,
431            ID,
432            STATUS
433         );
434         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE HI" );
435
436         RTEMS.TASK_START(
437            ID,
438            TMTEST.HIGH_TASK'ACCESS,
439            0,
440            STATUS
441         );
442         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START HI" );
443
444
445         RTEMS.TASK_CREATE(
446            RTEMS.BUILD_NAME( 'H', 'I', 'G', 'H' ),
447            3,
448            2048,
449            RTEMS.DEFAULT_OPTIONS,
450            RTEMS.DEFAULT_ATTRIBUTES,
451            TMTEST.HIGHEST_ID,
452            STATUS
453         );
454         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE HIGH" );
455
456         RTEMS.TASK_START(
457            TMTEST.HIGHEST_ID,
458            TMTEST.HIGHEST_TASK'ACCESS,
459            0,
460            STATUS
461         );
462         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START HIGH" );
463
464
465      end if;
466
467      RTEMS.SEMAPHORE_OBTAIN(
468         TMTEST.SEMAPHORE_ID,
469         RTEMS.DEFAULT_OPTIONS,
470         RTEMS.NO_TIMEOUT,
471         STATUS
472      );
473
474   end LOW_TASKS;
475
476--PAGE
477--
478--  RESTART_TASK
479--
480
481   procedure RESTART_TASK (
482      ARGUMENT : in     RTEMS.TASK_ARGUMENT
483   ) is
484      INDEX    : RTEMS.UNSIGNED32;
485      PRIORITY : RTEMS.TASK_PRIORITY;
486      ID       : RTEMS.ID;
487      STATUS   : RTEMS.STATUS_CODES;
488   begin
489   
490      if ARGUMENT = 1 then
491         RTEMS.SEMAPHORE_OBTAIN(
492            TMTEST.SEMAPHORE_ID,
493            RTEMS.DEFAULT_OPTIONS,
494            RTEMS.NO_TIMEOUT,
495            STATUS
496         );
497      end if;
498
499   end RESTART_TASK;
500
501end TMTEST;
Note: See TracBrowser for help on using the repository browser.