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

4.115
Last change on this file since c499856 was c499856, checked in by Chris Johns <chrisj@…>, on 03/20/14 at 21:10:47

Change all references of rtems.com to rtems.org.

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