source: rtems/testsuites/ada/tmtests/tm09/tmtest.adb @ bc96f3b4

Last change on this file since bc96f3b4 was bc96f3b4, checked in by Sebastian Huber <sebastian.huber@…>, on Jan 23, 2018 at 8:53:06 AM

ada: Introduce RTEMS.Size type

Some time ago the Classic API object size related parameters were
changed to use size_t. Reflect this in the Ada bindings.

Update #3082.

  • Property mode set to 100644
File size: 8.0 KB
Line 
1--
2--  TMTEST / BODY
3--
4--  DESCRIPTION:
5--
6--  This package is the implementation of Test 9 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 TIME_TEST_SUPPORT;
26with TIMER_DRIVER;
27with RTEMS.MESSAGE_QUEUE;
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      TASK_ID : RTEMS.ID;
40      STATUS  : RTEMS.STATUS_CODES;
41   begin
42
43      TEXT_IO.NEW_LINE( 2 );
44      TEST_SUPPORT.ADA_TEST_BEGIN;
45
46      RTEMS.TASKS.CREATE( 
47         1,
48         128, 
49         4096, 
50         RTEMS.DEFAULT_OPTIONS,
51         RTEMS.DEFAULT_ATTRIBUTES,
52         TASK_ID,
53         STATUS
54      );
55      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
56
57      RTEMS.TASKS.START( TASK_ID, TMTEST.TEST_TASK'ACCESS, 0, STATUS );
58      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
59
60      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
61      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
62
63   end INIT;
64
65--
66--  TEST_TASK
67--
68
69   procedure TEST_TASK (
70      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
71   ) is
72      pragma Unreferenced(ARGUMENT);
73      STATUS       : RTEMS.STATUS_CODES;
74   begin
75
76      TIMER_DRIVER.INITIALIZE;
77         RTEMS.MESSAGE_QUEUE.CREATE(
78            1,
79            TIME_TEST_SUPPORT.OPERATION_COUNT,
80            16,
81            RTEMS.DEFAULT_OPTIONS,
82            TMTEST.QUEUE_ID,
83            STATUS
84         );
85      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
86      TIME_TEST_SUPPORT.PUT_TIME( 
87         "MESSAGE_QUEUE_CREATE",
88         TMTEST.END_TIME, 
89         1, 
90         0,
91         RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_CREATE
92      );
93
94      TMTEST.QUEUE_TEST;
95
96      TIMER_DRIVER.INITIALIZE;
97         RTEMS.MESSAGE_QUEUE.DELETE(
98            TMTEST.QUEUE_ID,
99            STATUS
100         );
101      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
102      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_DELETE" );
103      TIME_TEST_SUPPORT.PUT_TIME( 
104         "MESSAGE_QUEUE_DELETE",
105         TMTEST.END_TIME, 
106         1, 
107         0,
108         RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_DELETE
109      );
110
111      TEST_SUPPORT.ADA_TEST_END;
112      RTEMS.SHUTDOWN_EXECUTIVE( 0 );
113
114   end TEST_TASK;
115
116--
117--  QUEUE_TEST
118--
119
120   procedure QUEUE_TEST
121   is
122      SEND_LOOP_TIME    : RTEMS.UNSIGNED32;
123      URGENT_LOOP_TIME  : RTEMS.UNSIGNED32;
124      RECEIVE_LOOP_TIME : RTEMS.UNSIGNED32;
125      SEND_TIME         : RTEMS.UNSIGNED32;
126      URGENT_TIME       : RTEMS.UNSIGNED32;
127      RECEIVE_TIME      : RTEMS.UNSIGNED32;
128      EMPTY_FLUSH_TIME  : RTEMS.UNSIGNED32;
129      FLUSH_TIME        : RTEMS.UNSIGNED32;
130      FLUSH_COUNT       : RTEMS.UNSIGNED32;
131      EMPTY_FLUSH_COUNT : RTEMS.UNSIGNED32;
132      BUFFER            : TMTEST.BUFFER;
133      BUFFER_POINTER    : RTEMS.ADDRESS;
134      MESSAGE_SIZE      : RTEMS.Size := 0;
135      STATUS            : RTEMS.STATUS_CODES;
136   begin
137
138      SEND_LOOP_TIME    := 0;
139      URGENT_LOOP_TIME  := 0;
140      RECEIVE_LOOP_TIME := 0;
141      SEND_TIME         := 0;
142      URGENT_TIME       := 0;
143      RECEIVE_TIME      := 0;
144      EMPTY_FLUSH_TIME  := 0;
145      FLUSH_TIME        := 0;
146      FLUSH_COUNT       := 0;
147      EMPTY_FLUSH_COUNT := 0;
148
149      BUFFER_POINTER := BUFFER'ADDRESS;
150
151      for ITERATIONS in 1 .. TIME_TEST_SUPPORT.ITERATION_COUNT
152      loop
153
154         TIMER_DRIVER.INITIALIZE;
155            for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
156            loop
157               TIMER_DRIVER.EMPTY_FUNCTION;
158            end loop;
159         SEND_LOOP_TIME := SEND_LOOP_TIME + TIMER_DRIVER.READ_TIMER;
160
161         TIMER_DRIVER.INITIALIZE;
162            for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
163            loop
164               TIMER_DRIVER.EMPTY_FUNCTION;
165            end loop;
166         URGENT_LOOP_TIME := URGENT_LOOP_TIME + TIMER_DRIVER.READ_TIMER;
167
168         TIMER_DRIVER.INITIALIZE;
169            for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
170            loop
171               TIMER_DRIVER.EMPTY_FUNCTION;
172            end loop;
173         RECEIVE_LOOP_TIME := RECEIVE_LOOP_TIME + TIMER_DRIVER.READ_TIMER;
174
175         TIMER_DRIVER.INITIALIZE;
176            for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
177            loop
178               RTEMS.MESSAGE_QUEUE.SEND( 
179                  TMTEST.QUEUE_ID,
180                  BUFFER_POINTER,
181                  16,
182                  STATUS
183               );
184            end loop;
185         SEND_TIME := SEND_TIME + TIMER_DRIVER.READ_TIMER;
186
187         TIMER_DRIVER.INITIALIZE;
188            for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
189            loop
190               RTEMS.MESSAGE_QUEUE.RECEIVE( 
191                  TMTEST.QUEUE_ID,
192                  BUFFER_POINTER,
193                  RTEMS.DEFAULT_OPTIONS,
194                  RTEMS.NO_TIMEOUT,
195                  MESSAGE_SIZE,
196                  STATUS
197               );
198            end loop;
199         RECEIVE_TIME := RECEIVE_TIME + TIMER_DRIVER.READ_TIMER;
200
201         TIMER_DRIVER.INITIALIZE;
202            for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
203            loop
204               RTEMS.MESSAGE_QUEUE.URGENT( 
205                  TMTEST.QUEUE_ID,
206                  BUFFER_POINTER,
207                  16,
208                  STATUS
209               );
210            end loop;
211         URGENT_TIME := URGENT_TIME + TIMER_DRIVER.READ_TIMER;
212
213         TIMER_DRIVER.INITIALIZE;
214            for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
215            loop
216               RTEMS.MESSAGE_QUEUE.RECEIVE( 
217                  TMTEST.QUEUE_ID,
218                  BUFFER_POINTER,
219                  RTEMS.DEFAULT_OPTIONS,
220                  RTEMS.NO_TIMEOUT,
221                  MESSAGE_SIZE,
222                  STATUS
223               );
224            end loop;
225         RECEIVE_TIME := RECEIVE_TIME + TIMER_DRIVER.READ_TIMER;
226
227         TIMER_DRIVER.INITIALIZE;
228            RTEMS.MESSAGE_QUEUE.FLUSH( 
229               TMTEST.QUEUE_ID,
230               EMPTY_FLUSH_COUNT,
231               STATUS
232            );
233         EMPTY_FLUSH_TIME := EMPTY_FLUSH_TIME + TIMER_DRIVER.READ_TIMER;
234
235         -- send one message to flush
236         RTEMS.MESSAGE_QUEUE.SEND( 
237            TMTEST.QUEUE_ID, 
238            BUFFER_POINTER, 
239            16,
240            STATUS
241         );
242         TIMER_DRIVER.INITIALIZE;
243            RTEMS.MESSAGE_QUEUE.FLUSH( 
244               TMTEST.QUEUE_ID,
245               FLUSH_COUNT,
246               STATUS
247            );
248         FLUSH_TIME := FLUSH_TIME + TIMER_DRIVER.READ_TIMER;
249
250      end loop;
251
252      TIME_TEST_SUPPORT.PUT_TIME( 
253         "MESSAGE_QUEUE_SEND (no tasks waiting)",
254         SEND_TIME, 
255         TIME_TEST_SUPPORT.OPERATION_COUNT *
256            TIME_TEST_SUPPORT.ITERATION_COUNT,
257         SEND_LOOP_TIME,
258         RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_SEND
259      );
260
261      TIME_TEST_SUPPORT.PUT_TIME(
262         "MESSAGE_QUEUE_URGENT (no tasks waiting)",
263         URGENT_TIME, 
264         TIME_TEST_SUPPORT.OPERATION_COUNT *
265            TIME_TEST_SUPPORT.ITERATION_COUNT,
266         URGENT_LOOP_TIME,
267         RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_URGENT
268      );
269
270      TIME_TEST_SUPPORT.PUT_TIME(
271         "MESSAGE_QUEUE_RECEIVE (messages available)",
272         RECEIVE_TIME, 
273         TIME_TEST_SUPPORT.OPERATION_COUNT *
274            TIME_TEST_SUPPORT.ITERATION_COUNT * 2,
275         RECEIVE_LOOP_TIME * 2,
276         RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_RECEIVE
277      );
278
279      TIME_TEST_SUPPORT.PUT_TIME(
280         "MESSAGE_QUEUE_FLUSH (empty queue)",
281         EMPTY_FLUSH_TIME, 
282         TIME_TEST_SUPPORT.ITERATION_COUNT,
283         0,
284         RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_FLUSH
285      );
286
287      TIME_TEST_SUPPORT.PUT_TIME(
288         "MESSAGE_QUEUE_FLUSH (messages flushed)",
289         FLUSH_TIME, 
290         TIME_TEST_SUPPORT.ITERATION_COUNT,
291         0,
292         RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_FLUSH
293      );
294
295   end QUEUE_TEST;
296
297end TMTEST;
Note: See TracBrowser for help on using the repository browser.