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

4.104.114.95
Last change on this file since 3d2bf71 was 3d2bf71, checked in by Glenn Humphrey <glenn.humphrey@…>, on 10/18/07 at 19:36:29

2007-10-18 Glenn Humphrey <glenn.humphrey@…>

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