]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC/IAR_Specific/RegTest_IAR.s
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Demo / CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC / IAR_Specific / RegTest_IAR.s
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         RSEG    CODE:CODE(2)\r
39         thumb\r
40 \r
41 \r
42         EXTERN ulRegTest1LoopCounter\r
43         EXTERN ulRegTest2LoopCounter\r
44 \r
45         PUBLIC vRegTest1Task\r
46         PUBLIC vRegTest2Task\r
47 \r
48 /*-----------------------------------------------------------*/\r
49 vRegTest1Task\r
50 \r
51         /* Fill the core registers with known values.  This is only done once. */\r
52         movs r1, #101\r
53         movs r2, #102\r
54         movs r3, #103\r
55         movs r4, #104\r
56         movs r5, #105\r
57         movs r6, #106\r
58         movs r7, #107\r
59         movs r0, #108\r
60         mov      r8, r0\r
61         movs r0, #109\r
62         mov  r9, r0\r
63         movs r0, #110\r
64         mov      r10, r0\r
65         movs r0, #111\r
66         mov      r11, r0\r
67         movs r0, #112\r
68         mov  r12, r0\r
69         movs r0, #100\r
70 \r
71 reg1_loop\r
72         /* Repeatedly check that each register still contains the value written to\r
73         it when the task started. */\r
74         cmp     r0, #100\r
75         bne     reg1_error_loop\r
76         cmp     r1, #101\r
77         bne     reg1_error_loop\r
78         cmp     r2, #102\r
79         bne     reg1_error_loop\r
80         cmp r3, #103\r
81         bne     reg1_error_loop\r
82         cmp     r4, #104\r
83         bne     reg1_error_loop\r
84         cmp     r5, #105\r
85         bne     reg1_error_loop\r
86         cmp     r6, #106\r
87         bne     reg1_error_loop\r
88         cmp     r7, #107\r
89         bne     reg1_error_loop\r
90         movs r0, #108\r
91         cmp     r8, r0\r
92         bne     reg1_error_loop\r
93         movs r0, #109\r
94         cmp     r9, r0\r
95         bne     reg1_error_loop\r
96         movs r0, #110\r
97         cmp     r10, r0\r
98         bne     reg1_error_loop\r
99         movs r0, #111\r
100         cmp     r11, r0\r
101         bne     reg1_error_loop\r
102         movs r0, #112\r
103         cmp     r12, r0\r
104         bne     reg1_error_loop\r
105 \r
106         /* Everything passed, increment the loop counter. */\r
107         push { r1 }\r
108         ldr     r0, =ulRegTest1LoopCounter\r
109         ldr r1, [r0]\r
110         adds r1, r1, #1\r
111         str r1, [r0]\r
112 \r
113         /* Yield to increase test coverage. */\r
114         movs r0, #0x01\r
115         ldr r1, =0xe000ed04 /* NVIC_INT_CTRL */\r
116         lsls r0 ,r0, #28 /* Shift to PendSV bit */\r
117         str r0, [r1]\r
118         dsb\r
119         pop { r1 }\r
120 \r
121         /* Start again. */\r
122         movs r0, #100\r
123         b reg1_loop\r
124 \r
125 reg1_error_loop\r
126         /* If this line is hit then there was an error in a core register value.\r
127         The loop ensures the loop counter stops incrementing. */\r
128         b reg1_error_loop\r
129         nop\r
130 \r
131 \r
132 \r
133 vRegTest2Task\r
134 \r
135         /* Fill the core registers with known values.  This is only done once. */\r
136         movs r1, #1\r
137         movs r2, #2\r
138         movs r3, #3\r
139         movs r4, #4\r
140         movs r5, #5\r
141         movs r6, #6\r
142         movs r7, #7\r
143         movs r0, #8\r
144         mov     r8, r0\r
145         movs r0, #9\r
146         mov r9, r0\r
147         movs r0, #10\r
148         mov     r10, r0\r
149         movs r0, #11\r
150         mov     r11, r0\r
151         movs r0, #12\r
152         mov r12, r0\r
153         movs r0, #10\r
154 \r
155 reg2_loop\r
156         /* Repeatedly check that each register still contains the value written to\r
157         it when the task started. */\r
158         cmp     r0, #10\r
159         bne     reg2_error_loop\r
160         cmp     r1, #1\r
161         bne     reg2_error_loop\r
162         cmp     r2, #2\r
163         bne     reg2_error_loop\r
164         cmp r3, #3\r
165         bne     reg2_error_loop\r
166         cmp     r4, #4\r
167         bne     reg2_error_loop\r
168         cmp     r5, #5\r
169         bne     reg2_error_loop\r
170         cmp     r6, #6\r
171         bne     reg2_error_loop\r
172         cmp     r7, #7\r
173         bne     reg2_error_loop\r
174         movs r0, #8\r
175         cmp     r8, r0\r
176         bne     reg2_error_loop\r
177         movs r0, #9\r
178         cmp     r9, r0\r
179         bne     reg2_error_loop\r
180         movs r0, #10\r
181         cmp     r10, r0\r
182         bne     reg2_error_loop\r
183         movs r0, #11\r
184         cmp     r11, r0\r
185         bne     reg2_error_loop\r
186         movs r0, #12\r
187         cmp     r12, r0\r
188         bne     reg2_error_loop\r
189 \r
190         /* Everything passed, increment the loop counter. */\r
191         push { r1 }\r
192         ldr     r0, =ulRegTest2LoopCounter\r
193         ldr r1, [r0]\r
194         adds r1, r1, #1\r
195         str r1, [r0]\r
196         pop { r1 }\r
197 \r
198         /* Start again. */\r
199         movs r0, #10\r
200         b reg2_loop\r
201 \r
202 reg2_error_loop\r
203         ;/* If this line is hit then there was an error in a core register value.\r
204         ;The loop ensures the loop counter stops incrementing. */\r
205         b reg2_error_loop\r
206         nop\r
207 \r
208         END\r