source: rtems/c/src/ada-tests/tmtests/tm22/tmtest.adb @ 2ef9d4a

4.104.114.84.95
Last change on this file since 2ef9d4a was 2ef9d4a, checked in by Joel Sherrill <joel.sherrill@…>, on 06/03/97 at 22:22:52

Corrected maximum number of messages to be non-zero

  • Property mode set to 100644
File size: 5.9 KB
Line 
1--
2--  TMTEST / BODY
3--
4--  DESCRIPTION:
5--
6--  This package is the implementation of Test 22 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      ID     : RTEMS.ID;
43      STATUS : RTEMS.STATUS_CODES;
44   begin
45
46      TEXT_IO.NEW_LINE( 2 );
47      TEXT_IO.PUT_LINE( "*** TIME TEST 22 ***" );
48
49      RTEMS.MESSAGE_QUEUE_CREATE(
50         RTEMS.BUILD_NAME( 'M', 'Q', '1', ' ' ),
51         100,
52         16,
53         RTEMS.DEFAULT_ATTRIBUTES,
54         TMTEST.MESSAGE_QUEUE_ID,
55         STATUS
56      );
57      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_CREATE" );
58
59      RTEMS.TASK_CREATE(
60         RTEMS.BUILD_NAME( 'L', 'O', 'W', ' ' ),
61         10,
62         2048,
63         RTEMS.NO_PREEMPT,
64         RTEMS.DEFAULT_ATTRIBUTES,
65         ID,
66         STATUS
67      );
68      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE LOW" );
69
70      RTEMS.TASK_START( ID, TMTEST.LOW_TASK'ACCESS, 0, STATUS );
71      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START LOW" );
72
73      RTEMS.TASK_CREATE(
74         RTEMS.BUILD_NAME( 'P', 'R', 'M', 'T' ),
75         11,
76         2048,
77         RTEMS.DEFAULT_MODES,
78         RTEMS.DEFAULT_ATTRIBUTES,
79         ID,
80         STATUS
81      );
82      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE PREEMPT" );
83
84      RTEMS.TASK_START( ID, TMTEST.PREEMPT_TASK'ACCESS, 0, STATUS );
85      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START PREEMPT" );
86
87      RTEMS.TASK_DELETE( RTEMS.SELF, STATUS );
88      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
89
90   end INIT;
91
92--PAGE
93--
94--  HIGH_TASK
95--
96
97   procedure HIGH_TASK (
98      ARGUMENT : in     RTEMS.TASK_ARGUMENT
99   ) is
100      BUFFER         : TMTEST.BUFFER;
101      BUFFER_POINTER : RTEMS.ADDRESS;
102      COUNT          : RTEMS.UNSIGNED32;
103      STATUS         : RTEMS.STATUS_CODES;
104   begin
105
106      BUFFER_POINTER := BUFFER'ADDRESS;
107
108      TIMER_DRIVER.INITIALIZE;
109         RTEMS.MESSAGE_QUEUE_BROADCAST(
110            TMTEST.MESSAGE_QUEUE_ID,
111            BUFFER_POINTER,
112            16,
113            COUNT,
114            STATUS
115         );
116      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
117
118      TIME_TEST_SUPPORT.PUT_TIME(
119         "MESSAGE_QUEUE_BROADCAST (readying)",
120         TMTEST.END_TIME,
121         1,
122         0,
123         RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_BROADCAST
124      );
125
126      RTEMS.TASK_SUSPEND( RTEMS.SELF, STATUS );
127      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SUSPEND" );
128
129   end HIGH_TASK;
130
131--PAGE
132--
133--  LOW_TASK
134--
135
136   procedure LOW_TASK (
137      ARGUMENT : in     RTEMS.TASK_ARGUMENT
138   ) is
139      ID             : RTEMS.ID;
140      BUFFER         : TMTEST.BUFFER;
141      BUFFER_POINTER : RTEMS.ADDRESS;
142      INDEX          : RTEMS.UNSIGNED32;
143      OVERHEAD       : RTEMS.UNSIGNED32;
144      COUNT          : RTEMS.UNSIGNED32;
145      MESSAGE_SIZE   : RTEMS.UNSIGNED32;
146      STATUS         : RTEMS.STATUS_CODES;
147   begin
148
149      BUFFER_POINTER := BUFFER'ADDRESS;
150
151      RTEMS.TASK_CREATE(
152         RTEMS.BUILD_NAME( 'H', 'I', 'G', 'H' ),
153         5,
154         2048,
155         RTEMS.NO_PREEMPT,
156         RTEMS.DEFAULT_ATTRIBUTES,
157         ID,
158         STATUS
159      );
160      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE HIGH" );
161
162      RTEMS.TASK_START( ID, TMTEST.HIGH_TASK'ACCESS, 0, STATUS );
163      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START HIGH" );
164
165      RTEMS.MESSAGE_QUEUE_RECEIVE(
166         TMTEST.MESSAGE_QUEUE_ID,
167         BUFFER_POINTER,
168         RTEMS.DEFAULT_MODES,
169         RTEMS.NO_TIMEOUT,
170         MESSAGE_SIZE,
171         STATUS
172      );
173
174      TIMER_DRIVER.INITIALIZE;
175         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
176         loop
177            TIMER_DRIVER.EMPTY_FUNCTION;
178         end loop;
179      OVERHEAD := TIMER_DRIVER.READ_TIMER;
180
181      TIMER_DRIVER.INITIALIZE;
182         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
183         loop
184            RTEMS.MESSAGE_QUEUE_BROADCAST(
185               TMTEST.MESSAGE_QUEUE_ID,
186               BUFFER_POINTER,
187               16,
188               COUNT,
189               STATUS
190            );
191         end loop;
192      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
193
194      TIME_TEST_SUPPORT.PUT_TIME(
195         "MESSAGE_QUEUE_BROADCAST (no waiting tasks)",
196         TMTEST.END_TIME,
197         TIME_TEST_SUPPORT.OPERATION_COUNT,
198         OVERHEAD,
199         RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_BROADCAST
200      );
201
202      RTEMS.MESSAGE_QUEUE_RECEIVE(
203         TMTEST.MESSAGE_QUEUE_ID,
204         BUFFER_POINTER,
205         RTEMS.DEFAULT_MODES,
206         RTEMS.NO_TIMEOUT,
207         MESSAGE_SIZE,
208         STATUS
209      );
210
211      -- should go to PREEMPT_TASK here
212
213      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
214
215      TIME_TEST_SUPPORT.PUT_TIME(
216         "MESSAGE_QUEUE_BROADCAST (preempt)",
217         TMTEST.END_TIME,
218         1,
219         0,
220         RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_BROADCAST
221      );
222
223      RTEMS.SHUTDOWN_EXECUTIVE( 0 );
224
225   end LOW_TASK;
226
227--PAGE
228--
229--  LOW_TASK
230--
231
232   procedure PREEMPT_TASK (
233      ARGUMENT : in     RTEMS.TASK_ARGUMENT
234   ) is
235      BUFFER         : TMTEST.BUFFER;
236      BUFFER_POINTER : RTEMS.ADDRESS;
237      COUNT          : RTEMS.UNSIGNED32;
238      STATUS         : RTEMS.STATUS_CODES;
239   begin
240
241      BUFFER_POINTER := BUFFER'ADDRESS;
242
243      TIMER_DRIVER.INITIALIZE;
244         RTEMS.MESSAGE_QUEUE_BROADCAST(
245            TMTEST.MESSAGE_QUEUE_ID,
246            BUFFER_POINTER,
247            16,
248            COUNT,
249            STATUS
250         );
251
252      -- should be preempted by LOW_TASK
253
254   end PREEMPT_TASK;
255
256end TMTEST;
Note: See TracBrowser for help on using the repository browser.