source: rtems/c/src/ada-tests/tmtests/tm08/tmtest.adb @ d5154d0f

5
Last change on this file since d5154d0f was d5154d0f, checked in by Aun-Ali Zaidi <admin@…>, on 12/23/15 at 20:44:02

api: Remove deprecated Notepads

Notepads where a feature of RTEMS' tasks that simply functioned in
the same way as POSIX keys or threaded local storage (TLS). They were
introduced well before per task variables, which are also deprecated,
and were barely used in favor of their POSIX alternatives.

In addition to their scarce usage, Notepads took up unnecessary memory.
For each task:

  • 16 32-bit integers were allocated.
  • A total of 64 bytes per task per thread.

This is especially critical in low memory and safety-critical applications.

They are also defined as uint32_t, and therefore are not guaranteed to
hold a pointer.

Lastly, they are not portable solutions for SMP and uniprocessor systems,
like POSIX keys and TLS.

updates #2493.

  • Property mode set to 100644
File size: 7.3 KB
Line 
1--
2--  TMTEST / BODY
3--
4--  DESCRIPTION:
5--
6--  This package is the implementation of Test 8 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.CLOCK;
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      STATUS  : RTEMS.STATUS_CODES;
40   begin
41
42      TEXT_IO.NEW_LINE( 2 );
43      TEXT_IO.PUT_LINE( "*** TIME TEST 8 ***" );
44
45      TMTEST.TEST_INIT;
46
47      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
48      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
49
50   end INIT;
51
52--
53--  TEST_INIT
54--
55
56   procedure TEST_INIT
57   is
58      STATUS     : RTEMS.STATUS_CODES;
59   begin
60
61      RTEMS.TASKS.CREATE(
62         1,
63         128,
64         1024,
65         RTEMS.DEFAULT_OPTIONS,
66         RTEMS.DEFAULT_ATTRIBUTES,
67         TASK_ID,
68         STATUS
69      );
70      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
71
72      RTEMS.TASKS.START( TASK_ID, TMTEST.TEST_TASK'ACCESS, 0, STATUS );
73      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
74
75      RTEMS.TASKS.CREATE(
76         1,
77         254,
78         1024,
79         RTEMS.DEFAULT_OPTIONS,
80         RTEMS.DEFAULT_ATTRIBUTES,
81         TASK_ID,
82         STATUS
83      );
84      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
85
86      RTEMS.TASKS.START( TASK_ID, TMTEST.TEST_TASK1'ACCESS, 0, STATUS );
87      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
88
89   end TEST_INIT;
90
91--
92--  TEST_TASK
93--
94
95   procedure TEST_TASK (
96      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
97   ) is
98      pragma Unreferenced(ARGUMENT);
99      OVERHEAD     : RTEMS.UNSIGNED32;
100      OLD_PRIORITY : RTEMS.TASKS.PRIORITY;
101      OLD_MODE     : RTEMS.MODE;
102      TIME         : RTEMS.TIME_OF_DAY;
103      STATUS       : RTEMS.STATUS_CODES;
104   begin
105
106      TIMER_DRIVER.INITIALIZE;
107         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
108         loop
109            TIMER_DRIVER.EMPTY_FUNCTION;
110         end loop;
111      OVERHEAD := TIMER_DRIVER.READ_TIMER;
112
113      TIMER_DRIVER.INITIALIZE;
114         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
115         loop
116            RTEMS.TASKS.SET_PRIORITY(
117               TMTEST.TASK_ID,
118               RTEMS.TASKS.CURRENT_PRIORITY,
119               OLD_PRIORITY,
120               STATUS
121            );
122         end loop;
123      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
124      TIME_TEST_SUPPORT.PUT_TIME(
125         "TASK_SET_PRIORITY current priority",
126         TMTEST.END_TIME,
127         TIME_TEST_SUPPORT.OPERATION_COUNT,
128         OVERHEAD,
129         RTEMS_CALLING_OVERHEAD.TASK_SET_PRIORITY
130      );
131
132      TIMER_DRIVER.INITIALIZE;
133         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
134         loop
135            RTEMS.TASKS.SET_PRIORITY(
136               TMTEST.TASK_ID,
137               253,
138               OLD_PRIORITY,
139               STATUS
140            );
141         end loop;
142      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
143      TIME_TEST_SUPPORT.PUT_TIME(
144         "TASK_SET_PRIORITY no preempt",
145         TMTEST.END_TIME,
146         TIME_TEST_SUPPORT.OPERATION_COUNT,
147         OVERHEAD,
148         RTEMS_CALLING_OVERHEAD.TASK_SET_PRIORITY
149      );
150
151      TIMER_DRIVER.INITIALIZE;
152         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
153         loop
154            RTEMS.TASKS.MODE(
155               RTEMS.CURRENT_MODE,
156               RTEMS.CURRENT_MODE,
157               OLD_MODE,
158               STATUS
159            );
160         end loop;
161      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
162      TIME_TEST_SUPPORT.PUT_TIME(
163         "TASK_MODE (current)",
164         TMTEST.END_TIME,
165         TIME_TEST_SUPPORT.OPERATION_COUNT,
166         OVERHEAD,
167         RTEMS_CALLING_OVERHEAD.TASK_MODE
168      );
169
170      TIMER_DRIVER.INITIALIZE;
171         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
172         loop
173            RTEMS.TASKS.MODE(
174               RTEMS.INTERRUPT_LEVEL( 1 ),
175               RTEMS.INTERRUPT_MASK,
176               OLD_MODE,
177               STATUS
178            );
179            RTEMS.TASKS.MODE(
180               RTEMS.INTERRUPT_LEVEL( 0 ),
181               RTEMS.INTERRUPT_MASK,
182               OLD_MODE,
183               STATUS
184            );
185         end loop;
186      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
187      TIME_TEST_SUPPORT.PUT_TIME(
188         "TASK_MODE (no reschedule)",
189         TMTEST.END_TIME,
190         TIME_TEST_SUPPORT.OPERATION_COUNT * 2,
191         OVERHEAD,
192         RTEMS_CALLING_OVERHEAD.TASK_MODE
193      );
194
195      TIMER_DRIVER.INITIALIZE;
196         RTEMS.TASKS.MODE(
197            RTEMS.NO_ASR,
198            RTEMS.ASR_MASK,
199            OLD_MODE,
200            STATUS
201         );
202      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
203      TIME_TEST_SUPPORT.PUT_TIME(
204         "TASK_MODE (reschedule)",
205         TMTEST.END_TIME,
206         1,
207         0,
208         RTEMS_CALLING_OVERHEAD.TASK_MODE
209      );
210
211      RTEMS.TASKS.MODE(
212         RTEMS.NO_PREEMPT,
213         RTEMS.PREEMPT_MASK,
214         OLD_MODE,
215         STATUS
216      );
217      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE" );
218
219      RTEMS.TASKS.SET_PRIORITY(
220         TMTEST.TASK_ID,
221         1,
222         OLD_PRIORITY,
223         STATUS
224      );
225      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" );
226
227      TIMER_DRIVER.INITIALIZE;
228      RTEMS.TASKS.MODE(          -- preempted by TEST_TASK1
229         RTEMS.PREEMPT,
230         RTEMS.PREEMPT_MASK,
231         OLD_MODE,
232         STATUS
233      );
234
235      TIME := (1988, 1, 1, 0, 0, 0, 0 );
236
237      TIMER_DRIVER.INITIALIZE;
238         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
239         loop
240            RTEMS.CLOCK.SET(
241               TIME,
242               STATUS
243            );
244         end loop;
245      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
246      TIME_TEST_SUPPORT.PUT_TIME(
247         "CLOCK_SET",
248         TMTEST.END_TIME,
249         TIME_TEST_SUPPORT.OPERATION_COUNT,
250         OVERHEAD,
251         RTEMS_CALLING_OVERHEAD.CLOCK_SET
252      );
253
254      TIMER_DRIVER.INITIALIZE;
255         for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
256         loop
257            RTEMS.CLOCK.GET( RTEMS.CLOCK.GET_TOD, TIME'ADDRESS, STATUS );
258         end loop;
259      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
260      TIME_TEST_SUPPORT.PUT_TIME(
261         "CLOCK_GET",
262         TMTEST.END_TIME,
263         TIME_TEST_SUPPORT.OPERATION_COUNT,
264         OVERHEAD,
265         RTEMS_CALLING_OVERHEAD.CLOCK_GET
266      );
267
268      TEXT_IO.PUT_LINE( "*** END OF TIME TEST 8 ***" );
269      RTEMS.SHUTDOWN_EXECUTIVE( 0 );
270
271   end TEST_TASK;
272
273--
274--  TEST_TASK1
275--
276
277   procedure TEST_TASK1 (
278      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
279   ) is
280      pragma Unreferenced(ARGUMENT);
281      STATUS       : RTEMS.STATUS_CODES;
282   begin
283
284      TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
285      TIME_TEST_SUPPORT.PUT_TIME(
286         "TASK_MODE (preemptive) ",
287         TMTEST.END_TIME,
288         1,
289         0,
290         RTEMS_CALLING_OVERHEAD.TASK_MODE
291      );
292
293      RTEMS.TASKS.SUSPEND( RTEMS.SELF, STATUS );
294      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "DOES NOT RETURN" );
295
296   end TEST_TASK1;
297
298end TMTEST;
Note: See TracBrowser for help on using the repository browser.