|
0
|
1 //=========================================================================== |
|
|
2 // |
|
|
3 // test6.c |
|
|
4 // |
|
|
5 // uITRON "C" test program six |
|
|
6 // |
|
|
7 //=========================================================================== |
|
|
8 //####COPYRIGHTBEGIN#### |
|
|
9 // |
|
|
10 // ------------------------------------------- |
|
|
11 // The contents of this file are subject to the Cygnus eCos Public License |
|
|
12 // Version 1.0 (the "License"); you may not use this file except in |
|
|
13 // compliance with the License. You may obtain a copy of the License at |
|
|
14 // http://sourceware.cygnus.com/ecos |
|
|
15 // |
|
|
16 // Software distributed under the License is distributed on an "AS IS" |
|
|
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
|
18 // License for the specific language governing rights and limitations under |
|
|
19 // the License. |
|
|
20 // |
|
|
21 // The Original Code is eCos - Embedded Cygnus Operating System, released |
|
|
22 // September 30, 1998. |
|
|
23 // |
|
|
24 // The Initial Developer of the Original Code is Cygnus. Portions created |
|
2
|
25 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved. |
|
0
|
26 // ------------------------------------------- |
|
|
27 // |
|
|
28 //####COPYRIGHTEND#### |
|
|
29 //=========================================================================== |
|
|
30 //#####DESCRIPTIONBEGIN#### |
|
|
31 // |
|
|
32 // Author(s): hmt |
|
|
33 // Contributors: hmt |
|
|
34 // Date: 1998-10-01 |
|
|
35 // Purpose: uITRON API testing |
|
|
36 // Description: |
|
|
37 // |
|
|
38 //####DESCRIPTIONEND#### |
|
|
39 // |
|
|
40 //=========================================================================== |
|
|
41 |
|
|
42 #include <pkgconf/uitron.h> // uITRON setup CYGNUM_UITRON_SEMAS |
|
|
43 // CYGPKG_UITRON et al |
|
|
44 #include <cyg/infra/testcase.h> // testing infrastructure |
|
|
45 |
|
|
46 #ifdef CYGPKG_UITRON // we DO want the uITRON package |
|
|
47 |
|
|
48 #ifdef CYGSEM_KERNEL_SCHED_MLQUEUE // we DO want prioritized threads |
|
|
49 |
|
|
50 #ifdef CYGFUN_KERNEL_THREADS_TIMER // we DO want timout-able calls |
|
|
51 |
|
|
52 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK // we DO want the realtime clock |
|
|
53 |
|
|
54 // we're OK if it's C++ or neither of those two is defined: |
|
|
55 #if defined( __cplusplus ) || \ |
|
|
56 (!defined( CYGIMP_UITRON_INLINE_FUNCS ) && \ |
|
|
57 !defined( CYGIMP_UITRON_CPP_OUTLINE_FUNCS) ) |
|
|
58 |
|
|
59 // =================== TEST CONFIGURATION =================== |
|
|
60 #if \ |
|
|
61 /* test configuration for enough tasks */ \ |
|
|
62 (CYGNUM_UITRON_TASKS >= 4) && \ |
|
|
63 (CYGNUM_UITRON_TASKS < 90) && \ |
|
|
64 (CYGNUM_UITRON_START_TASKS == 1) && \ |
|
|
65 ( !defined(CYGPKG_UITRON_TASKS_CREATE_DELETE) || \ |
|
|
66 CYGNUM_UITRON_TASKS_INITIALLY >= 4 ) && \ |
|
|
67 \ |
|
|
68 /* test configuration for enough semaphores */ \ |
|
|
69 defined( CYGPKG_UITRON_SEMAS ) && \ |
|
|
70 (CYGNUM_UITRON_SEMAS >= 3) && \ |
|
|
71 (CYGNUM_UITRON_SEMAS < 90) && \ |
|
|
72 ( !defined(CYGPKG_UITRON_SEMAS_CREATE_DELETE) || \ |
|
|
73 CYGNUM_UITRON_SEMAS_INITIALLY >= 3 ) && \ |
|
|
74 \ |
|
|
75 /* test configuration for enough flag objects */ \ |
|
|
76 defined( CYGPKG_UITRON_FLAGS ) && \ |
|
|
77 (CYGNUM_UITRON_FLAGS >= 3) && \ |
|
|
78 (CYGNUM_UITRON_FLAGS < 90) && \ |
|
|
79 ( !defined(CYGPKG_UITRON_FLAGS_CREATE_DELETE) || \ |
|
|
80 CYGNUM_UITRON_FLAGS_INITIALLY >= 3 ) && \ |
|
|
81 \ |
|
|
82 /* test configuration for enough message boxes */ \ |
|
|
83 defined( CYGPKG_UITRON_MBOXES ) && \ |
|
|
84 (CYGNUM_UITRON_MBOXES >= 3) && \ |
|
|
85 (CYGNUM_UITRON_MBOXES < 90) && \ |
|
|
86 ( !defined(CYGPKG_UITRON_MBOXES_CREATE_DELETE) || \ |
|
|
87 CYGNUM_UITRON_MBOXES_INITIALLY >= 3 ) && \ |
|
|
88 \ |
|
|
89 /* the end of the large #if statement */ \ |
|
|
90 1 |
|
|
91 |
|
|
92 // ============================ END ============================ |
|
|
93 |
|
|
94 |
|
|
95 |
|
|
96 #include <cyg/compat/uitron/uit_func.h> // uITRON |
|
|
97 |
|
|
98 externC void |
|
|
99 cyg_package_start( void ) |
|
|
100 { |
|
|
101 CYG_TEST_INIT(); |
|
|
102 CYG_TEST_INFO( "Calling cyg_uitron_start()" ); |
|
|
103 cyg_uitron_start(); |
|
|
104 } |
|
|
105 |
|
|
106 volatile int intercount = 0; |
|
|
107 UINT scratch; |
|
|
108 T_MSG *t_msg = (T_MSG *)&scratch; |
|
|
109 T_MSG *msg; |
|
|
110 VP vp; |
|
|
111 |
|
|
112 T_CSEM t_csem = { NULL, 0, 0 }; |
|
|
113 T_CMBX t_cmbx = { NULL, 0 }; |
|
|
114 T_CFLG t_cflg = { NULL, 0, 0 }; |
|
|
115 T_RSEM t_rsem; |
|
|
116 T_RMBX t_rmbx; |
|
|
117 T_RFLG t_rflg; |
|
|
118 |
|
|
119 |
|
|
120 void task1( unsigned int arg ) |
|
|
121 { |
|
|
122 ER ercd; |
|
|
123 int tests = 0; |
|
|
124 |
|
|
125 CYG_TEST_INFO( "Task 1 running" ); |
|
|
126 |
|
|
127 ercd = dis_dsp(); |
|
|
128 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" ); |
|
|
129 ercd = sta_tsk( 2, 22222 ); |
|
|
130 CYG_TEST_CHECK( E_OK == ercd, "sta_tsk bad ercd" ); |
|
|
131 ercd = chg_pri( 2, 5 ); |
|
|
132 CYG_TEST_CHECK( E_OK == ercd, "chg_pri bad ercd" ); |
|
|
133 ercd = ena_dsp(); |
|
|
134 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" ); |
|
|
135 ercd = dly_tsk( 10 ); |
|
|
136 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" ); |
|
|
137 |
|
|
138 #ifdef CYGPKG_UITRON_SEMAS_CREATE_DELETE |
|
|
139 tests++; |
|
|
140 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS |
|
|
141 ercd = del_sem( -6 ); |
|
|
142 CYG_TEST_CHECK( E_ID == ercd, "del_sem bad ercd !E_ID" ); |
|
|
143 ercd = del_sem( 99 ); |
|
|
144 CYG_TEST_CHECK( E_ID == ercd, "del_sem bad ercd !E_ID" ); |
|
|
145 ercd = cre_sem( -6, &t_csem ); |
|
|
146 CYG_TEST_CHECK( E_ID == ercd, "cre_sem bad ercd !E_ID" ); |
|
|
147 ercd = cre_sem( 99, &t_csem ); |
|
|
148 CYG_TEST_CHECK( E_ID == ercd, "cre_sem bad ercd !E_ID" ); |
|
|
149 #endif // we can test bad param error returns |
|
|
150 // try a pre-existing object |
|
|
151 ercd = cre_sem( 3, &t_csem ); |
|
|
152 CYG_TEST_CHECK( E_OBJ == ercd, "cre_sem bad ercd !E_OBJ" ); |
|
|
153 // delete it so we can play |
|
|
154 ercd = del_sem( 3 ); |
|
|
155 CYG_TEST_CHECK( E_OK == ercd, "del_sem bad ercd" ); |
|
|
156 // check it is deleted |
|
|
157 ercd = sig_sem( 3 ); |
|
|
158 CYG_TEST_CHECK( E_NOEXS == ercd, "sig_sem bad ercd !E_NOEXS" ); |
|
|
159 ercd = preq_sem( 3 ); |
|
|
160 CYG_TEST_CHECK( E_NOEXS == ercd, "preq_sem bad ercd !E_NOEXS" ); |
|
|
161 ercd = twai_sem( 3, 10 ); |
|
|
162 CYG_TEST_CHECK( E_NOEXS == ercd, "twai_sem bad ercd !E_NOEXS" ); |
|
|
163 ercd = wai_sem( 3 ); |
|
|
164 CYG_TEST_CHECK( E_NOEXS == ercd, "wai_sem bad ercd !E_NOEXS" ); |
|
|
165 ercd = ref_sem( &t_rsem, 3 ); |
|
|
166 CYG_TEST_CHECK( E_NOEXS == ercd, "ref_sem bad ercd !E_NOEXS" ); |
|
|
167 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS |
|
|
168 // now try creating it (badly) |
|
|
169 #ifndef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR |
|
|
170 ercd = cre_sem( 3, NULL ); |
|
|
171 CYG_TEST_CHECK( E_PAR == ercd, "cre_sem bad ercd !E_PAR" ); |
|
|
172 #endif |
|
|
173 ercd = cre_sem( 3, NADR ); |
|
|
174 CYG_TEST_CHECK( E_PAR == ercd, "cre_sem bad ercd !E_PAR" ); |
|
|
175 t_csem.sematr = 0xfff; |
|
|
176 ercd = cre_sem( 3, &t_csem ); |
|
|
177 CYG_TEST_CHECK( E_RSATR == ercd, "cre_sem bad ercd !E_RSATR" ); |
|
|
178 t_csem.sematr = 0; |
|
|
179 #endif // we can test bad param error returns |
|
|
180 ercd = cre_sem( 3, &t_csem ); |
|
|
181 CYG_TEST_CHECK( E_OK == ercd, "cre_sem bad ercd" ); |
|
|
182 // and check we can use it |
|
|
183 ercd = sig_sem( 3 ); |
|
|
184 CYG_TEST_CHECK( E_OK == ercd, "sig_sem bad ercd" ); |
|
|
185 ercd = wai_sem( 3 ); |
|
|
186 CYG_TEST_CHECK( E_OK == ercd, "wai_sem bad ercd" ); |
|
|
187 ercd = preq_sem( 3 ); |
|
|
188 CYG_TEST_CHECK( E_TMOUT == ercd, "preq_sem bad ercd !E_TMOUT" ); |
|
|
189 ercd = twai_sem( 3, 2 ); |
|
|
190 CYG_TEST_CHECK( E_TMOUT == ercd, "twai_sem bad ercd !E_TMOUT" ); |
|
|
191 ercd = ref_sem( &t_rsem, 3 ); |
|
|
192 CYG_TEST_CHECK( E_OK == ercd, "ref_sem bad ercd" ); |
|
|
193 |
|
|
194 // now wait while task 2 deletes the wait objects |
|
|
195 ercd = wup_tsk( 2 ); |
|
|
196 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
197 ercd = wai_sem( 1 ); |
|
|
198 CYG_TEST_CHECK( E_DLT == ercd, "wai_sem bad ercd !E_DLT" ); |
|
|
199 ercd = wup_tsk( 2 ); |
|
|
200 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
201 ercd = twai_sem( 2, 20 ); |
|
|
202 CYG_TEST_CHECK( E_DLT == ercd, "twai_sem bad ercd !E_DLT" ); |
|
|
203 |
|
|
204 // check they are deleted |
|
|
205 ercd = sig_sem( 1 ); |
|
|
206 CYG_TEST_CHECK( E_NOEXS == ercd, "sig_sem bad ercd !E_NOEXS" ); |
|
|
207 ercd = sig_sem( 2 ); |
|
|
208 CYG_TEST_CHECK( E_NOEXS == ercd, "sig_sem bad ercd !E_NOEXS" ); |
|
|
209 // re-create and do it again |
|
|
210 ercd = cre_sem( 1, &t_csem ); |
|
|
211 CYG_TEST_CHECK( E_OK == ercd, "cre_sem bad ercd" ); |
|
|
212 ercd = cre_sem( 2, &t_csem ); |
|
|
213 CYG_TEST_CHECK( E_OK == ercd, "cre_sem bad ercd" ); |
|
|
214 |
|
|
215 // now wait while task 2 deletes the wait objects again |
|
|
216 ercd = wup_tsk( 2 ); |
|
|
217 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
218 ercd = wai_sem( 1 ); |
|
|
219 CYG_TEST_CHECK( E_DLT == ercd, "wai_sem bad ercd !E_DLT" ); |
|
|
220 ercd = wup_tsk( 2 ); |
|
|
221 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
222 ercd = twai_sem( 2, 20 ); |
|
|
223 CYG_TEST_CHECK( E_DLT == ercd, "twai_sem bad ercd !E_DLT" ); |
|
|
224 |
|
|
225 // check they are deleted |
|
|
226 ercd = sig_sem( 1 ); |
|
|
227 CYG_TEST_CHECK( E_NOEXS == ercd, "sig_sem bad ercd !E_NOEXS" ); |
|
|
228 ercd = sig_sem( 2 ); |
|
|
229 CYG_TEST_CHECK( E_NOEXS == ercd, "sig_sem bad ercd !E_NOEXS" ); |
|
|
230 |
|
|
231 CYG_TEST_PASS("create/delete semaphores"); |
|
|
232 #endif // CYGPKG_UITRON_SEMAS_CREATE_DELETE |
|
|
233 |
|
|
234 |
|
|
235 #ifdef CYGPKG_UITRON_FLAGS_CREATE_DELETE |
|
|
236 tests++; |
|
|
237 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS |
|
|
238 ercd = del_flg( -6 ); |
|
|
239 CYG_TEST_CHECK( E_ID == ercd, "del_flg bad ercd !E_ID" ); |
|
|
240 ercd = del_flg( 99 ); |
|
|
241 CYG_TEST_CHECK( E_ID == ercd, "del_flg bad ercd !E_ID" ); |
|
|
242 ercd = cre_flg( -6, &t_cflg ); |
|
|
243 CYG_TEST_CHECK( E_ID == ercd, "cre_flg bad ercd !E_ID" ); |
|
|
244 ercd = cre_flg( 99, &t_cflg ); |
|
|
245 CYG_TEST_CHECK( E_ID == ercd, "cre_flg bad ercd !E_ID" ); |
|
|
246 #endif // we can test bad param error returns |
|
|
247 // try a pre-existing object |
|
|
248 ercd = cre_flg( 3, &t_cflg ); |
|
|
249 CYG_TEST_CHECK( E_OBJ == ercd, "cre_flg bad ercd !E_OBJ" ); |
|
|
250 // delete it so we can play |
|
|
251 ercd = del_flg( 3 ); |
|
|
252 CYG_TEST_CHECK( E_OK == ercd, "del_flg bad ercd" ); |
|
|
253 // check it is deleted |
|
|
254 ercd = set_flg( 3, 0x6789 ); |
|
|
255 CYG_TEST_CHECK( E_NOEXS == ercd, "set_flg bad ercd !E_NOEXS" ); |
|
|
256 ercd = clr_flg( 3, 0x9876 ); |
|
|
257 CYG_TEST_CHECK( E_NOEXS == ercd, "clr_flg bad ercd !E_NOEXS" ); |
|
|
258 ercd = pol_flg( &scratch, 3, 0xdddd, TWF_ANDW ); |
|
|
259 CYG_TEST_CHECK( E_NOEXS == ercd, "pol_flg bad ercd !E_NOEXS" ); |
|
|
260 ercd = twai_flg( &scratch, 3, 0x4444, TWF_ORW, 10 ); |
|
|
261 CYG_TEST_CHECK( E_NOEXS == ercd, "twai_flg bad ercd !E_NOEXS" ); |
|
|
262 ercd = wai_flg( &scratch, 3, 0xbbbb, TWF_ANDW | TWF_CLR ); |
|
|
263 CYG_TEST_CHECK( E_NOEXS == ercd, "wai_flg bad ercd !E_NOEXS" ); |
|
|
264 ercd = ref_flg( &t_rflg, 3 ); |
|
|
265 CYG_TEST_CHECK( E_NOEXS == ercd, "ref_flg bad ercd !E_NOEXS" ); |
|
|
266 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS |
|
|
267 // now try creating it (badly) |
|
|
268 #ifndef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR |
|
|
269 ercd = cre_flg( 3, NULL ); |
|
|
270 CYG_TEST_CHECK( E_PAR == ercd, "cre_flg bad ercd !E_PAR" ); |
|
|
271 #endif |
|
|
272 ercd = cre_flg( 3, NADR ); |
|
|
273 CYG_TEST_CHECK( E_PAR == ercd, "cre_flg bad ercd !E_PAR" ); |
|
|
274 t_cflg.flgatr = 0xfff; |
|
|
275 ercd = cre_flg( 3, &t_cflg ); |
|
|
276 CYG_TEST_CHECK( E_RSATR == ercd, "cre_flg bad ercd !E_RSATR" ); |
|
|
277 #endif // we can test bad param error returns |
|
|
278 // now create it well |
|
|
279 t_cflg.flgatr = 0; |
|
|
280 t_cflg.iflgptn = 0; |
|
|
281 ercd = cre_flg( 3, &t_cflg ); |
|
|
282 CYG_TEST_CHECK( E_OK == ercd, "cre_flg bad ercd" ); |
|
|
283 // and check we can use it |
|
|
284 ercd = clr_flg( 3, 0x7256 ); |
|
|
285 CYG_TEST_CHECK( E_OK == ercd, "clr_flg bad ercd" ); |
|
|
286 ercd = set_flg( 3, 0xff ); |
|
|
287 CYG_TEST_CHECK( E_OK == ercd, "set_flg bad ercd" ); |
|
|
288 ercd = wai_flg( &scratch, 3, 0xaa, TWF_ANDW | TWF_CLR ); |
|
|
289 CYG_TEST_CHECK( E_OK == ercd, "wai_flg bad ercd" ); |
|
|
290 ercd = pol_flg( &scratch, 3, 0xaa, TWF_ANDW | TWF_CLR ); |
|
|
291 CYG_TEST_CHECK( E_TMOUT == ercd, "pol_flg bad ercd !E_TMOUT" ); |
|
|
292 ercd = twai_flg( &scratch, 3, 0xaa, TWF_ANDW | TWF_CLR, 2 ); |
|
|
293 CYG_TEST_CHECK( E_TMOUT == ercd, "twai_flg bad ercd !E_TMOUT" ); |
|
|
294 ercd = ref_flg( &t_rflg, 3 ); |
|
|
295 CYG_TEST_CHECK( E_OK == ercd, "ref_flg bad ercd" ); |
|
|
296 CYG_TEST_CHECK( 0 == t_rflg.flgptn, "ref_flg bad ercd" ); |
|
|
297 // now create it again with a preset pattern and check that we can |
|
|
298 // detect that pattern: |
|
|
299 ercd = del_flg( 3 ); |
|
|
300 CYG_TEST_CHECK( E_OK == ercd, "del_flg bad ercd" ); |
|
|
301 t_cflg.flgatr = 0; |
|
|
302 t_cflg.iflgptn = 0x1234; |
|
|
303 ercd = cre_flg( 3, &t_cflg ); |
|
|
304 CYG_TEST_CHECK( E_OK == ercd, "cre_flg bad ercd" ); |
|
|
305 // and check we can use it |
|
|
306 ercd = wai_flg( &scratch, 3, 0x1200, TWF_ANDW ); |
|
|
307 CYG_TEST_CHECK( E_OK == ercd, "wai_flg bad ercd" ); |
|
|
308 ercd = pol_flg( &scratch, 3, 0x0034, TWF_ANDW ); |
|
|
309 CYG_TEST_CHECK( E_OK == ercd, "pol_flg bad ercd" ); |
|
|
310 ercd = twai_flg( &scratch, 3, 0x1004, TWF_ANDW, 10 ); |
|
|
311 CYG_TEST_CHECK( E_OK == ercd, "twai_flg bad ercd" ); |
|
|
312 ercd = pol_flg( &scratch, 3, 0xffedcb, TWF_ORW ); |
|
|
313 CYG_TEST_CHECK( E_TMOUT == ercd, "pol_flg bad ercd !E_TMOUT" ); |
|
|
314 ercd = ref_flg( &t_rflg, 3 ); |
|
|
315 CYG_TEST_CHECK( E_OK == ercd, "ref_flg bad ercd" ); |
|
|
316 CYG_TEST_CHECK( 0x1234 == t_rflg.flgptn, "ref_flg bad ercd" ); |
|
|
317 ercd = clr_flg( 3, 0 ); |
|
|
318 ercd = ref_flg( &t_rflg, 3 ); |
|
|
319 CYG_TEST_CHECK( E_OK == ercd, "ref_flg bad ercd" ); |
|
|
320 CYG_TEST_CHECK( 0 == t_rflg.flgptn, "ref_flg bad ercd" ); |
|
|
321 |
|
|
322 // now wait while task 2 deletes the wait objects |
|
|
323 ercd = wup_tsk( 2 ); |
|
|
324 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
325 ercd = wai_flg( &scratch, 1, 0xaa, TWF_ANDW ); |
|
|
326 CYG_TEST_CHECK( E_DLT == ercd, "wai_flg bad ercd !E_DLT" ); |
|
|
327 ercd = wup_tsk( 2 ); |
|
|
328 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
329 ercd = twai_flg( &scratch, 2, 0x55, TWF_ANDW, 20 ); |
|
|
330 CYG_TEST_CHECK( E_DLT == ercd, "twai_flg bad ercd !E_DLT" ); |
|
|
331 |
|
|
332 // check they are deleted |
|
|
333 ercd = set_flg( 1, 0x22 ); |
|
|
334 CYG_TEST_CHECK( E_NOEXS == ercd, "set_flg bad ercd !E_NOEXS" ); |
|
|
335 ercd = clr_flg( 2, 0xdd ); |
|
|
336 CYG_TEST_CHECK( E_NOEXS == ercd, "clr_flg bad ercd !E_NOEXS" ); |
|
|
337 // re-create and do it again |
|
|
338 t_cflg.iflgptn = 0x5555; |
|
|
339 ercd = cre_flg( 1, &t_cflg ); |
|
|
340 CYG_TEST_CHECK( E_OK == ercd, "cre_flg bad ercd" ); |
|
|
341 t_cflg.iflgptn = 0; |
|
|
342 ercd = cre_flg( 2, &t_cflg ); |
|
|
343 CYG_TEST_CHECK( E_OK == ercd, "cre_flg bad ercd" ); |
|
|
344 |
|
|
345 // now wait while task 2 deletes the wait objects again |
|
|
346 ercd = wup_tsk( 2 ); |
|
|
347 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
348 ercd = wai_flg( &scratch, 1, 0xaaaa, TWF_ORW | TWF_CLR ); |
|
|
349 CYG_TEST_CHECK( E_DLT == ercd, "wai_flg bad ercd !E_DLT" ); |
|
|
350 ercd = wup_tsk( 2 ); |
|
|
351 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
352 ercd = twai_flg( &scratch, 2, 0xffff, TWF_ORW, 20 ); |
|
|
353 CYG_TEST_CHECK( E_DLT == ercd, "twai_flg bad ercd !E_DLT" ); |
|
|
354 |
|
|
355 // check they are deleted |
|
|
356 ercd = clr_flg( 1, 0xd00d ); |
|
|
357 CYG_TEST_CHECK( E_NOEXS == ercd, "clr_flg bad ercd !E_NOEXS" ); |
|
|
358 ercd = set_flg( 2, 0xfff00 ); |
|
|
359 CYG_TEST_CHECK( E_NOEXS == ercd, "set_flg bad ercd !E_NOEXS" ); |
|
|
360 |
|
|
361 CYG_TEST_PASS("create/delete flags"); |
|
|
362 #endif // CYGPKG_UITRON_FLAGS_CREATE_DELETE |
|
|
363 |
|
|
364 #ifdef CYGPKG_UITRON_MBOXES_CREATE_DELETE |
|
|
365 tests++; |
|
|
366 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS |
|
|
367 ercd = del_mbx( -6 ); |
|
|
368 CYG_TEST_CHECK( E_ID == ercd, "del_mbx bad ercd !E_ID" ); |
|
|
369 ercd = del_mbx( 99 ); |
|
|
370 CYG_TEST_CHECK( E_ID == ercd, "del_mbx bad ercd !E_ID" ); |
|
|
371 ercd = cre_mbx( -6, &t_cmbx ); |
|
|
372 CYG_TEST_CHECK( E_ID == ercd, "cre_mbx bad ercd !E_ID" ); |
|
|
373 ercd = cre_mbx( 99, &t_cmbx ); |
|
|
374 CYG_TEST_CHECK( E_ID == ercd, "cre_mbx bad ercd !E_ID" ); |
|
|
375 #endif // we can test bad param error returns |
|
|
376 // try a pre-existing object |
|
|
377 ercd = cre_mbx( 3, &t_cmbx ); |
|
|
378 CYG_TEST_CHECK( E_OBJ == ercd, "cre_mbx bad ercd !E_OBJ" ); |
|
|
379 // delete it so we can play |
|
|
380 ercd = del_mbx( 3 ); |
|
|
381 CYG_TEST_CHECK( E_OK == ercd, "del_mbx bad ercd" ); |
|
|
382 // check it is deleted |
|
|
383 ercd = snd_msg( 3, t_msg ); |
|
|
384 CYG_TEST_CHECK( E_NOEXS == ercd, "snd_msg bad ercd !E_NOEXS" ); |
|
|
385 ercd = rcv_msg( &msg, 3 ); |
|
|
386 CYG_TEST_CHECK( E_NOEXS == ercd, "rcv_msg bad ercd !E_NOEXS" ); |
|
|
387 ercd = trcv_msg( &msg, 3, 10 ); |
|
|
388 CYG_TEST_CHECK( E_NOEXS == ercd, "trcv_msg bad ercd !E_NOEXS" ); |
|
|
389 ercd = prcv_msg( &msg, 3 ); |
|
|
390 CYG_TEST_CHECK( E_NOEXS == ercd, "prcv_msg bad ercd !E_NOEXS" ); |
|
|
391 ercd = ref_mbx( &t_rmbx, 3 ); |
|
|
392 CYG_TEST_CHECK( E_NOEXS == ercd, "ref_mbx bad ercd !E_NOEXS" ); |
|
|
393 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS |
|
|
394 // now try creating it (badly) |
|
|
395 #ifndef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR |
|
|
396 ercd = cre_mbx( 3, NULL ); |
|
|
397 CYG_TEST_CHECK( E_PAR == ercd, "cre_mbx bad ercd !E_PAR" ); |
|
|
398 #endif |
|
|
399 ercd = cre_mbx( 3, NADR ); |
|
|
400 CYG_TEST_CHECK( E_PAR == ercd, "cre_mbx bad ercd !E_PAR" ); |
|
|
401 t_cmbx.mbxatr = 0xfff; |
|
|
402 ercd = cre_mbx( 3, &t_cmbx ); |
|
|
403 CYG_TEST_CHECK( E_RSATR == ercd, "cre_mbx bad ercd !E_RSATR" ); |
|
|
404 t_cmbx.mbxatr = 0; |
|
|
405 #endif // we can test bad param error returns |
|
|
406 ercd = cre_mbx( 3, &t_cmbx ); |
|
|
407 CYG_TEST_CHECK( E_OK == ercd, "cre_mbx bad ercd" ); |
|
|
408 // and check we can use it |
|
|
409 ercd = snd_msg( 3, t_msg ); |
|
|
410 CYG_TEST_CHECK( E_OK == ercd, "snd_msg bad ercd" ); |
|
|
411 ercd = rcv_msg( &msg, 3 ); |
|
|
412 CYG_TEST_CHECK( E_OK == ercd, "rcv_msg bad ercd" ); |
|
|
413 ercd = trcv_msg( &msg, 3, 2 ); |
|
|
414 CYG_TEST_CHECK( E_TMOUT == ercd, "trcv_msg bad ercd !E_TMOUT" ); |
|
|
415 ercd = prcv_msg( &msg, 3 ); |
|
|
416 CYG_TEST_CHECK( E_TMOUT == ercd, "prcv_msg bad ercd !E_TMOUT" ); |
|
|
417 ercd = ref_mbx( &t_rmbx, 3 ); |
|
|
418 CYG_TEST_CHECK( E_OK == ercd, "ref_mbx bad ercd" ); |
|
|
419 |
|
|
420 // now wait while task 2 deletes the wait objects |
|
|
421 ercd = wup_tsk( 2 ); |
|
|
422 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
423 ercd = rcv_msg( &msg, 1 ); |
|
|
424 CYG_TEST_CHECK( E_DLT == ercd, "wai_mbx bad ercd !E_DLT" ); |
|
|
425 ercd = wup_tsk( 2 ); |
|
|
426 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
427 ercd = trcv_msg( &msg, 2, 20 ); |
|
|
428 CYG_TEST_CHECK( E_DLT == ercd, "twai_mbx bad ercd !E_DLT" ); |
|
|
429 |
|
|
430 // check they are deleted |
|
|
431 ercd = snd_msg( 1, t_msg ); |
|
|
432 CYG_TEST_CHECK( E_NOEXS == ercd, "snd_msg bad ercd !E_NOEXS" ); |
|
|
433 ercd = snd_msg( 2, t_msg ); |
|
|
434 CYG_TEST_CHECK( E_NOEXS == ercd, "snd_msg bad ercd !E_NOEXS" ); |
|
|
435 // re-create and do it again |
|
|
436 ercd = cre_mbx( 1, &t_cmbx ); |
|
|
437 CYG_TEST_CHECK( E_OK == ercd, "cre_mbx bad ercd" ); |
|
|
438 ercd = cre_mbx( 2, &t_cmbx ); |
|
|
439 CYG_TEST_CHECK( E_OK == ercd, "cre_mbx bad ercd" ); |
|
|
440 |
|
|
441 // now wait while task 2 deletes the wait objects again |
|
|
442 ercd = wup_tsk( 2 ); |
|
|
443 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
444 ercd = rcv_msg( &msg, 1 ); |
|
|
445 CYG_TEST_CHECK( E_DLT == ercd, "wai_mbx bad ercd !E_DLT" ); |
|
|
446 ercd = wup_tsk( 2 ); |
|
|
447 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
448 ercd = trcv_msg( &msg, 2, 20 ); |
|
|
449 CYG_TEST_CHECK( E_DLT == ercd, "twai_mbx bad ercd !E_DLT" ); |
|
|
450 |
|
|
451 // check they are deleted |
|
|
452 ercd = snd_msg( 1, t_msg ); |
|
|
453 CYG_TEST_CHECK( E_NOEXS == ercd, "snd_msg bad ercd !E_NOEXS" ); |
|
|
454 ercd = snd_msg( 2, t_msg ); |
|
|
455 CYG_TEST_CHECK( E_NOEXS == ercd, "snd_msg bad ercd !E_NOEXS" ); |
|
|
456 |
|
|
457 CYG_TEST_PASS("create/delete mboxes"); |
|
|
458 #endif // CYGPKG_UITRON_MBOXES_CREATE_DELETE |
|
|
459 |
|
|
460 ercd = ter_tsk( 2 ); |
|
|
461 CYG_TEST_CHECK( E_OK == ercd, "ter_tsk bad ercd" ); |
|
|
462 ercd = dly_tsk( 5 ); |
|
|
463 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" ); |
|
|
464 |
|
|
465 // all done |
|
|
466 if ( 0 == tests ) { |
|
2
|
467 CYG_TEST_NA( "No objects have create/delete enabled" ); |
|
0
|
468 } |
|
|
469 else { |
|
|
470 CYG_TEST_EXIT( "All done" ); |
|
|
471 } |
|
|
472 ext_tsk(); |
|
|
473 } |
|
|
474 |
|
|
475 |
|
|
476 |
|
|
477 void task2( unsigned int arg ) |
|
|
478 { |
|
|
479 ER ercd; |
|
|
480 int i; |
|
|
481 CYG_TEST_INFO( "Task 2 running" ); |
|
|
482 ercd = get_tid( &i ); |
|
|
483 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" ); |
|
|
484 CYG_TEST_CHECK( 2 == i, "tid not 2" ); |
|
|
485 if ( 22222 != arg ) |
|
|
486 CYG_TEST_FAIL( "Task 2 arg not 22222" ); |
|
|
487 |
|
|
488 ercd = slp_tsk(); |
|
|
489 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
490 |
|
|
491 #ifdef CYGPKG_UITRON_SEMAS_CREATE_DELETE |
|
|
492 ercd = del_sem( 1 ); |
|
|
493 CYG_TEST_CHECK( E_OK == ercd, "del_sem bad ercd" ); |
|
|
494 ercd = slp_tsk(); |
|
|
495 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
496 ercd = del_sem( 2 ); |
|
|
497 CYG_TEST_CHECK( E_OK == ercd, "del_sem bad ercd" ); |
|
|
498 ercd = slp_tsk(); |
|
|
499 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
500 ercd = del_sem( 1 ); |
|
|
501 CYG_TEST_CHECK( E_OK == ercd, "del_sem bad ercd" ); |
|
|
502 ercd = slp_tsk(); |
|
|
503 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
504 ercd = del_sem( 2 ); |
|
|
505 CYG_TEST_CHECK( E_OK == ercd, "del_sem bad ercd" ); |
|
|
506 ercd = slp_tsk(); |
|
|
507 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
508 #endif // CYGPKG_UITRON_SEMAS_CREATE_DELETE |
|
|
509 |
|
|
510 #ifdef CYGPKG_UITRON_FLAGS_CREATE_DELETE |
|
|
511 ercd = del_flg( 1 ); |
|
|
512 CYG_TEST_CHECK( E_OK == ercd, "del_flg bad ercd" ); |
|
|
513 ercd = slp_tsk(); |
|
|
514 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
515 ercd = del_flg( 2 ); |
|
|
516 CYG_TEST_CHECK( E_OK == ercd, "del_flg bad ercd" ); |
|
|
517 ercd = slp_tsk(); |
|
|
518 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
519 ercd = del_flg( 1 ); |
|
|
520 CYG_TEST_CHECK( E_OK == ercd, "del_flg bad ercd" ); |
|
|
521 ercd = slp_tsk(); |
|
|
522 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
523 ercd = del_flg( 2 ); |
|
|
524 CYG_TEST_CHECK( E_OK == ercd, "del_flg bad ercd" ); |
|
|
525 ercd = slp_tsk(); |
|
|
526 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
527 #endif // CYGPKG_UITRON_FLAGS_CREATE_DELETE |
|
|
528 |
|
|
529 #ifdef CYGPKG_UITRON_MBOXES_CREATE_DELETE |
|
|
530 ercd = del_mbx( 1 ); |
|
|
531 CYG_TEST_CHECK( E_OK == ercd, "del_mbx bad ercd" ); |
|
|
532 ercd = slp_tsk(); |
|
|
533 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
534 ercd = del_mbx( 2 ); |
|
|
535 CYG_TEST_CHECK( E_OK == ercd, "del_mbx bad ercd" ); |
|
|
536 ercd = slp_tsk(); |
|
|
537 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
538 ercd = del_mbx( 1 ); |
|
|
539 CYG_TEST_CHECK( E_OK == ercd, "del_mbx bad ercd" ); |
|
|
540 ercd = slp_tsk(); |
|
|
541 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
542 ercd = del_mbx( 2 ); |
|
|
543 CYG_TEST_CHECK( E_OK == ercd, "del_mbx bad ercd" ); |
|
|
544 ercd = slp_tsk(); |
|
|
545 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
546 #endif // CYGPKG_UITRON_MBOXES_CREATE_DELETE |
|
|
547 |
|
|
548 // we expect task2 to be killed here |
|
|
549 CYG_TEST_FAIL( "Task 2 ran to completion!" ); |
|
|
550 } |
|
|
551 |
|
|
552 void task3( unsigned int arg ) |
|
|
553 { |
|
|
554 } |
|
|
555 |
|
|
556 void task4( unsigned int arg ) |
|
|
557 { |
|
|
558 } |
|
|
559 |
|
|
560 #else // not enough (or too many) uITRON objects configured in |
|
|
561 #define N_A_MSG "not enough uITRON objects to run test" |
|
|
562 #endif // not enough (or too many) uITRON objects configured in |
|
|
563 #else // not C++ and some C++ specific options enabled |
|
|
564 #define N_A_MSG "C++ specific options selected but this is C" |
|
|
565 #endif // not C++ and some C++ specific options enabled |
|
|
566 #else // ! CYGVAR_KERNEL_COUNTERS_CLOCK - can't test without it |
|
|
567 #define N_A_MSG "no CYGVAR_KERNEL_COUNTERS_CLOCK" |
|
|
568 #endif // ! CYGVAR_KERNEL_COUNTERS_CLOCK - can't test without it |
|
|
569 #else // ! CYGFUN_KERNEL_THREADS_TIMER - can't test without it |
|
|
570 #define N_A_MSG "no CYGFUN_KERNEL_THREADS_TIMER" |
|
|
571 #endif // ! CYGFUN_KERNEL_THREADS_TIMER - can't test without it |
|
|
572 #else // ! CYGIMP_THREAD_PRIORITY - can't test without it |
|
|
573 #define N_A_MSG "no CYGSEM_KERNEL_SCHED_MLQUEUE" |
|
|
574 #endif // ! CYGSEM_KERNEL_SCHED_MLQUEUE - can't test without it |
|
|
575 #else // ! CYGPKG_UITRON |
|
|
576 #define N_A_MSG "uITRON Compatibility layer disabled" |
|
|
577 #endif // CYGPKG_UITRON |
|
|
578 |
|
|
579 #ifdef N_A_MSG |
|
|
580 void |
|
|
581 cyg_start( void ) |
|
|
582 { |
|
|
583 CYG_TEST_INIT(); |
|
2
|
584 CYG_TEST_NA( N_A_MSG ); |
|
0
|
585 } |
|
|
586 #endif // N_A_MSG defined ie. we are N/A. |
|
|
587 |
|
|
588 // EOF test6.c |