]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_EFM32_Giant_Gecko_Simplicity_Studio/Full_Demo/RegTest.c
0d32ad805bf0f881512c30e37431ea19fc4f0962
[freertos] / FreeRTOS / Demo / CORTEX_EFM32_Giant_Gecko_Simplicity_Studio / Full_Demo / RegTest.c
1 /*\r
2  * FreeRTOS Kernel V10.2.1\r
3  * Copyright (C) 2019 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.\r
14  *\r
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21  *\r
22  * http://www.FreeRTOS.org\r
23  * http://aws.amazon.com/freertos\r
24  *\r
25  * 1 tab == 4 spaces!\r
26  */\r
27 \r
28 /*\r
29  * "Reg test" tasks - These fill the registers with known values, then check\r
30  * that each register maintains its expected value for the lifetime of the\r
31  * task.  Each task uses a different set of values.  The reg test tasks execute\r
32  * with a very low priority, so get preempted very frequently.  A register\r
33  * containing an unexpected value is indicative of an error in the context\r
34  * switching mechanism.\r
35  */\r
36 \r
37 void vRegTest1Implementation( void ) __attribute__ ((naked));\r
38 void vRegTest2Implementation( void ) __attribute__ ((naked));\r
39 \r
40 void vRegTest1Implementation( void )\r
41 {\r
42         __asm volatile\r
43         (\r
44                 ".extern ulRegTest1LoopCounter \n"\r
45                 "/* Fill the core registers with known values. */               \n"\r
46                 "mov    r0, #100                        \n"\r
47                 "mov    r1, #101                        \n"\r
48                 "mov    r2, #102                        \n"\r
49                 "mov    r3, #103                        \n"\r
50                 "mov    r4, #104                        \n"\r
51                 "mov    r5, #105                        \n"\r
52                 "mov    r6, #106                        \n"\r
53                 "mov    r7, #107                        \n"\r
54                 "mov    r8, #108                        \n"\r
55                 "mov    r9, #109                        \n"\r
56                 "mov    r10, #110                       \n"\r
57                 "mov    r11, #111                       \n"\r
58                 "mov    r12, #112                       \n"\r
59 \r
60         "reg1_loop:                                             \n"\r
61 \r
62                 "/* Check each register has maintained its expected value. */   \n"\r
63                 "cmp    r0, #100                        \n"\r
64                 "bne    reg1_error_loop         \n"\r
65                 "cmp    r1, #101                        \n"\r
66                 "bne    reg1_error_loop         \n"\r
67                 "cmp    r2, #102                        \n"\r
68                 "bne    reg1_error_loop         \n"\r
69                 "cmp    r3, #103                        \n"\r
70                 "bne    reg1_error_loop         \n"\r
71                 "cmp    r4, #104                        \n"\r
72                 "bne    reg1_error_loop         \n"\r
73                 "cmp    r5, #105                        \n"\r
74                 "bne    reg1_error_loop         \n"\r
75                 "cmp    r6, #106                        \n"\r
76                 "bne    reg1_error_loop         \n"\r
77                 "cmp    r7, #107                        \n"\r
78                 "bne    reg1_error_loop         \n"\r
79                 "cmp    r8, #108                        \n"\r
80                 "bne    reg1_error_loop         \n"\r
81                 "cmp    r9, #109                        \n"\r
82                 "bne    reg1_error_loop         \n"\r
83                 "cmp    r10, #110                       \n"\r
84                 "bne    reg1_error_loop         \n"\r
85                 "cmp    r11, #111                       \n"\r
86                 "bne    reg1_error_loop         \n"\r
87                 "cmp    r12, #112                       \n"\r
88                 "bne    reg1_error_loop         \n"\r
89 \r
90                 "/* Everything passed, increment the loop counter. */   \n"\r
91                 "push   { r0-r1 }                       \n"\r
92                 "ldr    r0, =ulRegTest1LoopCounter      \n"\r
93                 "ldr    r1, [r0]                        \n"\r
94                 "adds   r1, r1, #1                      \n"\r
95                 "str    r1, [r0]                        \n"\r
96                 "pop    { r0-r1 }                       \n"\r
97 \r
98                 "/* Start again. */                     \n"\r
99                 "b              reg1_loop                       \n"\r
100 \r
101         "reg1_error_loop:                               \n"\r
102                 "/* If this line is hit then there was an error in a core register value. \n"\r
103                 "The loop ensures the loop counter stops incrementing. */       \n"\r
104                 "b      reg1_error_loop                 \n"\r
105                 "nop                                            "\r
106         ); /* __asm volatile. */\r
107 }\r
108 /*-----------------------------------------------------------*/\r
109 \r
110 void vRegTest2Implementation( void )\r
111 {\r
112         __asm volatile\r
113         (\r
114                 ".extern ulRegTest2LoopCounter \n"\r
115                 "/* Set all the core registers to known values. */      \n"\r
116                 "mov    r0, #-1                         \n"\r
117                 "mov    r1, #1                          \n"\r
118                 "mov    r2, #2                          \n"\r
119                 "mov    r3, #3                          \n"\r
120                 "mov    r4, #4                          \n"\r
121                 "mov    r5, #5                          \n"\r
122                 "mov    r6, #6                          \n"\r
123                 "mov    r7, #7                          \n"\r
124                 "mov    r8, #8                          \n"\r
125                 "mov    r9, #9                          \n"\r
126                 "mov    r10, #10                        \n"\r
127                 "mov    r11, #11                        \n"\r
128                 "mov    r12, #12                        \n"\r
129 \r
130         "reg2_loop:                                             \n"\r
131 \r
132                 "cmp    r0, #-1                         \n"\r
133                 "bne    reg2_error_loop         \n"\r
134                 "cmp    r1, #1                          \n"\r
135                 "bne    reg2_error_loop         \n"\r
136                 "cmp    r2, #2                          \n"\r
137                 "bne    reg2_error_loop         \n"\r
138                 "cmp    r3, #3                          \n"\r
139                 "bne    reg2_error_loop         \n"\r
140                 "cmp    r4, #4                          \n"\r
141                 "bne    reg2_error_loop         \n"\r
142                 "cmp    r5, #5                          \n"\r
143                 "bne    reg2_error_loop         \n"\r
144                 "cmp    r6, #6                          \n"\r
145                 "bne    reg2_error_loop         \n"\r
146                 "cmp    r7, #7                          \n"\r
147                 "bne    reg2_error_loop         \n"\r
148                 "cmp    r8, #8                          \n"\r
149                 "bne    reg2_error_loop         \n"\r
150                 "cmp    r9, #9                          \n"\r
151                 "bne    reg2_error_loop         \n"\r
152                 "cmp    r10, #10                        \n"\r
153                 "bne    reg2_error_loop         \n"\r
154                 "cmp    r11, #11                        \n"\r
155                 "bne    reg2_error_loop         \n"\r
156                 "cmp    r12, #12                        \n"\r
157                 "bne    reg2_error_loop         \n"\r
158 \r
159                 "/* Increment the loop counter to indicate this test is still functioning       \n"\r
160                 "correctly. */                          \n"\r
161                 "push   { r0-r1 }                       \n"\r
162                 "ldr    r0, =ulRegTest2LoopCounter      \n"\r
163                 "ldr    r1, [r0]                        \n"\r
164                 "adds   r1, r1, #1                      \n"\r
165                 "str    r1, [r0]                        \n"\r
166 \r
167                 "/* Yield to increase test coverage. */                 \n"\r
168                 "movs   r0, #0x01                       \n"\r
169                 "ldr    r1, =0xe000ed04 /*NVIC_INT_CTRL */              \n"\r
170                 "lsl    r0, r0, #28 /* Shift to PendSV bit */   \n"\r
171                 "str    r0, [r1]                        \n"\r
172                 "dsb                                            \n"\r
173 \r
174                 "pop { r0-r1 }                          \n"\r
175 \r
176                 "/* Start again. */                     \n"\r
177                 "b reg2_loop                            \n"\r
178 \r
179         "reg2_error_loop:                               \n"\r
180                 "/* If this line is hit then there was an error in a core register value.       \n"\r
181                 "This loop ensures the loop counter variable stops incrementing. */                     \n"\r
182                 "b reg2_error_loop                      \n"\r
183         ); /* __asm volatile */\r
184 }\r
185 /*-----------------------------------------------------------*/\r
186 \r