source: rtems/testsuites/ada/tmtests/tm13/tmtest.adb

Last change on this file was 37426ca, checked in by Joel Sherrill <joel@…>, on 04/06/22 at 21:33:54

testsuites/ada/tmtests/tm1*: Change license to BSD-2

Updates #3053.

  • Property mode set to 100644
File size: 6.1 KB
Line 
1-- SPDX-License-Identifier: BSD-2-Clause
2
3--
4--  TMTEST / BODY
5--
6--  DESCRIPTION:
7--
8--  This package is the implementation of Test 13 of the RTEMS
9--  Timing Test Suite.
10--
11--  DEPENDENCIES:
12--
13-- 
14--
15--  COPYRIGHT (c) 1989-2011.
16--  On-Line Applications Research Corporation (OAR).
17--
18--  Redistribution and use in source and binary forms, with or without
19--  modification, are permitted provided that the following conditions
20--  are met:
21--  1. Redistributions of source code must retain the above copyright
22--     notice, this list of conditions and the following disclaimer.
23--  2. Redistributions in binary form must reproduce the above copyright
24--     notice, this list of conditions and the following disclaimer in the
25--     documentation and/or other materials provided with the distribution.
26--
27--  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28--  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29--  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30--  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31--  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32--  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33--  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34--  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35--  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36--  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37--  POSSIBILITY OF SUCH DAMAGE.
38--
39
40with INTERFACES; use INTERFACES;
41with RTEMS_CALLING_OVERHEAD;
42with TEST_SUPPORT;
43with TEXT_IO;
44with TIME_TEST_SUPPORT;
45with TIMER_DRIVER;
46with RTEMS.MESSAGE_QUEUE;
47
48package body TMTEST is
49
50--
51--  INIT
52--
53
54   procedure INIT (
55      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
56   ) is
57      pragma Unreferenced(ARGUMENT);
58      TASK_ID : RTEMS.ID;
59      STATUS  : RTEMS.STATUS_CODES;
60   begin
61
62      TEXT_IO.NEW_LINE( 2 );
63      TEST_SUPPORT.ADA_TEST_BEGIN;
64
65      RTEMS.TASKS.CREATE(
66         1,
67         251,
68         1024,
69         RTEMS.DEFAULT_MODES,
70         RTEMS.DEFAULT_ATTRIBUTES,
71         TASK_ID,
72         STATUS
73      );
74      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
75
76      RTEMS.TASKS.START(
77         TASK_ID,
78         TMTEST.TEST_INIT'ACCESS,
79         0,
80         STATUS
81      );
82      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
83
84      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
85      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
86
87   end INIT;
88
89--
90--  TEST_INIT
91--
92
93   procedure TEST_INIT (
94      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
95   ) is
96      pragma Unreferenced(ARGUMENT);
97      TASK_ENTRY     : RTEMS.TASKS.ENTRY_POINT;
98      PRIORITY       : RTEMS.TASKS.PRIORITY;
99      TASK_ID        : RTEMS.ID;
100      BUFFER         : TMTEST.BUFFER;
101      BUFFER_POINTER : RTEMS.ADDRESS;
102      STATUS         : RTEMS.STATUS_CODES;
103   begin
104
105      BUFFER_POINTER := BUFFER'ADDRESS;
106
107-- As each task is started, it preempts this task and performs a blocking
108-- MESSAGE_QUEUE_RECEIVE.  Upon completion of this loop all created tasks
109-- are blocked.
110
111      RTEMS.MESSAGE_QUEUE.CREATE(
112         RTEMS.BUILD_NAME( 'M', 'Q', '1', ' ' ),
113         TIME_TEST_SUPPORT.OPERATION_COUNT,
114         16,
115         RTEMS.DEFAULT_OPTIONS,
116         TMTEST.QUEUE_ID,
117         STATUS
118      );
119
120      PRIORITY := 250;
121
122      for INDEX in 0 .. TIME_TEST_SUPPORT.OPERATION_COUNT - 1
123      loop
124
125         RTEMS.TASKS.CREATE(
126            RTEMS.BUILD_NAME( 'T', 'I', 'M', 'E' ),
127            PRIORITY,
128            1024,
129            RTEMS.DEFAULT_MODES,
130            RTEMS.DEFAULT_ATTRIBUTES,
131            TASK_ID,
132            STATUS
133         );
134         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE LOOP" );
135
136         PRIORITY := PRIORITY - 1;
137
138         if INDEX = TIME_TEST_SUPPORT.OPERATION_COUNT - 1 then
139            TASK_ENTRY := TMTEST.HIGH_TASK'ACCESS;
140         else
141            TASK_ENTRY := TMTEST.MIDDLE_TASKS'ACCESS;
142         end if;
143
144         RTEMS.TASKS.START( TASK_ID, TASK_ENTRY, 0, STATUS );
145         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START LOOP" );
146
147      end loop;
148
149      TIMER_DRIVER.INITIALIZE;
150      RTEMS.MESSAGE_QUEUE.URGENT(
151         TMTEST.QUEUE_ID,
152         BUFFER_POINTER,
153         16,
154         STATUS
155      );
156      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
157
158   end TEST_INIT;
159
160--
161--  HIGH_TASK
162--
163
164   procedure HIGH_TASK (
165      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
166   ) is
167      pragma Unreferenced(ARGUMENT);
168      BUFFER         : TMTEST.BUFFER;
169      BUFFER_POINTER : RTEMS.ADDRESS;
170      MESSAGE_SIZE   : RTEMS.Size := 0;
171      STATUS         : RTEMS.STATUS_CODES;
172   begin
173
174      BUFFER_POINTER := BUFFER'ADDRESS;
175
176      RTEMS.MESSAGE_QUEUE.RECEIVE(
177         TMTEST.QUEUE_ID,
178         BUFFER_POINTER,
179         RTEMS.DEFAULT_OPTIONS,
180         RTEMS.NO_TIMEOUT,
181         MESSAGE_SIZE,
182         STATUS
183      );
184
185      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
186      TIME_TEST_SUPPORT.PUT_TIME(
187         "MESSAGE_QUEUE_URGENT (preemptive)",
188         TMTEST.END_TIME,
189         TIME_TEST_SUPPORT.OPERATION_COUNT,
190         0,
191         RTEMS_CALLING_OVERHEAD.MESSAGE_QUEUE_URGENT
192      );
193
194      TEST_SUPPORT.ADA_TEST_END;
195      RTEMS.SHUTDOWN_EXECUTIVE( 0 );
196
197   end HIGH_TASK;
198
199--
200--  MIDDLE_TASKS
201--
202
203   procedure MIDDLE_TASKS (
204      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
205   ) is
206      pragma Unreferenced(ARGUMENT);
207      BUFFER         : TMTEST.BUFFER;
208      BUFFER_POINTER : RTEMS.ADDRESS;
209      MESSAGE_SIZE   : RTEMS.Size := 0;
210      STATUS         : RTEMS.STATUS_CODES;
211   begin
212 
213      BUFFER_POINTER := BUFFER'ADDRESS;
214
215      RTEMS.MESSAGE_QUEUE.RECEIVE(
216         TMTEST.QUEUE_ID,
217         BUFFER_POINTER,
218         RTEMS.DEFAULT_OPTIONS,
219         RTEMS.NO_TIMEOUT,
220         MESSAGE_SIZE,
221         STATUS
222      );
223      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_RECEIVE" );
224 
225      RTEMS.MESSAGE_QUEUE.URGENT(
226         TMTEST.QUEUE_ID,
227         BUFFER_POINTER,
228         16,
229         STATUS
230      );
231      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "MESSAGE_QUEUE_URGENT" );
232
233   end MIDDLE_TASKS;
234
235end TMTEST;
Note: See TracBrowser for help on using the repository browser.