source: rtems/c/src/ada-tests/sptests/sp20/sptest.adb @ e65c45c

5
Last change on this file since e65c45c was e65c45c, checked in by Joel Sherrill <joel@…>, on 03/22/16 at 22:13:30

Obsolete rtems_clock_get() directive.

This service was marked as deprecated long prior to the 4.11 release
series and is now being removed.

closes #2676.

  • Property mode set to 100644
File size: 8.5 KB
Line 
1--
2--  SPTEST / BODY
3--
4--  DESCRIPTION:
5--
6--  This package is the implementation of Test 20 of the RTEMS
7--  Single Processor 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 TEST_SUPPORT;
23with TEXT_IO;
24with UNSIGNED32_IO;
25with RTEMS.CLOCK;
26with RTEMS.RATE_MONOTONIC;
27
28package body SPTEST 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( "*** TEST 20 ***" );
43
44      SPTEST.TASK_NAME( 1 ) := RTEMS.BUILD_NAME(  'T', 'A', '1', ' ' );
45      SPTEST.TASK_NAME( 2 ) := RTEMS.BUILD_NAME(  'T', 'A', '2', ' ' );
46      SPTEST.TASK_NAME( 3 ) := RTEMS.BUILD_NAME(  'T', 'A', '3', ' ' );
47      SPTEST.TASK_NAME( 4 ) := RTEMS.BUILD_NAME(  'T', 'A', '4', ' ' );
48      SPTEST.TASK_NAME( 5 ) := RTEMS.BUILD_NAME(  'T', 'A', '5', ' ' );
49      SPTEST.TASK_NAME( 6 ) := RTEMS.BUILD_NAME(  'T', 'A', '6', ' ' );
50
51      for INDEX in 1 .. 6
52      loop
53
54         SPTEST.COUNT( INDEX ) := 0;
55
56         RTEMS.TASKS.CREATE(
57            SPTEST.TASK_NAME( INDEX ),
58            SPTEST.PRIORITIES( INDEX ),
59            4096,
60            RTEMS.DEFAULT_MODES,
61            RTEMS.DEFAULT_ATTRIBUTES,
62            SPTEST.TASK_ID( INDEX ),
63            STATUS
64         );
65         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE LOOP" );
66
67      end loop;
68
69      for INDEX in 1 .. 6
70      loop
71
72         RTEMS.TASKS.START(
73            SPTEST.TASK_ID( INDEX ),
74            SPTEST.TASK_1_THROUGH_6'ACCESS,
75            RTEMS.TASKS.ARGUMENT( INDEX ),
76            STATUS
77         );
78         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START LOOP" );
79 
80      end loop;
81
82      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
83      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
84
85   end INIT;
86
87--
88--  TASK_1_THROUGH_6
89--
90
91   procedure TASK_1_THROUGH_6 (
92      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
93   ) is
94      RMID      : RTEMS.ID;
95      TEST_RMID : RTEMS.ID;
96      PASS      : RTEMS.UNSIGNED32;
97      FAILED    : RTEMS.UNSIGNED32;
98      STATUS    : RTEMS.STATUS_CODES;
99      TIME      : array( 0 .. 10 ) of RTEMS.INTERVAL;
100      PERIOD    : RTEMS.INTERVAL;
101      MEASURE   : RTEMS.INTERVAL;
102   begin
103
104      RTEMS.RATE_MONOTONIC.CREATE( ARGUMENT, RMID, STATUS );
105      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "RATE_MONOTONIC_CREATE" );
106      TEST_SUPPORT.PUT_NAME( SPTEST.TASK_NAME( INTEGER( ARGUMENT ) ), FALSE );
107      TEXT_IO.PUT( "- rate_monotonic_create id = " );
108      UNSIGNED32_IO.PUT( RMID, WIDTH => 8, BASE => 16 );
109      TEXT_IO.NEW_LINE;
110 
111      RTEMS.RATE_MONOTONIC.IDENT( ARGUMENT, TEST_RMID, STATUS );
112      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "RATE_MONOTONIC_IDENT" );
113      TEST_SUPPORT.PUT_NAME( SPTEST.TASK_NAME( INTEGER( ARGUMENT ) ), FALSE );
114      TEXT_IO.PUT( "- rate_monotonic_ident id = " );
115      UNSIGNED32_IO.PUT( RMID, WIDTH => 8, BASE => 16 );
116      TEXT_IO.NEW_LINE;
117      if TEST_RMID /= RMID then
118         TEXT_IO.PUT_LINE( "RMID's DO NOT MATCH!!!" );
119         RTEMS.SHUTDOWN_EXECUTIVE( 0 );
120      end if;
121
122      TEST_SUPPORT.PUT_NAME( SPTEST.TASK_NAME( INTEGER( ARGUMENT ) ), FALSE );
123      TEXT_IO.PUT( " - (" );
124      UNSIGNED32_IO.PUT( RMID, WIDTH => 1, BASE => 16 );
125      TEXT_IO.PUT( ") period " );
126      UNSIGNED32_IO.PUT(
127         SPTEST.PERIODS( INTEGER( ARGUMENT ) ),
128         WIDTH => 1,
129         BASE => 10
130      );
131      TEXT_IO.NEW_LINE;
132       
133      RTEMS.TASKS.WAKE_AFTER( 2, STATUS );
134      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
135   
136      case ARGUMENT is
137         when 1 .. 4 =>
138            loop
139               RTEMS.RATE_MONOTONIC.PERIOD(
140                  RMID,
141                  SPTEST.PERIODS( INTEGER( ARGUMENT ) ),
142                  STATUS
143               );
144
145               TEST_SUPPORT.DIRECTIVE_FAILED(
146                  STATUS,
147                  "RATE_MONOTONIC_PERIOD"
148               );
149
150               SPTEST.COUNT( INTEGER( ARGUMENT ) ) :=
151                  SPTEST.COUNT( INTEGER( ARGUMENT ) ) + 1;
152
153            end loop;
154
155         when 5 =>
156
157            PASS   := 0;
158            FAILED := 0;
159
160            RTEMS.RATE_MONOTONIC.PERIOD(
161               RMID,
162               SPTEST.PERIODS( INTEGER( ARGUMENT ) ),
163               STATUS
164            );
165
166            TEST_SUPPORT.DIRECTIVE_FAILED(
167               STATUS,
168               "RATE_MONOTONIC_PERIOD 1 OF TA5"
169            );
170
171            SPTEST.GET_ALL_COUNTERS;
172
173            loop
174
175               RTEMS.RATE_MONOTONIC.PERIOD(
176                  RMID,
177                  SPTEST.PERIODS( INTEGER( ARGUMENT ) ),
178                  STATUS
179               );
180
181               TEST_SUPPORT.DIRECTIVE_FAILED(
182                  STATUS,
183                  "RATE_MONOTONIC_PERIOD 2 OF TA5"
184               );
185
186               SPTEST.GET_ALL_COUNTERS;
187
188               for INDEX in 1 .. 4 loop
189
190                  if SPTEST.TEMPORARY_COUNT( INDEX ) /=
191                        SPTEST.ITERATIONS( INDEX ) then
192
193                     TEXT_IO.PUT( "FAIL -- " );
194                     TEST_SUPPORT.PUT_NAME(
195                        SPTEST.TASK_NAME( INDEX ),
196                        FALSE
197                     );
198                     TEXT_IO.PUT( "ACTUAL=" );
199                     UNSIGNED32_IO.PUT(
200                        SPTEST.TEMPORARY_COUNT( INDEX ),
201                        WIDTH => 3,
202                        BASE => 10
203                     );
204                     TEXT_IO.PUT( " EXPECTED=" );
205                     UNSIGNED32_IO.PUT(
206                        SPTEST.ITERATIONS( INDEX ),
207                        WIDTH => 3,
208                        BASE => 10
209                     );
210                     TEXT_IO.NEW_LINE;
211
212                     FAILED := FAILED + 1;
213
214                  end if;
215
216               end loop;
217
218               if FAILED = 5 then
219                  RTEMS.SHUTDOWN_EXECUTIVE( 0 );
220               end if;
221
222               PASS := PASS + 1;
223               TEXT_IO.PUT( "TA5 - PERIODS CHECK OK (" );
224               UNSIGNED32_IO.PUT( PASS, WIDTH => 1, BASE => 10 );
225               TEXT_IO.PUT_LINE( ")" );
226 
227               if PASS = 10 then
228                  TEXT_IO.PUT_LINE( "*** END OF TEST 20 ***" );
229                  RTEMS.SHUTDOWN_EXECUTIVE( 0 );
230               end if;
231
232            end loop;
233 
234         when 6 =>
235            -- test changing periods
236            for INDEX in 0 .. 10 loop
237               PERIOD := RTEMS.INTERVAL( ( INDEX + 1 ) * 10 );
238               RTEMS.RATE_MONOTONIC.PERIOD( RMID, PERIOD, STATUS);
239               TEST_SUPPORT.DIRECTIVE_FAILED(
240                  STATUS, "rate_monotonic_period of TA6"
241               );
242
243               -- timestamp
244               RTEMS.CLOCK.GET_TICKS_SINCE_BOOT( Time( INDEX ), STATUS );
245               TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "clock_get of TA6" );
246            end loop;
247
248            for INDEX in 1 .. 10 loop
249               MEASURE := TIME( INDEX ) - TIME( INDEX - 1 );
250               PERIOD := RTEMS.INTERVAL( INDEX * 10 );
251               TEXT_IO.PUT( "TA6 - Actual: " );
252               UNSIGNED32_IO.PUT( MEASURE, WIDTH => 3, BASE => 10 );
253               TEXT_IO.PUT( "  Expected: " );
254               UNSIGNED32_IO.PUT( PERIOD, WIDTH => 3, BASE => 10 );
255               if PERIOD = MEASURE then
256                  TEXT_IO.PUT_LINE( " - OK" );
257               else
258                  TEXT_IO.PUT_LINE( " - FAILED" );
259               end if;
260            end loop;
261
262            RTEMS.TASKS.SUSPEND( RTEMS.SELF, STATUS );
263            TEST_SUPPORT.DIRECTIVE_FAILED(
264               STATUS, "task_suspend of TA6"
265            );
266
267         when others =>
268            NULL;
269           
270      end case;
271
272   end TASK_1_THROUGH_6;
273
274--
275--  GET_ALL_COUNTERS
276--
277
278   procedure GET_ALL_COUNTERS
279   is
280      PREVIOUS_MODE : RTEMS.MODE;
281      STATUS        : RTEMS.STATUS_CODES;
282   begin
283
284      RTEMS.TASKS.MODE(
285         RTEMS.NO_PREEMPT,
286         RTEMS.PREEMPT_MASK,
287         PREVIOUS_MODE,
288         STATUS
289      );
290      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE TO NO_PREEMPT" );
291
292      SPTEST.TEMPORARY_COUNT := SPTEST.COUNT;
293
294      for INDEX in 1 .. 5
295      loop
296
297         SPTEST.COUNT( INDEX ) := 0;
298
299      end loop;
300     
301      RTEMS.TASKS.MODE(
302         RTEMS.PREEMPT,
303         RTEMS.PREEMPT_MASK,
304         PREVIOUS_MODE,
305         STATUS
306      );
307      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE TO PREEMPT" );
308
309   end GET_ALL_COUNTERS;
310
311end SPTEST;
Note: See TracBrowser for help on using the repository browser.