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