]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M4F_Infineon_XMC4500_IAR/RegTest.s
377504e5859eda8698ecc7fd8788adf15ce9d405
[freertos] / FreeRTOS / Demo / CORTEX_M4F_Infineon_XMC4500_IAR / RegTest.s
1 /*\r
2     FreeRTOS V7.5.0 - Copyright (C) 2013 Real Time Engineers Ltd.\r
3 \r
4     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
5 \r
6     ***************************************************************************\r
7      *                                                                       *\r
8      *    FreeRTOS provides completely free yet professionally developed,    *\r
9      *    robust, strictly quality controlled, supported, and cross          *\r
10      *    platform software that has become a de facto standard.             *\r
11      *                                                                       *\r
12      *    Help yourself get started quickly and support the FreeRTOS         *\r
13      *    project by purchasing a FreeRTOS tutorial book, reference          *\r
14      *    manual, or both from: http://www.FreeRTOS.org/Documentation        *\r
15      *                                                                       *\r
16      *    Thank you!                                                         *\r
17      *                                                                       *\r
18     ***************************************************************************\r
19 \r
20     This file is part of the FreeRTOS distribution.\r
21 \r
22     FreeRTOS is free software; you can redistribute it and/or modify it under\r
23     the terms of the GNU General Public License (version 2) as published by the\r
24     Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.\r
25 \r
26     >>! NOTE: The modification to the GPL is included to allow you to distribute\r
27     >>! a combined work that includes FreeRTOS without being obliged to provide\r
28     >>! the source code for proprietary components outside of the FreeRTOS\r
29     >>! kernel.\r
30 \r
31     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
32     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
33     FOR A PARTICULAR PURPOSE.  Full license text is available from the following\r
34     link: http://www.freertos.org/a00114.html\r
35 \r
36     1 tab == 4 spaces!\r
37 \r
38     ***************************************************************************\r
39      *                                                                       *\r
40      *    Having a problem?  Start by reading the FAQ "My application does   *\r
41      *    not run, what could be wrong?"                                     *\r
42      *                                                                       *\r
43      *    http://www.FreeRTOS.org/FAQHelp.html                               *\r
44      *                                                                       *\r
45     ***************************************************************************\r
46 \r
47     http://www.FreeRTOS.org - Documentation, books, training, latest versions,\r
48     license and Real Time Engineers Ltd. contact details.\r
49 \r
50     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
51     including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
52     compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
53 \r
54     http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
55     Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
56     licenses offer ticketed support, indemnification and middleware.\r
57 \r
58     http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
59     engineered and independently SIL3 certified version for use in safety and\r
60     mission critical applications that require provable dependability.\r
61 \r
62     1 tab == 4 spaces!\r
63 */\r
64 \r
65 #include <FreeRTOSConfig.h>\r
66 \r
67 \r
68         RSEG    CODE:CODE(2)\r
69         thumb\r
70 \r
71         EXTERN ulRegTest1LoopCounter\r
72         EXTERN ulRegTest2LoopCounter\r
73 \r
74         PUBLIC vRegTest1Task\r
75         PUBLIC vRegTest2Task\r
76         PUBLIC vRegTestClearFlopRegistersToParameterValue\r
77         PUBLIC ulRegTestCheckFlopRegistersContainParameterValue\r
78         \r
79 /*-----------------------------------------------------------*/\r
80 \r
81 vRegTest1Task\r
82 \r
83         /* Fill the core registers with known values. */\r
84         mov r0, #100\r
85         mov r1, #101\r
86         mov r2, #102\r
87         mov r3, #103\r
88         mov     r4, #104\r
89         mov     r5, #105\r
90         mov     r6, #106\r
91         mov r7, #107\r
92         mov     r8, #108\r
93         mov     r9, #109\r
94         mov     r10, #110\r
95         mov     r11, #111\r
96         mov r12, #112\r
97 \r
98         /* Fill the VFP registers with known values. */\r
99         vmov d0, r0, r1\r
100         vmov d1, r2, r3\r
101         vmov d2, r4, r5\r
102         vmov d3, r6, r7\r
103         vmov d4, r8, r9\r
104         vmov d5, r10, r11\r
105         vmov d6, r0, r1\r
106         vmov d7, r2, r3\r
107         vmov d8, r4, r5\r
108         vmov d9, r6, r7\r
109         vmov d10, r8, r9\r
110         vmov d11, r10, r11\r
111         vmov d12, r0, r1\r
112         vmov d13, r2, r3\r
113         vmov d14, r4, r5\r
114         vmov d15, r6, r7\r
115 \r
116 reg1_loop:\r
117         /* Check all the VFP registers still contain the values set above.\r
118         First save registers that are clobbered by the test. */\r
119         push { r0-r1 }\r
120         \r
121         vmov r0, r1, d0\r
122         cmp r0, #100\r
123         bne reg1_error_loopf\r
124         cmp r1, #101\r
125         bne reg1_error_loopf\r
126         vmov r0, r1, d1\r
127         cmp r0, #102\r
128         bne reg1_error_loopf\r
129         cmp r1, #103\r
130         bne reg1_error_loopf\r
131         vmov r0, r1, d2\r
132         cmp r0, #104\r
133         bne reg1_error_loopf\r
134         cmp r1, #105\r
135         bne reg1_error_loopf\r
136         vmov r0, r1, d3\r
137         cmp r0, #106\r
138         bne reg1_error_loopf\r
139         cmp r1, #107\r
140         bne reg1_error_loopf\r
141         vmov r0, r1, d4\r
142         cmp r0, #108\r
143         bne reg1_error_loopf\r
144         cmp r1, #109\r
145         bne reg1_error_loopf\r
146         vmov r0, r1, d5\r
147         cmp r0, #110\r
148         bne reg1_error_loopf\r
149         cmp r1, #111\r
150         bne reg1_error_loopf\r
151         vmov r0, r1, d6\r
152         cmp r0, #100\r
153         bne reg1_error_loopf\r
154         cmp r1, #101\r
155         bne reg1_error_loopf\r
156         vmov r0, r1, d7\r
157         cmp r0, #102\r
158         bne reg1_error_loopf\r
159         cmp r1, #103\r
160         bne reg1_error_loopf\r
161         vmov r0, r1, d8\r
162         cmp r0, #104\r
163         bne reg1_error_loopf\r
164         cmp r1, #105\r
165         bne reg1_error_loopf\r
166         vmov r0, r1, d9\r
167         cmp r0, #106\r
168         bne reg1_error_loopf\r
169         cmp r1, #107\r
170         bne reg1_error_loopf\r
171         vmov r0, r1, d10\r
172         cmp r0, #108\r
173         bne reg1_error_loopf\r
174         cmp r1, #109\r
175         bne reg1_error_loopf\r
176         vmov r0, r1, d11\r
177         cmp r0, #110\r
178         bne reg1_error_loopf\r
179         cmp r1, #111\r
180         bne reg1_error_loopf\r
181         vmov r0, r1, d12\r
182         cmp r0, #100\r
183         bne reg1_error_loopf\r
184         cmp r1, #101\r
185         bne reg1_error_loopf\r
186         vmov r0, r1, d13\r
187         cmp r0, #102\r
188         bne reg1_error_loopf\r
189         cmp r1, #103\r
190         bne reg1_error_loopf\r
191         vmov r0, r1, d14\r
192         cmp r0, #104\r
193         bne reg1_error_loopf\r
194         cmp r1, #105\r
195         bne reg1_error_loopf\r
196         vmov r0, r1, d15\r
197         cmp r0, #106\r
198         bne reg1_error_loopf\r
199         cmp r1, #107\r
200         bne reg1_error_loopf\r
201         \r
202         /* Restore the registers that were clobbered by the test. */\r
203         pop {r0-r1}\r
204         \r
205         /* VFP register test passed.  Jump to the core register test. */\r
206         b reg1_loopf_pass\r
207 \r
208 reg1_error_loopf\r
209         /* If this line is hit then a VFP register value was found to be\r
210         incorrect. */\r
211         b reg1_error_loopf\r
212 \r
213 reg1_loopf_pass\r
214 \r
215         cmp     r0, #100\r
216         bne     reg1_error_loop\r
217         cmp     r1, #101\r
218         bne     reg1_error_loop\r
219         cmp     r2, #102\r
220         bne     reg1_error_loop\r
221         cmp r3, #103\r
222         bne     reg1_error_loop\r
223         cmp     r4, #104\r
224         bne     reg1_error_loop\r
225         cmp     r5, #105\r
226         bne     reg1_error_loop\r
227         cmp     r6, #106\r
228         bne     reg1_error_loop\r
229         cmp     r7, #107\r
230         bne     reg1_error_loop\r
231         cmp     r8, #108\r
232         bne     reg1_error_loop\r
233         cmp     r9, #109\r
234         bne     reg1_error_loop\r
235         cmp     r10, #110\r
236         bne     reg1_error_loop\r
237         cmp     r11, #111\r
238         bne     reg1_error_loop\r
239         cmp     r12, #112\r
240         bne     reg1_error_loop\r
241         \r
242         /* Everything passed, increment the loop counter. */\r
243         push { r0-r1 }\r
244         ldr     r0, =ulRegTest1LoopCounter\r
245         ldr r1, [r0]\r
246         adds r1, r1, #1\r
247         str r1, [r0]\r
248         pop { r0-r1 }\r
249         \r
250         /* Start again. */\r
251         b reg1_loop\r
252 \r
253 reg1_error_loop:\r
254         /* If this line is hit then there was an error in a core register value.\r
255         The loop ensures the loop counter stops incrementing. */\r
256         b reg1_error_loop\r
257 \r
258 /*-----------------------------------------------------------*/\r
259 \r
260 \r
261 vRegTest2Task\r
262 \r
263         /* Set all the core registers to known values. */\r
264         mov r0, #-1\r
265         mov r1, #1\r
266         mov r2, #2\r
267         mov r3, #3\r
268         mov     r4, #4\r
269         mov     r5, #5\r
270         mov     r6, #6\r
271         mov r7, #7\r
272         mov     r8, #8\r
273         mov     r9, #9\r
274         mov     r10, #10\r
275         mov     r11, #11\r
276         mov r12, #12\r
277 \r
278         /* Set all the VFP to known values. */\r
279         vmov d0, r0, r1\r
280         vmov d1, r2, r3\r
281         vmov d2, r4, r5\r
282         vmov d3, r6, r7\r
283         vmov d4, r8, r9\r
284         vmov d5, r10, r11\r
285         vmov d6, r0, r1\r
286         vmov d7, r2, r3\r
287         vmov d8, r4, r5\r
288         vmov d9, r6, r7\r
289         vmov d10, r8, r9\r
290         vmov d11, r10, r11\r
291         vmov d12, r0, r1\r
292         vmov d13, r2, r3\r
293         vmov d14, r4, r5\r
294         vmov d15, r6, r7\r
295 \r
296 reg2_loop:\r
297         \r
298         /* Check all the VFP registers still contain the values set above.\r
299         First save registers that are clobbered by the test. */\r
300         push { r0-r1 }\r
301         \r
302         vmov r0, r1, d0\r
303         cmp r0, #-1\r
304         bne reg2_error_loopf\r
305         cmp r1, #1\r
306         bne reg2_error_loopf\r
307         vmov r0, r1, d1\r
308         cmp r0, #2\r
309         bne reg2_error_loopf\r
310         cmp r1, #3\r
311         bne reg2_error_loopf\r
312         vmov r0, r1, d2\r
313         cmp r0, #4\r
314         bne reg2_error_loopf\r
315         cmp r1, #5\r
316         bne reg2_error_loopf\r
317         vmov r0, r1, d3\r
318         cmp r0, #6\r
319         bne reg2_error_loopf\r
320         cmp r1, #7\r
321         bne reg2_error_loopf\r
322         vmov r0, r1, d4\r
323         cmp r0, #8\r
324         bne reg2_error_loopf\r
325         cmp r1, #9\r
326         bne reg2_error_loopf\r
327         vmov r0, r1, d5\r
328         cmp r0, #10\r
329         bne reg2_error_loopf\r
330         cmp r1, #11\r
331         bne reg2_error_loopf\r
332         vmov r0, r1, d6\r
333         cmp r0, #-1\r
334         bne reg2_error_loopf\r
335         cmp r1, #1\r
336         bne reg2_error_loopf\r
337         vmov r0, r1, d7\r
338         cmp r0, #2\r
339         bne reg2_error_loopf\r
340         cmp r1, #3\r
341         bne reg2_error_loopf\r
342         vmov r0, r1, d8\r
343         cmp r0, #4\r
344         bne reg2_error_loopf\r
345         cmp r1, #5\r
346         bne reg2_error_loopf\r
347         vmov r0, r1, d9\r
348         cmp r0, #6\r
349         bne reg2_error_loopf\r
350         cmp r1, #7\r
351         bne reg2_error_loopf\r
352         vmov r0, r1, d10\r
353         cmp r0, #8\r
354         bne reg2_error_loopf\r
355         cmp r1, #9\r
356         bne reg2_error_loopf\r
357         vmov r0, r1, d11\r
358         cmp r0, #10\r
359         bne reg2_error_loopf\r
360         cmp r1, #11\r
361         bne reg2_error_loopf\r
362         vmov r0, r1, d12\r
363         cmp r0, #-1\r
364         bne reg2_error_loopf\r
365         cmp r1, #1\r
366         bne reg2_error_loopf\r
367         vmov r0, r1, d13\r
368         cmp r0, #2\r
369         bne reg2_error_loopf\r
370         cmp r1, #3\r
371         bne reg2_error_loopf\r
372         vmov r0, r1, d14\r
373         cmp r0, #4\r
374         bne reg2_error_loopf\r
375         cmp r1, #5\r
376         bne reg2_error_loopf\r
377         vmov r0, r1, d15\r
378         cmp r0, #6\r
379         bne reg2_error_loopf\r
380         cmp r1, #7\r
381         bne reg2_error_loopf\r
382         \r
383         /* Restore the registers that were clobbered by the test. */\r
384         pop {r0-r1}\r
385         \r
386         /* VFP register test passed.  Jump to the core register test. */\r
387         b reg2_loopf_pass\r
388 \r
389 reg2_error_loopf\r
390         /* If this line is hit then a VFP register value was found to be\r
391         incorrect. */\r
392         b reg2_error_loopf\r
393 \r
394 reg2_loopf_pass\r
395 \r
396         cmp     r0, #-1\r
397         bne     reg2_error_loop\r
398         cmp     r1, #1\r
399         bne     reg2_error_loop\r
400         cmp     r2, #2\r
401         bne     reg2_error_loop\r
402         cmp r3, #3\r
403         bne     reg2_error_loop\r
404         cmp     r4, #4\r
405         bne     reg2_error_loop\r
406         cmp     r5, #5\r
407         bne     reg2_error_loop\r
408         cmp     r6, #6\r
409         bne     reg2_error_loop\r
410         cmp     r7, #7\r
411         bne     reg2_error_loop\r
412         cmp     r8, #8\r
413         bne     reg2_error_loop\r
414         cmp     r9, #9\r
415         bne     reg2_error_loop\r
416         cmp     r10, #10\r
417         bne     reg2_error_loop\r
418         cmp     r11, #11\r
419         bne     reg2_error_loop\r
420         cmp     r12, #12\r
421         bne     reg2_error_loop\r
422         \r
423         /* Increment the loop counter to indicate this test is still functioning\r
424         correctly. */\r
425         push { r0-r1 }\r
426         ldr     r0, =ulRegTest2LoopCounter\r
427         ldr r1, [r0]\r
428         adds r1, r1, #1\r
429         str r1, [r0]\r
430         pop { r0-r1 }\r
431         \r
432         /* Start again. */\r
433         b reg2_loop\r
434 \r
435 reg2_error_loop:\r
436         /* If this line is hit then there was an error in a core register value.\r
437         This loop ensures the loop counter variable stops incrementing. */\r
438         b reg2_error_loop\r
439 \r
440 /*-----------------------------------------------------------*/\r
441 \r
442 vRegTestClearFlopRegistersToParameterValue\r
443 \r
444         /* Clobber the auto saved registers. */\r
445         vmov d0, r0, r0\r
446         vmov d1, r0, r0\r
447         vmov d2, r0, r0\r
448         vmov d3, r0, r0\r
449         vmov d4, r0, r0\r
450         vmov d5, r0, r0\r
451         vmov d6, r0, r0\r
452         vmov d7, r0, r0\r
453         bx lr\r
454 \r
455 /*-----------------------------------------------------------*/\r
456 \r
457 ulRegTestCheckFlopRegistersContainParameterValue\r
458 \r
459         vmov r1, s0\r
460         cmp r0, r1\r
461         bne return_error\r
462         vmov r1, s1\r
463         cmp r0, r1\r
464         bne return_error\r
465         vmov r1, s2\r
466         cmp r0, r1\r
467         bne return_error\r
468         vmov r1, s3\r
469         cmp r0, r1\r
470         bne return_error\r
471         vmov r1, s4\r
472         cmp r0, r1\r
473         bne return_error\r
474         vmov r1, s5\r
475         cmp r0, r1\r
476         bne return_error\r
477         vmov r1, s6\r
478         cmp r0, r1\r
479         bne return_error\r
480         vmov r1, s7\r
481         cmp r0, r1\r
482         bne return_error\r
483         vmov r1, s8\r
484         cmp r0, r1\r
485         bne return_error\r
486         vmov r1, s9\r
487         cmp r0, r1\r
488         bne return_error\r
489         vmov r1, s10\r
490         cmp r0, r1\r
491         bne return_error\r
492         vmov r1, s11\r
493         cmp r0, r1\r
494         bne return_error\r
495         vmov r1, s12\r
496         cmp r0, r1\r
497         bne return_error\r
498         vmov r1, s13\r
499         cmp r0, r1\r
500         bne return_error\r
501         vmov r1, s14\r
502         cmp r0, r1\r
503         bne return_error\r
504         vmov r1, s15\r
505         cmp r0, r1\r
506         bne return_error\r
507         \r
508 return_pass\r
509         mov r0, #1\r
510         bx lr\r
511 \r
512 return_error\r
513         mov r0, #0\r
514         bx lr\r
515 \r
516         END\r
517         \r