source: rtems/c/src/ada-tests/mptests/mp05/mptest.adb @ fd57015

4.115
Last change on this file since fd57015 was c499856, checked in by Chris Johns <chrisj@…>, on Mar 20, 2014 at 9:10:47 PM

Change all references of rtems.com to rtems.org.

  • Property mode set to 100644
File size: 5.6 KB
Line 
1--
2--  MPTEST / BODY
3--
4--  DESCRIPTION:
5--
6--  This package is the implementation for Test 5 of the RTEMS
7--  Multiprocessor 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;
23with RTEMS.FATAL;
24with RTEMS.SIGNAL;
25with RTEMS.TASKS;
26with RTEMS.TIMER;
27with TEST_SUPPORT;
28with TEXT_IO;
29with UNSIGNED32_IO;
30
31package body MPTEST is
32
33--
34--  INIT
35--
36
37   procedure INIT (
38      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
39   ) is
40      STATUS : RTEMS.STATUS_CODES;
41   begin
42
43      TEXT_IO.NEW_LINE( 2 );
44      TEXT_IO.PUT( "*** TEST 5 -- NODE " );
45      UNSIGNED32_IO.PUT(
46         TEST_SUPPORT.NODE,
47         WIDTH => 1
48      );
49      TEXT_IO.PUT_LINE( " ***" );
50
51      MPTEST.TASK_NAME( 1 ) := RTEMS.BUILD_NAME(  '1', '1', '1', ' ' );
52      MPTEST.TASK_NAME( 2 ) := RTEMS.BUILD_NAME(  '2', '2', '2', ' ' );
53
54      TEXT_IO.PUT_LINE( "Creating Test_task (Global)" );
55
56      RTEMS.TASKS.CREATE( 
57         MPTEST.TASK_NAME( TEST_SUPPORT.NODE ), 
58         1,
59         2048, 
60         RTEMS.TIMESLICE,
61         RTEMS.GLOBAL,
62         MPTEST.TASK_ID( 1 ),
63         STATUS
64      );
65      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE" );
66
67      TEXT_IO.PUT_LINE( "Starting Test_task (Global)" );
68
69      RTEMS.TASKS.START(
70         MPTEST.TASK_ID( 1 ),
71         MPTEST.TEST_TASK'ACCESS,
72         0,
73         STATUS
74      );
75      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START" );
76
77      MPTEST.TIMER_NAME( 1 ) := RTEMS.BUILD_NAME(  'T', 'M', '1', ' ' );
78      MPTEST.TIMER_NAME( 2 ) := RTEMS.BUILD_NAME(  'T', 'M', '2', ' ' );
79
80      RTEMS.TIMER.CREATE(
81         MPTEST.TIMER_NAME( TEST_SUPPORT.NODE ),
82         MPTEST.TIMER_ID( 1 ),
83         STATUS
84      );
85      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_CREATE" );
86
87      TEXT_IO.PUT_LINE( "Deleting initialization task" );
88
89      RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
90      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
91
92   end INIT;
93
94--
95--  PROCESS_ASR
96--
97
98   procedure PROCESS_ASR (
99      SIGNAL : in     RTEMS.SIGNAL_SET
100   )
101   is 
102   begin
103
104      if SIGNAL /= MPTEST.EXPECTED_SIGNAL then
105
106         TEXT_IO.PUT( "ERROR: I was expecting signal 0x" );
107         UNSIGNED32_IO.PUT( EXPECTED_SIGNAL, BASE => 16 );
108         TEXT_IO.PUT( " got 0x" );
109         UNSIGNED32_IO.PUT( SIGNAL, BASE => 16 );
110         TEXT_IO.NEW_LINE;
111
112         RTEMS.FATAL.ERROR_OCCURRED( 16#000F_0000# );
113
114      end if;
115
116      MPTEST.SIGNAL_CAUGHT := TRUE;
117
118   end PROCESS_ASR;
119
120--
121--  STOP_TEST_TSR
122--
123
124   procedure STOP_TEST_TSR (
125      IGNORED_ID      : in     RTEMS.ID;
126      IGNORED_ADDRESS : in     RTEMS.ADDRESS
127   ) is
128   begin
129
130      MPTEST.STOP_TEST := TRUE;
131
132   end STOP_TEST_TSR;
133
134--
135--  TEST_TASK
136--
137
138   procedure TEST_TASK (
139      ARGUMENT : in     RTEMS.TASKS.ARGUMENT
140   ) is
141      STATUS  : RTEMS.STATUS_CODES;
142   begin
143
144      MPTEST.STOP_TEST := FALSE;
145
146      MPTEST.SIGNAL_CAUGHT := FALSE;
147      MPTEST.SIGNAL_COUNT  := 0;
148
149      TEXT_IO.PUT_LINE( "signal_catch: initializing signal catcher" );
150      RTEMS.SIGNAL.CATCH( 
151         MPTEST.PROCESS_ASR'ACCESS, 
152         RTEMS.NO_ASR + RTEMS.NO_PREEMPT,
153         STATUS
154      );
155      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SIGNAL_CATCH" );
156
157      if TEST_SUPPORT.NODE = 1 then
158         MPTEST.REMOTE_NODE     := 2;
159         MPTEST.REMOTE_SIGNAL   := RTEMS.SIGNAL_18;
160         MPTEST.EXPECTED_SIGNAL := RTEMS.SIGNAL_17;
161      else
162         MPTEST.REMOTE_NODE     := 1;
163         MPTEST.REMOTE_SIGNAL   := RTEMS.SIGNAL_17;
164         MPTEST.EXPECTED_SIGNAL := RTEMS.SIGNAL_18;
165      end if;
166
167      TEXT_IO.PUT( "Remote task's name is : " );
168      TEST_SUPPORT.PUT_NAME( MPTEST.TASK_NAME( MPTEST.REMOTE_NODE ), TRUE );
169
170      TEXT_IO.PUT_LINE( "Getting TID of remote task" );
171      loop
172
173         RTEMS.TASKS.IDENT( 
174            MPTEST.TASK_NAME( MPTEST.REMOTE_NODE ),
175            RTEMS.SEARCH_ALL_NODES,
176            MPTEST.REMOTE_TID,
177            STATUS
178         );
179
180         exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
181
182      end loop;
183
184      RTEMS.TIMER.FIRE_AFTER(
185         MPTEST.TIMER_ID( 1 ),
186         3 * TEST_SUPPORT.TICKS_PER_SECOND,
187         MPTEST.STOP_TEST_TSR'ACCESS,
188         RTEMS.NULL_ADDRESS,
189         STATUS
190      );
191      TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TIMER_FIRE_AFTER" );
192
193      if TEST_SUPPORT.NODE = 1 then
194
195         TEXT_IO.PUT_LINE( "Sending signal to remote task" );
196         loop
197            RTEMS.SIGNAL.SEND(
198               MPTEST.REMOTE_TID,
199               MPTEST.REMOTE_SIGNAL,
200               STATUS
201            );
202
203            exit when RTEMS.IS_STATUS_SUCCESSFUL( STATUS );
204
205            exit when not RTEMS.ARE_STATUSES_EQUAL(STATUS, RTEMS.NOT_DEFINED);
206   
207         end loop;
208         TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SIGNAL_SEND" );
209
210      end if;
211
212      loop
213 
214         exit when MPTEST.STOP_TEST = TRUE;
215
216         if MPTEST.SIGNAL_CAUGHT = TRUE then
217
218            MPTEST.SIGNAL_CAUGHT := FALSE;
219            MPTEST.SIGNAL_COUNT  := MPTEST.SIGNAL_COUNT + 1;
220
221            if MPTEST.SIGNAL_COUNT >= MPTEST.SIGNALS_PER_DOT then
222
223               MPTEST.SIGNAL_COUNT := 0;
224
225               TEST_SUPPORT.PUT_DOT( "." );
226
227            end if;
228
229            RTEMS.SIGNAL.SEND(
230               MPTEST.REMOTE_TID,
231               MPTEST.REMOTE_SIGNAL,
232               STATUS
233            );
234            TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SIGNAL_SEND" );
235
236         end if;
237
238      end loop;
239
240      TEXT_IO.NEW_LINE;
241      TEXT_IO.PUT_LINE( "*** END OF TEST 5 ***" );
242
243      RTEMS.SHUTDOWN_EXECUTIVE( 0 );
244
245   end TEST_TASK;
246
247end MPTEST;
Note: See TracBrowser for help on using the repository browser.