]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M4F_CEC1302_Keil_GCC/Keil_Specific/RegTest.c
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Demo / CORTEX_M4F_CEC1302_Keil_GCC / Keil_Specific / RegTest.c
1 /*\r
2  * FreeRTOS Kernel V10.0.0\r
3  * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software. If you wish to use our Amazon\r
14  * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
15  *\r
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22  *\r
23  * http://www.FreeRTOS.org\r
24  * http://aws.amazon.com/freertos\r
25  *\r
26  * 1 tab == 4 spaces!\r
27  */\r
28 \r
29 /*\r
30  * "Reg test" tasks - These fill the registers with known values, then check\r
31  * that each register maintains its expected value for the lifetime of the\r
32  * task.  Each task uses a different set of values.  The reg test tasks execute\r
33  * with a very low priority, so get preempted very frequently.  A register\r
34  * containing an unexpected value is indicative of an error in the context\r
35  * switching mechanism.\r
36  */\r
37  \r
38  \r
39 __asm void vRegTest1Implementation( void )\r
40 {\r
41         PRESERVE8\r
42         IMPORT ulRegTest1LoopCounter\r
43 \r
44         /* Fill the core registers with known values. */\r
45         mov r0, #100\r
46         mov r1, #101\r
47         mov r2, #102\r
48         mov r3, #103\r
49         mov     r4, #104\r
50         mov     r5, #105\r
51         mov     r6, #106\r
52         mov r7, #107\r
53         mov     r8, #108\r
54         mov     r9, #109\r
55         mov     r10, #110\r
56         mov     r11, #111\r
57         mov r12, #112\r
58 \r
59         /* Fill the VFP registers with known values. */\r
60         vmov d0, r0, r1\r
61         vmov d1, r2, r3\r
62         vmov d2, r4, r5\r
63         vmov d3, r6, r7\r
64         vmov d4, r8, r9\r
65         vmov d5, r10, r11\r
66         vmov d6, r0, r1\r
67         vmov d7, r2, r3\r
68         vmov d8, r4, r5\r
69         vmov d9, r6, r7\r
70         vmov d10, r8, r9\r
71         vmov d11, r10, r11\r
72         vmov d12, r0, r1\r
73         vmov d13, r2, r3\r
74         vmov d14, r4, r5\r
75         vmov d15, r6, r7\r
76 \r
77 reg1_loop\r
78         /* Check all the VFP registers still contain the values set above.\r
79         First save registers that are clobbered by the test. */\r
80         push { r0-r1 }\r
81         \r
82         vmov r0, r1, d0\r
83         cmp r0, #100\r
84         bne reg1_error_loopf\r
85         cmp r1, #101\r
86         bne reg1_error_loopf\r
87         vmov r0, r1, d1\r
88         cmp r0, #102\r
89         bne reg1_error_loopf\r
90         cmp r1, #103\r
91         bne reg1_error_loopf\r
92         vmov r0, r1, d2\r
93         cmp r0, #104\r
94         bne reg1_error_loopf\r
95         cmp r1, #105\r
96         bne reg1_error_loopf\r
97         vmov r0, r1, d3\r
98         cmp r0, #106\r
99         bne reg1_error_loopf\r
100         cmp r1, #107\r
101         bne reg1_error_loopf\r
102         vmov r0, r1, d4\r
103         cmp r0, #108\r
104         bne reg1_error_loopf\r
105         cmp r1, #109\r
106         bne reg1_error_loopf\r
107         vmov r0, r1, d5\r
108         cmp r0, #110\r
109         bne reg1_error_loopf\r
110         cmp r1, #111\r
111         bne reg1_error_loopf\r
112         vmov r0, r1, d6\r
113         cmp r0, #100\r
114         bne reg1_error_loopf\r
115         cmp r1, #101\r
116         bne reg1_error_loopf\r
117         vmov r0, r1, d7\r
118         cmp r0, #102\r
119         bne reg1_error_loopf\r
120         cmp r1, #103\r
121         bne reg1_error_loopf\r
122         vmov r0, r1, d8\r
123         cmp r0, #104\r
124         bne reg1_error_loopf\r
125         cmp r1, #105\r
126         bne reg1_error_loopf\r
127         vmov r0, r1, d9\r
128         cmp r0, #106\r
129         bne reg1_error_loopf\r
130         cmp r1, #107\r
131         bne reg1_error_loopf\r
132         vmov r0, r1, d10\r
133         cmp r0, #108\r
134         bne reg1_error_loopf\r
135         cmp r1, #109\r
136         bne reg1_error_loopf\r
137         vmov r0, r1, d11\r
138         cmp r0, #110\r
139         bne reg1_error_loopf\r
140         cmp r1, #111\r
141         bne reg1_error_loopf\r
142         vmov r0, r1, d12\r
143         cmp r0, #100\r
144         bne reg1_error_loopf\r
145         cmp r1, #101\r
146         bne reg1_error_loopf\r
147         vmov r0, r1, d13\r
148         cmp r0, #102\r
149         bne reg1_error_loopf\r
150         cmp r1, #103\r
151         bne reg1_error_loopf\r
152         vmov r0, r1, d14\r
153         cmp r0, #104\r
154         bne reg1_error_loopf\r
155         cmp r1, #105\r
156         bne reg1_error_loopf\r
157         vmov r0, r1, d15\r
158         cmp r0, #106\r
159         bne reg1_error_loopf\r
160         cmp r1, #107\r
161         bne reg1_error_loopf\r
162         \r
163         /* Restore the registers that were clobbered by the test. */\r
164         pop {r0-r1}\r
165         \r
166         /* VFP register test passed.  Jump to the core register test. */\r
167         b reg1_loopf_pass\r
168 \r
169 reg1_error_loopf\r
170         /* If this line is hit then a VFP register value was found to be\r
171         incorrect. */\r
172         b reg1_error_loopf\r
173 \r
174 reg1_loopf_pass\r
175 \r
176         cmp     r0, #100\r
177         bne     reg1_error_loop\r
178         cmp     r1, #101\r
179         bne     reg1_error_loop\r
180         cmp     r2, #102\r
181         bne     reg1_error_loop\r
182         cmp r3, #103\r
183         bne     reg1_error_loop\r
184         cmp     r4, #104\r
185         bne     reg1_error_loop\r
186         cmp     r5, #105\r
187         bne     reg1_error_loop\r
188         cmp     r6, #106\r
189         bne     reg1_error_loop\r
190         cmp     r7, #107\r
191         bne     reg1_error_loop\r
192         cmp     r8, #108\r
193         bne     reg1_error_loop\r
194         cmp     r9, #109\r
195         bne     reg1_error_loop\r
196         cmp     r10, #110\r
197         bne     reg1_error_loop\r
198         cmp     r11, #111\r
199         bne     reg1_error_loop\r
200         cmp     r12, #112\r
201         bne     reg1_error_loop\r
202         \r
203         /* Everything passed, increment the loop counter. */\r
204         push { r0-r1 }\r
205         ldr     r0, =ulRegTest1LoopCounter\r
206         ldr r1, [r0]\r
207         adds r1, r1, #1\r
208         str r1, [r0]\r
209         pop { r0-r1 }\r
210         \r
211         /* Start again. */\r
212         b reg1_loop\r
213 \r
214 reg1_error_loop\r
215         /* If this line is hit then there was an error in a core register value.\r
216         The loop ensures the loop counter stops incrementing. */\r
217         b reg1_error_loop\r
218         nop\r
219 }\r
220 /*-----------------------------------------------------------*/\r
221 \r
222 __asm void vRegTest2Implementation( void )\r
223 {\r
224         PRESERVE8\r
225         IMPORT ulRegTest2LoopCounter\r
226 \r
227         /* Set all the core registers to known values. */\r
228         mov r0, #-1\r
229         mov r1, #1\r
230         mov r2, #2\r
231         mov r3, #3\r
232         mov     r4, #4\r
233         mov     r5, #5\r
234         mov     r6, #6\r
235         mov r7, #7\r
236         mov     r8, #8\r
237         mov     r9, #9\r
238         mov     r10, #10\r
239         mov     r11, #11\r
240         mov r12, #12\r
241 \r
242         /* Set all the VFP to known values. */\r
243         vmov d0, r0, r1\r
244         vmov d1, r2, r3\r
245         vmov d2, r4, r5\r
246         vmov d3, r6, r7\r
247         vmov d4, r8, r9\r
248         vmov d5, r10, r11\r
249         vmov d6, r0, r1\r
250         vmov d7, r2, r3\r
251         vmov d8, r4, r5\r
252         vmov d9, r6, r7\r
253         vmov d10, r8, r9\r
254         vmov d11, r10, r11\r
255         vmov d12, r0, r1\r
256         vmov d13, r2, r3\r
257         vmov d14, r4, r5\r
258         vmov d15, r6, r7\r
259 \r
260 reg2_loop\r
261         \r
262         /* Check all the VFP registers still contain the values set above.\r
263         First save registers that are clobbered by the test. */\r
264         push { r0-r1 }\r
265         \r
266         vmov r0, r1, d0\r
267         cmp r0, #-1\r
268         bne reg2_error_loopf\r
269         cmp r1, #1\r
270         bne reg2_error_loopf\r
271         vmov r0, r1, d1\r
272         cmp r0, #2\r
273         bne reg2_error_loopf\r
274         cmp r1, #3\r
275         bne reg2_error_loopf\r
276         vmov r0, r1, d2\r
277         cmp r0, #4\r
278         bne reg2_error_loopf\r
279         cmp r1, #5\r
280         bne reg2_error_loopf\r
281         vmov r0, r1, d3\r
282         cmp r0, #6\r
283         bne reg2_error_loopf\r
284         cmp r1, #7\r
285         bne reg2_error_loopf\r
286         vmov r0, r1, d4\r
287         cmp r0, #8\r
288         bne reg2_error_loopf\r
289         cmp r1, #9\r
290         bne reg2_error_loopf\r
291         vmov r0, r1, d5\r
292         cmp r0, #10\r
293         bne reg2_error_loopf\r
294         cmp r1, #11\r
295         bne reg2_error_loopf\r
296         vmov r0, r1, d6\r
297         cmp r0, #-1\r
298         bne reg2_error_loopf\r
299         cmp r1, #1\r
300         bne reg2_error_loopf\r
301         vmov r0, r1, d7\r
302         cmp r0, #2\r
303         bne reg2_error_loopf\r
304         cmp r1, #3\r
305         bne reg2_error_loopf\r
306         vmov r0, r1, d8\r
307         cmp r0, #4\r
308         bne reg2_error_loopf\r
309         cmp r1, #5\r
310         bne reg2_error_loopf\r
311         vmov r0, r1, d9\r
312         cmp r0, #6\r
313         bne reg2_error_loopf\r
314         cmp r1, #7\r
315         bne reg2_error_loopf\r
316         vmov r0, r1, d10\r
317         cmp r0, #8\r
318         bne reg2_error_loopf\r
319         cmp r1, #9\r
320         bne reg2_error_loopf\r
321         vmov r0, r1, d11\r
322         cmp r0, #10\r
323         bne reg2_error_loopf\r
324         cmp r1, #11\r
325         bne reg2_error_loopf\r
326         vmov r0, r1, d12\r
327         cmp r0, #-1\r
328         bne reg2_error_loopf\r
329         cmp r1, #1\r
330         bne reg2_error_loopf\r
331         vmov r0, r1, d13\r
332         cmp r0, #2\r
333         bne reg2_error_loopf\r
334         cmp r1, #3\r
335         bne reg2_error_loopf\r
336         vmov r0, r1, d14\r
337         cmp r0, #4\r
338         bne reg2_error_loopf\r
339         cmp r1, #5\r
340         bne reg2_error_loopf\r
341         vmov r0, r1, d15\r
342         cmp r0, #6\r
343         bne reg2_error_loopf\r
344         cmp r1, #7\r
345         bne reg2_error_loopf\r
346         \r
347         /* Restore the registers that were clobbered by the test. */\r
348         pop {r0-r1}\r
349         \r
350         /* VFP register test passed.  Jump to the core register test. */\r
351         b reg2_loopf_pass\r
352 \r
353 reg2_error_loopf\r
354         /* If this line is hit then a VFP register value was found to be\r
355         incorrect. */\r
356         b reg2_error_loopf\r
357 \r
358 reg2_loopf_pass\r
359 \r
360         cmp     r0, #-1\r
361         bne     reg2_error_loop\r
362         cmp     r1, #1\r
363         bne     reg2_error_loop\r
364         cmp     r2, #2\r
365         bne     reg2_error_loop\r
366         cmp r3, #3\r
367         bne     reg2_error_loop\r
368         cmp     r4, #4\r
369         bne     reg2_error_loop\r
370         cmp     r5, #5\r
371         bne     reg2_error_loop\r
372         cmp     r6, #6\r
373         bne     reg2_error_loop\r
374         cmp     r7, #7\r
375         bne     reg2_error_loop\r
376         cmp     r8, #8\r
377         bne     reg2_error_loop\r
378         cmp     r9, #9\r
379         bne     reg2_error_loop\r
380         cmp     r10, #10\r
381         bne     reg2_error_loop\r
382         cmp     r11, #11\r
383         bne     reg2_error_loop\r
384         cmp     r12, #12\r
385         bne     reg2_error_loop\r
386         \r
387         /* Increment the loop counter to indicate this test is still functioning\r
388         correctly. */\r
389         push { r0-r1 }\r
390         ldr     r0, =ulRegTest2LoopCounter\r
391         ldr r1, [r0]\r
392         adds r1, r1, #1\r
393         str r1, [r0]\r
394         \r
395         /* Yield to increase test coverage. */\r
396         movs r0, #0x01\r
397         ldr r1, =0xe000ed04 /*NVIC_INT_CTRL */\r
398         lsl r0, r0, #28 /* Shift to PendSV bit */\r
399         str r0, [r1]\r
400         dsb\r
401         \r
402         pop { r0-r1 }\r
403         \r
404         /* Start again. */\r
405         b reg2_loop\r
406 \r
407 reg2_error_loop\r
408         /* If this line is hit then there was an error in a core register value.\r
409         This loop ensures the loop counter variable stops incrementing. */\r
410         b reg2_error_loop\r
411 }\r
412 /*-----------------------------------------------------------*/\r
413 \r