source: rtems/testsuites/ada/tmtests/tm20/tmtest.adb @ f6c9334d

5
Last change on this file since f6c9334d was f6c9334d, checked in by Sebastian Huber <sebastian.huber@…>, on 12/01/17 at 07:51:17

ada: Add standard test begin/end message

  • Property mode set to 100644
File size: 11.0 KB
Line 
1--
2--  TMTEST / BODY
3--
4--  DESCRIPTION:
5--
6--  This package is the implementation of Test 20 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.PARTITION;
27with RTEMS.REGION;
28
29package body TMTEST is
30
31--
32--  INIT
33--
34
35   procedure INIT (
36      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
37   ) is
38      pragma Unreferenced(ARGUMENT);
39      STATUS     : RTEMS.STATUS_CODES;
40   begin
41
42      TEXT_IO.NEW_LINE( 2 );
43      TEST_SUPPORT.ADA_TEST_BEGIN;
44
45      RTEMS.TASKS.CREATE(
46         RTEMS.BUILD_NAME( 'T', 'I', 'M', '1' ),
47         128,
48         2048,
49         RTEMS.DEFAULT_MODES,
50         RTEMS.DEFAULT_ATTRIBUTES,
51         TMTEST.TASK_ID( 1 ),
52         STATUS
53      );
54      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TASK1" );
55
56      RTEMS.TASKS.START(
57         TMTEST.TASK_ID( 1 ),
58         TMTEST.TASK_1'ACCESS,
59         0,
60         STATUS
61      );
62      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TASK1" );
63
64      RTEMS.TASKS.CREATE(
65         RTEMS.BUILD_NAME( 'T', 'I', 'M', '2' ),
66         129,
67         2048,
68         RTEMS.DEFAULT_MODES,
69         RTEMS.DEFAULT_ATTRIBUTES,
70         TMTEST.TASK_ID( 2 ),
71         STATUS
72      );
73      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TASK2" );
74
75      RTEMS.TASKS.START(
76         TMTEST.TASK_ID( 2 ),
77         TMTEST.TASK_2'ACCESS,
78         0,
79         STATUS
80      );
81      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TASK2" );
82
83      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
84      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
85
86   end INIT;
87
88--
89--  TASK_1
90--
91
92   procedure TASK_1 (
93      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
94   ) is
95      pragma Unreferenced(ARGUMENT);
96      BUFFER_COUNT      : RTEMS.UNSIGNED32;
97      PREVIOUS_MODE     : RTEMS.MODE;
98      PREVIOUS_PRIORITY : RTEMS.TASKS.PRIORITY;
99      STATUS            : RTEMS.STATUS_CODES;
100   begin
101
102      TMTEST.PARTITION_NAME := RTEMS.BUILD_NAME( 'P', 'A', 'R', 'T' );
103
104      TIMER_DRIVER.INITIALIZE;
105
106         RTEMS.PARTITION.CREATE(
107            TMTEST.PARTITION_NAME,
108            TMTEST.PARTITION_AREA'ADDRESS,
109            2048,
110            128,
111            RTEMS.DEFAULT_ATTRIBUTES,
112            TMTEST.PARTITION_ID,
113            STATUS
114         );
115      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
116
117      TIME_TEST_SUPPORT.PUT_TIME(
118         "PARTITION_CREATE",
119         TMTEST.END_TIME,
120         1,
121         0,
122         RTEMS_CALLING_OVERHEAD.PARTITION_CREATE
123      );
124
125      TMTEST.REGION_NAME := RTEMS.BUILD_NAME( 'R', 'E', 'G', 'N' );
126
127      TIMER_DRIVER.INITIALIZE;
128
129         RTEMS.REGION.CREATE(
130            TMTEST.REGION_NAME,
131            TMTEST.REGION_AREA'ADDRESS,
132            2048,
133            16,
134            RTEMS.DEFAULT_ATTRIBUTES,
135            TMTEST.REGION_ID,
136            STATUS
137         );
138      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
139
140      TIME_TEST_SUPPORT.PUT_TIME(
141         "REGION_CREATE",
142         TMTEST.END_TIME,
143         1,
144         0,
145         RTEMS_CALLING_OVERHEAD.REGION_CREATE
146      );
147
148      TIMER_DRIVER.INITIALIZE;
149         RTEMS.PARTITION.GET_BUFFER(
150            TMTEST.PARTITION_ID,
151            TMTEST.BUFFER_ADDRESS_1,
152            STATUS
153         );
154      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
155
156      TIME_TEST_SUPPORT.PUT_TIME(
157         "PARTITION_GET_BUFFER (available)",
158         TMTEST.END_TIME,
159         1,
160         0,
161         RTEMS_CALLING_OVERHEAD.PARTITION_GET_BUFFER
162      );
163
164      BUFFER_COUNT := 0;
165      loop
166
167         RTEMS.PARTITION.GET_BUFFER(
168            TMTEST.PARTITION_ID,
169            TMTEST.BUFFER_ADDRESSES( BUFFER_COUNT ),
170            STATUS
171         );
172
173         exit when RTEMS.ARE_STATUSES_EQUAL( STATUS, RTEMS.UNSATISFIED );
174
175         BUFFER_COUNT := BUFFER_COUNT + 1;
176
177      end loop;
178
179      TIMER_DRIVER.INITIALIZE;
180         RTEMS.PARTITION.GET_BUFFER(
181            TMTEST.PARTITION_ID,
182            TMTEST.BUFFER_ADDRESS_2,
183            STATUS
184         );
185      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
186
187      TIME_TEST_SUPPORT.PUT_TIME(
188         "PARTITION_GET_BUFFER (not available)",
189         TMTEST.END_TIME,
190         1,
191         0,
192         RTEMS_CALLING_OVERHEAD.PARTITION_GET_BUFFER
193      );
194
195      TIMER_DRIVER.INITIALIZE;
196         RTEMS.PARTITION.RETURN_BUFFER(
197            TMTEST.PARTITION_ID,
198            TMTEST.BUFFER_ADDRESS_1,
199            STATUS
200         );
201      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
202
203      TIME_TEST_SUPPORT.PUT_TIME(
204         "PARTITION_RETURN_BUFFER",
205         TMTEST.END_TIME,
206         1,
207         0,
208         RTEMS_CALLING_OVERHEAD.PARTITION_RETURN_BUFFER
209      );
210
211      for INDEX in 0 .. BUFFER_COUNT - 1
212      loop
213
214         RTEMS.PARTITION.RETURN_BUFFER(
215            TMTEST.PARTITION_ID,
216            TMTEST.BUFFER_ADDRESSES( INDEX ),
217            STATUS
218         );
219         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "PARTITION_RETURN_BUFFER" );
220
221      end loop;
222
223      TIMER_DRIVER.INITIALIZE;
224         RTEMS.PARTITION.DELETE( TMTEST.PARTITION_ID, STATUS );
225      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
226
227      TIME_TEST_SUPPORT.PUT_TIME(
228         "PARTITION_DELETE",
229         TMTEST.END_TIME,
230         1,
231         0,
232         RTEMS_CALLING_OVERHEAD.PARTITION_DELETE
233      );
234
235      RTEMS.REGION.GET_SEGMENT(
236         TMTEST.REGION_ID,
237         400,
238         RTEMS.DEFAULT_OPTIONS,
239         RTEMS.NO_TIMEOUT,
240         TMTEST.BUFFER_ADDRESS_2,
241         STATUS
242      );
243      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_GET_SEGMENT" );
244
245      TIMER_DRIVER.INITIALIZE;
246         RTEMS.REGION.GET_SEGMENT(
247            TMTEST.REGION_ID,
248            400,
249            RTEMS.DEFAULT_OPTIONS,
250            RTEMS.NO_TIMEOUT,
251            TMTEST.BUFFER_ADDRESS_3,
252            STATUS
253         );
254      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
255
256      TIME_TEST_SUPPORT.PUT_TIME(
257         "REGION_GET_SEGMENT (available)",
258         TMTEST.END_TIME,
259         1,
260         0,
261         RTEMS_CALLING_OVERHEAD.REGION_GET_SEGMENT
262      );
263
264      TIMER_DRIVER.INITIALIZE;
265         RTEMS.REGION.GET_SEGMENT(
266            TMTEST.REGION_ID,
267            1998,
268            RTEMS.NO_WAIT,
269            RTEMS.NO_TIMEOUT,
270            TMTEST.BUFFER_ADDRESS_4,
271            STATUS
272         );
273      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
274
275      TIME_TEST_SUPPORT.PUT_TIME(
276         "REGION_GET_SEGMENT (NO_WAIT)",
277         TMTEST.END_TIME,
278         1,
279         0,
280         RTEMS_CALLING_OVERHEAD.REGION_GET_SEGMENT
281      );
282
283      RTEMS.REGION.RETURN_SEGMENT(
284         TMTEST.REGION_ID,
285         TMTEST.BUFFER_ADDRESS_3,
286         STATUS
287      );
288      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" );
289
290      TIMER_DRIVER.INITIALIZE;
291         RTEMS.REGION.RETURN_SEGMENT(
292            TMTEST.REGION_ID,
293            TMTEST.BUFFER_ADDRESS_2,
294            STATUS
295         );
296      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
297
298      TIME_TEST_SUPPORT.PUT_TIME(
299         "REGION_RETURN_SEGMENT (no tasks waiting)",
300         TMTEST.END_TIME,
301         1,
302         0,
303         RTEMS_CALLING_OVERHEAD.REGION_RETURN_SEGMENT
304      );
305
306      RTEMS.REGION.GET_SEGMENT(
307         TMTEST.REGION_ID,
308         400,
309         RTEMS.DEFAULT_OPTIONS,
310         RTEMS.NO_TIMEOUT,
311         TMTEST.BUFFER_ADDRESS_1,
312         STATUS
313      );
314      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_GET_SEGMENT" );
315
316      TIMER_DRIVER.INITIALIZE;
317         RTEMS.REGION.GET_SEGMENT(
318            TMTEST.REGION_ID,
319            1998,
320            RTEMS.DEFAULT_OPTIONS,
321            RTEMS.NO_TIMEOUT,
322            TMTEST.BUFFER_ADDRESS_2,
323            STATUS
324         );
325
326      -- execute TASK_2
327
328      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
329
330      TIME_TEST_SUPPORT.PUT_TIME(
331         "REGION_RETURN_SEGMENT (preempt)",
332         TMTEST.END_TIME,
333         1,
334         0,
335         RTEMS_CALLING_OVERHEAD.REGION_RETURN_SEGMENT
336      );
337
338      RTEMS.REGION.RETURN_SEGMENT(
339         TMTEST.REGION_ID,
340         TMTEST.BUFFER_ADDRESS_2,
341         STATUS
342      );
343      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" );
344
345      RTEMS.TASKS.MODE(
346         RTEMS.NO_PREEMPT,
347         RTEMS.PREEMPT_MASK,
348         PREVIOUS_MODE,
349         STATUS
350      );
351      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE" );
352
353      RTEMS.TASKS.SET_PRIORITY( RTEMS.SELF, 254, PREVIOUS_PRIORITY, STATUS );
354      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" );
355
356      RTEMS.REGION.GET_SEGMENT(
357         TMTEST.REGION_ID,
358         400,
359         RTEMS.DEFAULT_OPTIONS,
360         RTEMS.NO_TIMEOUT,
361         TMTEST.BUFFER_ADDRESS_1,
362         STATUS
363      );
364
365      RTEMS.REGION.GET_SEGMENT(
366         TMTEST.REGION_ID,
367         1998,
368         RTEMS.DEFAULT_OPTIONS,
369         RTEMS.NO_TIMEOUT,
370         TMTEST.BUFFER_ADDRESS_2,
371         STATUS
372      );
373      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_GET_SEGMENT" );
374 
375      -- execute TASK_2
376
377      RTEMS.REGION.RETURN_SEGMENT(
378         TMTEST.REGION_ID,
379         TMTEST.BUFFER_ADDRESS_2,
380         STATUS
381      );
382      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" );
383
384      TIMER_DRIVER.INITIALIZE;
385         RTEMS.REGION.DELETE( TMTEST.REGION_ID, STATUS );
386      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
387      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_DELETE" );
388
389      TIME_TEST_SUPPORT.PUT_TIME(
390         "REGION_DELETE",
391         TMTEST.END_TIME,
392         1,
393         0,
394         RTEMS_CALLING_OVERHEAD.REGION_DELETE
395      );
396
397      TEST_SUPPORT.ADA_TEST_END;
398      RTEMS.SHUTDOWN_EXECUTIVE( 0 );
399
400   end TASK_1;
401
402--
403--  TASK_2
404--
405
406   procedure TASK_2 (
407      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
408   ) is
409      pragma Unreferenced(ARGUMENT);
410      STATUS            : RTEMS.STATUS_CODES;
411   begin
412
413      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
414
415      TIME_TEST_SUPPORT.PUT_TIME(
416         "REGION_GET_SEGMENT (blocking)",
417         TMTEST.END_TIME,
418         1,
419         0,
420         RTEMS_CALLING_OVERHEAD.REGION_GET_SEGMENT
421      );
422
423      TIMER_DRIVER.INITIALIZE;
424         RTEMS.REGION.RETURN_SEGMENT(
425            TMTEST.REGION_ID,
426            TMTEST.BUFFER_ADDRESS_1,
427            STATUS
428         );
429
430      -- preempt back to TASK_1
431      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" );
432
433      TIMER_DRIVER.INITIALIZE;
434         RTEMS.REGION.RETURN_SEGMENT(
435            TMTEST.REGION_ID,
436            TMTEST.BUFFER_ADDRESS_1,
437            STATUS
438         );
439      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
440      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" );
441
442      TIME_TEST_SUPPORT.PUT_TIME(
443         "REGION_RETURN_SEGMENT (ready -- return)",
444         TMTEST.END_TIME,
445         1,
446         0,
447         RTEMS_CALLING_OVERHEAD.REGION_RETURN_SEGMENT
448      );
449
450      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
451      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
452
453   end TASK_2;
454
455end TMTEST;
Note: See TracBrowser for help on using the repository browser.