Mercurial > public > ostc4
annotate Small_CPU/Src/startup_stm32f4xx.S @ 261:cc2406b835ff bm-3
Bugfix: do not reset saturation on surfacing
Commit 822416168585 introduced a subtle bug. On surfacing, the value of
saturation was reset to 0. This is prefect proof why global data is a
dangerous thing, and subtle changes can introduce seemingly unrelated
bugs.
While it would be much better to factor out as much as possible global
data, the fix here does not do that. Simply, the bug is fixed without
touching the rather complex gTissue_nitrogen_bar/gTissue_helium_bar
handling.
Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
author | Jan Mulder <jlmulder@xs4all.nl> |
---|---|
date | Tue, 23 Apr 2019 13:05:20 +0200 |
parents | 22864a24973b |
children |
rev | line source |
---|---|
38 | 1 /* File: startup_ARMCM4.S |
2 * Purpose: startup file for Cortex-M4 devices. Should use with | |
3 * GCC for ARM Embedded Processors | |
4 * Version: V1.3 | |
5 * Date: 08 Feb 2012 | |
6 * | |
7 * Copyright (c) 2012, ARM Limited | |
8 * All rights reserved. | |
9 * | |
10 * Redistribution and use in source and binary forms, with or without | |
11 * modification, are permitted provided that the following conditions are met: | |
12 * Redistributions of source code must retain the above copyright | |
13 notice, this list of conditions and the following disclaimer. | |
14 * Redistributions in binary form must reproduce the above copyright | |
15 notice, this list of conditions and the following disclaimer in the | |
16 documentation and/or other materials provided with the distribution. | |
17 * Neither the name of the ARM Limited nor the | |
18 names of its contributors may be used to endorse or promote products | |
19 derived from this software without specific prior written permission. | |
20 * | |
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
24 * DISCLAIMED. IN NO EVENT SHALL ARM LIMITED BE LIABLE FOR ANY | |
25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
27 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
28 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
31 */ | |
32 .syntax unified | |
33 .arch armv7-m | |
34 | |
35 .section .stack | |
36 .align 3 | |
37 #ifdef __STACK_SIZE | |
38 .equ Stack_Size, __STACK_SIZE | |
39 #else | |
40 .equ Stack_Size, 0x400 | |
41 #endif | |
42 .globl __StackTop | |
43 .globl __StackLimit | |
44 __StackLimit: | |
45 .space Stack_Size | |
46 .size __StackLimit, . - __StackLimit | |
47 __StackTop: | |
48 .size __StackTop, . - __StackTop | |
49 | |
50 .section .heap | |
51 .align 3 | |
52 #ifdef __HEAP_SIZE | |
53 .equ Heap_Size, __HEAP_SIZE | |
54 #else | |
55 .equ Heap_Size, 0xC00 | |
56 #endif | |
57 .globl __HeapBase | |
58 .globl __HeapLimit | |
59 __HeapBase: | |
60 .if Heap_Size | |
61 .space Heap_Size | |
62 .endif | |
63 .size __HeapBase, . - __HeapBase | |
64 __HeapLimit: | |
65 .size __HeapLimit, . - __HeapLimit | |
66 | |
67 .section .isr_vector | |
68 .align 2 | |
69 .globl __isr_vector | |
70 __isr_vector: | |
71 .long __StackTop /* Top of Stack */ | |
72 .long Reset_Handler /* Reset Handler */ | |
73 .long NMI_Handler /* NMI Handler */ | |
74 .long HardFault_Handler /* Hard Fault Handler */ | |
75 .long MemManage_Handler /* MPU Fault Handler */ | |
76 .long BusFault_Handler /* Bus Fault Handler */ | |
77 .long UsageFault_Handler /* Usage Fault Handler */ | |
78 .long 0 /* Reserved */ | |
79 .long 0 /* Reserved */ | |
80 .long 0 /* Reserved */ | |
81 .long 0 /* Reserved */ | |
82 .long SVC_Handler /* SVCall Handler */ | |
83 .long DebugMon_Handler /* Debug Monitor Handler */ | |
84 .long 0 /* Reserved */ | |
85 .long PendSV_Handler /* PendSV Handler */ | |
86 .long SysTick_Handler /* SysTick Handler */ | |
87 | |
88 // External Interrupts | |
89 .long WWDG_IRQHandler // Window WatchDog | |
90 .long PVD_IRQHandler // PVD through EXTI Line detection | |
91 .long TAMP_STAMP_IRQHandler // Tamper and TimeStamps through the EXTI line | |
92 .long RTC_WKUP_IRQHandler // RTC Wakeup through the EXTI line | |
93 .long FLASH_IRQHandler // FLASH | |
94 .long RCC_IRQHandler // RCC | |
95 .long EXTI0_IRQHandler // EXTI Line0 | |
96 .long EXTI1_IRQHandler // EXTI Line1 | |
97 .long EXTI2_IRQHandler // EXTI Line2 | |
98 .long EXTI3_IRQHandler // EXTI Line3 | |
99 .long EXTI4_IRQHandler // EXTI Line4 | |
100 .long DMA1_Stream0_IRQHandler // DMA1 Stream 0 | |
101 .long DMA1_Stream1_IRQHandler // DMA1 Stream 1 | |
102 .long DMA1_Stream2_IRQHandler // DMA1 Stream 2 | |
103 .long DMA1_Stream3_IRQHandler // DMA1 Stream 3 | |
104 .long DMA1_Stream4_IRQHandler // DMA1 Stream 4 | |
105 .long DMA1_Stream5_IRQHandler // DMA1 Stream 5 | |
106 .long DMA1_Stream6_IRQHandler // DMA1 Stream 6 | |
107 .long ADC_IRQHandler // ADC1, ADC2 and ADC3s | |
108 .long CAN1_TX_IRQHandler // CAN1 TX | |
109 .long CAN1_RX0_IRQHandler // CAN1 RX0 | |
110 .long CAN1_RX1_IRQHandler // CAN1 RX1 | |
111 .long CAN1_SCE_IRQHandler // CAN1 SCE | |
112 .long EXTI9_5_IRQHandler // External Line[9:5]s | |
113 .long TIM1_BRK_TIM9_IRQHandler // TIM1 Break and TIM9 | |
114 .long TIM1_UP_TIM10_IRQHandler // TIM1 Update and TIM10 | |
115 .long TIM1_TRG_COM_TIM11_IRQHandler // TIM1 Trigger and Commutation and TIM11 | |
116 .long TIM1_CC_IRQHandler // TIM1 Capture Compare | |
117 .long TIM2_IRQHandler // TIM2 | |
118 .long TIM3_IRQHandler // TIM3 | |
119 .long TIM4_IRQHandler // TIM4 | |
120 .long I2C1_EV_IRQHandler // I2C1 Event | |
121 .long I2C1_ER_IRQHandler // I2C1 Error | |
122 .long I2C2_EV_IRQHandler // I2C2 Event | |
123 .long I2C2_ER_IRQHandler // I2C2 Error | |
124 .long SPI1_IRQHandler // SPI1 | |
125 .long SPI2_IRQHandler // SPI2 | |
126 .long USART1_IRQHandler // USART1 | |
127 .long USART2_IRQHandler // USART2 | |
128 .long USART3_IRQHandler // USART3 | |
129 .long EXTI15_10_IRQHandler // External Line[15:10]s | |
130 .long RTC_Alarm_IRQHandler // RTC Alarm (A and B) through EXTI Line | |
131 .long OTG_FS_WKUP_IRQHandler // USB OTG FS Wakeup through EXTI line | |
132 .long TIM8_BRK_TIM12_IRQHandler // TIM8 Break and TIM12 | |
133 .long TIM8_UP_TIM13_IRQHandler // TIM8 Update and TIM13 | |
134 .long TIM8_TRG_COM_TIM14_IRQHandler // TIM8 Trigger and Commutation and TIM14 | |
135 .long TIM8_CC_IRQHandler // TIM8 Capture Compare | |
136 .long DMA1_Stream7_IRQHandler // DMA1 Stream7 | |
137 .long FSMC_IRQHandler // FSMC | |
138 .long SDIO_IRQHandler // SDIO | |
139 .long TIM5_IRQHandler // TIM5 | |
140 .long SPI3_IRQHandler // SPI3 | |
141 .long UART4_IRQHandler // UART4 | |
142 .long UART5_IRQHandler // UART5 | |
143 .long TIM6_DAC_IRQHandler // TIM6 and DAC1&2 underrun errors | |
144 .long TIM7_IRQHandler // TIM7 | |
145 .long DMA2_Stream0_IRQHandler // DMA2 Stream 0 | |
146 .long DMA2_Stream1_IRQHandler // DMA2 Stream 1 | |
147 .long DMA2_Stream2_IRQHandler // DMA2 Stream 2 | |
148 .long DMA2_Stream3_IRQHandler // DMA2 Stream 3 | |
149 .long DMA2_Stream4_IRQHandler // DMA2 Stream 4 | |
150 .long ETH_IRQHandler // Ethernet | |
151 .long ETH_WKUP_IRQHandler // Ethernet Wakeup through EXTI line | |
152 .long CAN2_TX_IRQHandler // CAN2 TX | |
153 .long CAN2_RX0_IRQHandler // CAN2 RX0 | |
154 .long CAN2_RX1_IRQHandler // CAN2 RX1 | |
155 .long CAN2_SCE_IRQHandler // CAN2 SCE | |
156 .long OTG_FS_IRQHandler // USB OTG FS | |
157 .long DMA2_Stream5_IRQHandler // DMA2 Stream 5 | |
158 .long DMA2_Stream6_IRQHandler // DMA2 Stream 6 | |
159 .long DMA2_Stream7_IRQHandler // DMA2 Stream 7 | |
160 .long USART6_IRQHandler // USART6 | |
161 .long I2C3_EV_IRQHandler // I2C3 event | |
162 .long I2C3_ER_IRQHandler // I2C3 error | |
163 .long OTG_HS_EP1_OUT_IRQHandler // USB OTG HS End Point 1 Out | |
164 .long OTG_HS_EP1_IN_IRQHandler // USB OTG HS End Point 1 In | |
165 .long OTG_HS_WKUP_IRQHandler // USB OTG HS Wakeup through EXTI | |
166 .long OTG_HS_IRQHandler // USB OTG HS | |
167 .long DCMI_IRQHandler // DCMI | |
168 .long CRYP_IRQHandler // CRYP crypto | |
169 .long HASH_RNG_IRQHandler // Hash and Rng | |
170 .long FPU_IRQHandler // FPU | |
171 | |
172 .size __isr_vector, . - __isr_vector | |
173 | |
174 .text | |
175 .thumb | |
176 .thumb_func | |
177 .align 2 | |
178 .globl Reset_Handler | |
179 .type Reset_Handler, %function | |
180 Reset_Handler: | |
181 /* Loop to copy data from read only memory to RAM. The ranges | |
182 * of copy from/to are specified by following symbols evaluated in | |
183 * linker script. | |
184 * __etext: End of code section, i.e., begin of data sections to copy from. | |
185 * __data_start__/__data_end__: RAM address range that data should be | |
186 * copied to. Both must be aligned to 4 bytes boundary. */ | |
187 | |
41
22864a24973b
Non functional change just to use same symbols as CPU1
Ideenmodellierer
parents:
38
diff
changeset
|
188 ldr r1, =_sidata /*__etext*/ |
38 | 189 ldr r2, =__data_start__ |
190 ldr r3, =__data_end__ | |
191 | |
192 #if 1 | |
193 /* Here are two copies of loop implemenations. First one favors code size | |
194 * and the second one favors performance. Default uses the first one. | |
195 * Change to "#if 0" to use the second one */ | |
196 .flash_to_ram_loop: | |
197 cmp r2, r3 | |
198 ittt lt | |
199 ldrlt r0, [r1], #4 | |
200 strlt r0, [r2], #4 | |
201 blt .flash_to_ram_loop | |
202 #else | |
203 subs r3, r2 | |
204 ble .flash_to_ram_loop_end | |
205 .flash_to_ram_loop: | |
206 subs r3, #4 | |
207 ldr r0, [r1, r3] | |
208 str r0, [r2, r3] | |
209 bgt .flash_to_ram_loop | |
210 .flash_to_ram_loop_end: | |
211 #endif | |
212 | |
213 #ifndef __NO_SYSTEM_INIT | |
214 ldr r0, =SystemInit | |
215 blx r0 | |
216 #endif | |
217 | |
218 ldr r0, =_start | |
219 bx r0 | |
220 .pool | |
221 .size Reset_Handler, . - Reset_Handler | |
222 | |
223 /* Our weak _start alternative if we don't use the library _start | |
224 * The zero init section must be cleared, otherwise the librtary is | |
225 * doing that */ | |
226 .align 1 | |
227 .thumb_func | |
228 .weak _start | |
229 .type _start, %function | |
230 _start: | |
231 | |
232 /* Zero fill the bss segment. */ | |
233 ldr r1, = __bss_start__ | |
234 ldr r2, = __bss_end__ | |
235 movs r3, #0 | |
236 b .fill_zero_bss | |
237 .loop_zero_bss: | |
238 str r3, [r1], #4 | |
239 | |
240 .fill_zero_bss: | |
241 cmp r1, r2 | |
242 bcc .loop_zero_bss | |
243 | |
244 /* Jump to our main */ | |
245 bl main | |
246 b . | |
247 .size _start, . - _start | |
248 | |
249 /* Macro to define default handlers. Default handler | |
250 * will be weak symbol and just dead loops. They can be | |
251 * overwritten by other handlers */ | |
252 .macro def_irq_handler handler_name | |
253 .align 1 | |
254 .thumb_func | |
255 .weak \handler_name | |
256 .type \handler_name, %function | |
257 \handler_name : | |
258 b . | |
259 .size \handler_name, . - \handler_name | |
260 .endm | |
261 | |
262 def_irq_handler NMI_Handler | |
263 def_irq_handler HardFault_Handler | |
264 def_irq_handler MemManage_Handler | |
265 def_irq_handler BusFault_Handler | |
266 def_irq_handler UsageFault_Handler | |
267 def_irq_handler SVC_Handler | |
268 def_irq_handler DebugMon_Handler | |
269 def_irq_handler PendSV_Handler | |
270 def_irq_handler SysTick_Handler | |
271 def_irq_handler Default_Handler | |
272 | |
273 // External Interrupts | |
274 def_irq_handler WWDG_IRQHandler // Window WatchDog | |
275 def_irq_handler PVD_IRQHandler // PVD through EXTI Line detection | |
276 def_irq_handler TAMP_STAMP_IRQHandler // Tamper and TimeStamps through the EXTI line | |
277 def_irq_handler RTC_WKUP_IRQHandler // RTC Wakeup through the EXTI line | |
278 def_irq_handler FLASH_IRQHandler // FLASH | |
279 def_irq_handler RCC_IRQHandler // RCC | |
280 def_irq_handler EXTI0_IRQHandler // EXTI Line0 | |
281 def_irq_handler EXTI1_IRQHandler // EXTI Line1 | |
282 def_irq_handler EXTI2_IRQHandler // EXTI Line2 | |
283 def_irq_handler EXTI3_IRQHandler // EXTI Line3 | |
284 def_irq_handler EXTI4_IRQHandler // EXTI Line4 | |
285 def_irq_handler DMA1_Stream0_IRQHandler // DMA1 Stream 0 | |
286 def_irq_handler DMA1_Stream1_IRQHandler // DMA1 Stream 1 | |
287 def_irq_handler DMA1_Stream2_IRQHandler // DMA1 Stream 2 | |
288 def_irq_handler DMA1_Stream3_IRQHandler // DMA1 Stream 3 | |
289 def_irq_handler DMA1_Stream4_IRQHandler // DMA1 Stream 4 | |
290 def_irq_handler DMA1_Stream5_IRQHandler // DMA1 Stream 5 | |
291 def_irq_handler DMA1_Stream6_IRQHandler // DMA1 Stream 6 | |
292 def_irq_handler ADC_IRQHandler // ADC1, ADC2 and ADC3s | |
293 def_irq_handler CAN1_TX_IRQHandler // CAN1 TX | |
294 def_irq_handler CAN1_RX0_IRQHandler // CAN1 RX0 | |
295 def_irq_handler CAN1_RX1_IRQHandler // CAN1 RX1 | |
296 def_irq_handler CAN1_SCE_IRQHandler // CAN1 SCE | |
297 def_irq_handler EXTI9_5_IRQHandler // External Line[9:5]s | |
298 def_irq_handler TIM1_BRK_TIM9_IRQHandler // TIM1 Break and TIM9 | |
299 def_irq_handler TIM1_UP_TIM10_IRQHandler // TIM1 Update and TIM10 | |
300 def_irq_handler TIM1_TRG_COM_TIM11_IRQHandler // TIM1 Trigger and Commutation and TIM11 | |
301 def_irq_handler TIM1_CC_IRQHandler // TIM1 Capture Compare | |
302 def_irq_handler TIM2_IRQHandler // TIM2 | |
303 def_irq_handler TIM3_IRQHandler // TIM3 | |
304 def_irq_handler TIM4_IRQHandler // TIM4 | |
305 def_irq_handler I2C1_EV_IRQHandler // I2C1 Event | |
306 def_irq_handler I2C1_ER_IRQHandler // I2C1 Error | |
307 def_irq_handler I2C2_EV_IRQHandler // I2C2 Event | |
308 def_irq_handler I2C2_ER_IRQHandler // I2C2 Error | |
309 def_irq_handler SPI1_IRQHandler // SPI1 | |
310 def_irq_handler SPI2_IRQHandler // SPI2 | |
311 def_irq_handler USART1_IRQHandler // USART1 | |
312 def_irq_handler USART2_IRQHandler // USART2 | |
313 def_irq_handler USART3_IRQHandler // USART3 | |
314 def_irq_handler EXTI15_10_IRQHandler // External Line[15:10]s | |
315 def_irq_handler RTC_Alarm_IRQHandler // RTC Alarm (A and B) through EXTI Line | |
316 def_irq_handler OTG_FS_WKUP_IRQHandler // USB OTG FS Wakeup through EXTI line | |
317 def_irq_handler TIM8_BRK_TIM12_IRQHandler // TIM8 Break and TIM12 | |
318 def_irq_handler TIM8_UP_TIM13_IRQHandler // TIM8 Update and TIM13 | |
319 def_irq_handler TIM8_TRG_COM_TIM14_IRQHandler // TIM8 Trigger and Commutation and TIM14 | |
320 def_irq_handler TIM8_CC_IRQHandler // TIM8 Capture Compare | |
321 def_irq_handler DMA1_Stream7_IRQHandler // DMA1 Stream7 | |
322 def_irq_handler FSMC_IRQHandler // FSMC | |
323 def_irq_handler SDIO_IRQHandler // SDIO | |
324 def_irq_handler TIM5_IRQHandler // TIM5 | |
325 def_irq_handler SPI3_IRQHandler // SPI3 | |
326 def_irq_handler UART4_IRQHandler // UART4 | |
327 def_irq_handler UART5_IRQHandler // UART5 | |
328 def_irq_handler TIM6_DAC_IRQHandler // TIM6 and DAC1&2 underrun errors | |
329 def_irq_handler TIM7_IRQHandler // TIM7 | |
330 def_irq_handler DMA2_Stream0_IRQHandler // DMA2 Stream 0 | |
331 def_irq_handler DMA2_Stream1_IRQHandler // DMA2 Stream 1 | |
332 def_irq_handler DMA2_Stream2_IRQHandler // DMA2 Stream 2 | |
333 def_irq_handler DMA2_Stream3_IRQHandler // DMA2 Stream 3 | |
334 def_irq_handler DMA2_Stream4_IRQHandler // DMA2 Stream 4 | |
335 def_irq_handler ETH_IRQHandler // Ethernet | |
336 def_irq_handler ETH_WKUP_IRQHandler // Ethernet Wakeup through EXTI line | |
337 def_irq_handler CAN2_TX_IRQHandler // CAN2 TX | |
338 def_irq_handler CAN2_RX0_IRQHandler // CAN2 RX0 | |
339 def_irq_handler CAN2_RX1_IRQHandler // CAN2 RX1 | |
340 def_irq_handler CAN2_SCE_IRQHandler // CAN2 SCE | |
341 def_irq_handler OTG_FS_IRQHandler // USB OTG FS | |
342 def_irq_handler DMA2_Stream5_IRQHandler // DMA2 Stream 5 | |
343 def_irq_handler DMA2_Stream6_IRQHandler // DMA2 Stream 6 | |
344 def_irq_handler DMA2_Stream7_IRQHandler // DMA2 Stream 7 | |
345 def_irq_handler USART6_IRQHandler // USART6 | |
346 def_irq_handler I2C3_EV_IRQHandler // I2C3 event | |
347 def_irq_handler I2C3_ER_IRQHandler // I2C3 error | |
348 def_irq_handler OTG_HS_EP1_OUT_IRQHandler // USB OTG HS End Point 1 Out | |
349 def_irq_handler OTG_HS_EP1_IN_IRQHandler // USB OTG HS End Point 1 In | |
350 def_irq_handler OTG_HS_WKUP_IRQHandler // USB OTG HS Wakeup through EXTI | |
351 def_irq_handler OTG_HS_IRQHandler // USB OTG HS | |
352 def_irq_handler DCMI_IRQHandler // DCMI | |
353 def_irq_handler CRYP_IRQHandler // CRYP crypto | |
354 def_irq_handler HASH_RNG_IRQHandler // Hash and Rng | |
355 def_irq_handler FPU_IRQHandler // FPU | |
356 | |
357 .end |