516 lines
20 KiB
Plaintext
516 lines
20 KiB
Plaintext
|
|
|
|
|
|
ARM Macro Assembler Page 1
|
|
|
|
|
|
1 00000000 ;/*
|
|
2 00000000 ; * Copyright (c) 2006-2018, RT-Thread Development Team
|
|
3 00000000 ; *
|
|
4 00000000 ; * SPDX-License-Identifier: Apache-2.0
|
|
5 00000000 ; *
|
|
6 00000000 ; * Change Logs:
|
|
7 00000000 ; * Date Author Notes
|
|
8 00000000 ; * 2009-01-17 Bernard first version
|
|
9 00000000 ; * 2013-06-18 aozima add restore MSP feature.
|
|
|
|
10 00000000 ; * 2013-07-09 aozima enhancement hard fault e
|
|
xception handler.
|
|
11 00000000 ; */
|
|
12 00000000
|
|
13 00000000 ;/**
|
|
14 00000000 ; * @addtogroup CORTEX-M3
|
|
15 00000000 ; */
|
|
16 00000000 ;/*@{*/
|
|
17 00000000
|
|
18 00000000 E000ED08
|
|
SCB_VTOR
|
|
EQU 0xE000ED08 ; Vector Table Offs
|
|
et Register
|
|
19 00000000 E000ED04
|
|
NVIC_INT_CTRL
|
|
EQU 0xE000ED04 ; interrupt control
|
|
state register
|
|
20 00000000 E000ED20
|
|
NVIC_SYSPRI2
|
|
EQU 0xE000ED20 ; system priority r
|
|
egister (2)
|
|
21 00000000 FFFF0000
|
|
NVIC_PENDSV_PRI
|
|
EQU 0xFFFF0000 ; PendSV and SysTic
|
|
k priority value (l
|
|
owest)
|
|
22 00000000 10000000
|
|
NVIC_PENDSVSET
|
|
EQU 0x10000000 ; value to trigger
|
|
PendSV exception
|
|
23 00000000
|
|
24 00000000 AREA |.text|, CODE, READONLY, ALIGN=
|
|
2
|
|
25 00000000 THUMB
|
|
26 00000000 REQUIRE8
|
|
27 00000000 PRESERVE8
|
|
28 00000000
|
|
29 00000000 IMPORT rt_thread_switch_interrupt_flag
|
|
30 00000000 IMPORT rt_interrupt_from_thread
|
|
31 00000000 IMPORT rt_interrupt_to_thread
|
|
32 00000000
|
|
33 00000000 ;/*
|
|
34 00000000 ; * rt_base_t rt_hw_interrupt_disable();
|
|
35 00000000 ; */
|
|
36 00000000 rt_hw_interrupt_disable
|
|
PROC
|
|
37 00000000 EXPORT rt_hw_interrupt_disable
|
|
38 00000000 F3EF 8010 MRS r0, PRIMASK
|
|
39 00000004 B672 CPSID I
|
|
|
|
|
|
|
|
ARM Macro Assembler Page 2
|
|
|
|
|
|
40 00000006 4770 BX LR
|
|
41 00000008 ENDP
|
|
42 00000008
|
|
43 00000008 ;/*
|
|
44 00000008 ; * void rt_hw_interrupt_enable(rt_base_t level);
|
|
45 00000008 ; */
|
|
46 00000008 rt_hw_interrupt_enable
|
|
PROC
|
|
47 00000008 EXPORT rt_hw_interrupt_enable
|
|
48 00000008 F380 8810 MSR PRIMASK, r0
|
|
49 0000000C 4770 BX LR
|
|
50 0000000E ENDP
|
|
51 0000000E
|
|
52 0000000E ;/*
|
|
53 0000000E ; * void rt_hw_context_switch(rt_uint32 from, rt_uint32
|
|
to);
|
|
54 0000000E ; * r0 --> from
|
|
55 0000000E ; * r1 --> to
|
|
56 0000000E ; */
|
|
57 0000000E rt_hw_context_switch_interrupt
|
|
58 0000000E EXPORT rt_hw_context_switch_interrupt
|
|
59 0000000E rt_hw_context_switch
|
|
PROC
|
|
60 0000000E EXPORT rt_hw_context_switch
|
|
61 0000000E
|
|
62 0000000E ; set rt_thread_switch_interrupt_flag to 1
|
|
63 0000000E 4A32 LDR r2, =rt_thread_switch_interrupt
|
|
_flag
|
|
64 00000010 6813 LDR r3, [r2]
|
|
65 00000012 2B01 CMP r3, #1
|
|
66 00000014 D004 BEQ _reswitch
|
|
67 00000016 F04F 0301 MOV r3, #1
|
|
68 0000001A 6013 STR r3, [r2]
|
|
69 0000001C
|
|
70 0000001C 4A2F LDR r2, =rt_interrupt_from_thread ;
|
|
set rt_interrupt_f
|
|
rom_thread
|
|
71 0000001E 6010 STR r0, [r2]
|
|
72 00000020
|
|
73 00000020 _reswitch
|
|
74 00000020 4A2F LDR r2, =rt_interrupt_to_thread ; s
|
|
et rt_interrupt_to_
|
|
thread
|
|
75 00000022 6011 STR r1, [r2]
|
|
76 00000024
|
|
77 00000024 482F LDR r0, =NVIC_INT_CTRL ; trigger th
|
|
e PendSV exception
|
|
(causes context swi
|
|
tch)
|
|
78 00000026 F04F 5180 LDR r1, =NVIC_PENDSVSET
|
|
79 0000002A 6001 STR r1, [r0]
|
|
80 0000002C 4770 BX LR
|
|
81 0000002E ENDP
|
|
82 0000002E
|
|
83 0000002E ; r0 --> switch from thread stack
|
|
84 0000002E ; r1 --> switch to thread stack
|
|
85 0000002E ; psr, pc, lr, r12, r3, r2, r1, r0 are pushed into [from
|
|
] stack
|
|
86 0000002E PendSV_Handler
|
|
|
|
|
|
|
|
ARM Macro Assembler Page 3
|
|
|
|
|
|
PROC
|
|
87 0000002E EXPORT PendSV_Handler
|
|
88 0000002E
|
|
89 0000002E ; disable interrupt to protect context switch
|
|
90 0000002E F3EF 8210 MRS r2, PRIMASK
|
|
91 00000032 B672 CPSID I
|
|
92 00000034
|
|
93 00000034 ; get rt_thread_switch_interrupt_flag
|
|
94 00000034 4828 LDR r0, =rt_thread_switch_interrupt
|
|
_flag
|
|
95 00000036 6801 LDR r1, [r0]
|
|
96 00000038 B191 CBZ r1, pendsv_exit ; pendsv alread
|
|
y handled
|
|
97 0000003A
|
|
98 0000003A ; clear rt_thread_switch_interrupt_flag to 0
|
|
99 0000003A F04F 0100 MOV r1, #0x00
|
|
100 0000003E 6001 STR r1, [r0]
|
|
101 00000040
|
|
102 00000040 4826 LDR r0, =rt_interrupt_from_thread
|
|
103 00000042 6801 LDR r1, [r0]
|
|
104 00000044 B129 CBZ r1, switch_to_thread ; skip reg
|
|
ister save at the f
|
|
irst time
|
|
105 00000046
|
|
106 00000046 F3EF 8109 MRS r1, psp ; get from thread s
|
|
tack pointer
|
|
107 0000004A E921 0FF0 STMFD r1!, {r4 - r11} ; push r4 - r11
|
|
register
|
|
108 0000004E 6800 LDR r0, [r0]
|
|
109 00000050 6001 STR r1, [r0] ; update from threa
|
|
d stack pointer
|
|
110 00000052
|
|
111 00000052 switch_to_thread
|
|
112 00000052 4923 LDR r1, =rt_interrupt_to_thread
|
|
113 00000054 6809 LDR r1, [r1]
|
|
114 00000056 6809 LDR r1, [r1] ; load thread stack
|
|
pointer
|
|
115 00000058
|
|
116 00000058 E8B1 0FF0 LDMFD r1!, {r4 - r11} ; pop r4 - r11
|
|
register
|
|
117 0000005C F381 8809 MSR psp, r1 ; update stack poin
|
|
ter
|
|
118 00000060
|
|
119 00000060 pendsv_exit
|
|
120 00000060 ; restore interrupt
|
|
121 00000060 F382 8810 MSR PRIMASK, r2
|
|
122 00000064
|
|
123 00000064 F04E 0E04 ORR lr, lr, #0x04
|
|
124 00000068 4770 BX lr
|
|
125 0000006A ENDP
|
|
126 0000006A
|
|
127 0000006A ;/*
|
|
128 0000006A ; * void rt_hw_context_switch_to(rt_uint32 to);
|
|
129 0000006A ; * r0 --> to
|
|
130 0000006A ; * this fucntion is used to perform the first thread sw
|
|
itch
|
|
131 0000006A ; */
|
|
132 0000006A rt_hw_context_switch_to
|
|
PROC
|
|
|
|
|
|
|
|
ARM Macro Assembler Page 4
|
|
|
|
|
|
133 0000006A EXPORT rt_hw_context_switch_to
|
|
134 0000006A ; set to thread
|
|
135 0000006A 491D LDR r1, =rt_interrupt_to_thread
|
|
136 0000006C 6008 STR r0, [r1]
|
|
137 0000006E
|
|
138 0000006E ; set from thread to 0
|
|
139 0000006E 491B LDR r1, =rt_interrupt_from_thread
|
|
140 00000070 F04F 0000 MOV r0, #0x0
|
|
141 00000074 6008 STR r0, [r1]
|
|
142 00000076
|
|
143 00000076 ; set interrupt flag to 1
|
|
144 00000076 4918 LDR r1, =rt_thread_switch_interrupt
|
|
_flag
|
|
145 00000078 F04F 0001 MOV r0, #1
|
|
146 0000007C 6008 STR r0, [r1]
|
|
147 0000007E
|
|
148 0000007E ; set the PendSV and SysTick exception priority
|
|
149 0000007E 481A LDR r0, =NVIC_SYSPRI2
|
|
150 00000080 491A LDR r1, =NVIC_PENDSV_PRI
|
|
151 00000082 F8D0 2000 LDR.W r2, [r0,#0x00] ; read
|
|
152 00000086 EA41 0102 ORR r1,r1,r2 ; modify
|
|
153 0000008A 6001 STR r1, [r0] ; write-back
|
|
154 0000008C
|
|
155 0000008C ; trigger the PendSV exception (causes context switch)
|
|
156 0000008C 4815 LDR r0, =NVIC_INT_CTRL
|
|
157 0000008E F04F 5180 LDR r1, =NVIC_PENDSVSET
|
|
158 00000092 6001 STR r1, [r0]
|
|
159 00000094
|
|
160 00000094 ; restore MSP
|
|
161 00000094 4816 LDR r0, =SCB_VTOR
|
|
162 00000096 6800 LDR r0, [r0]
|
|
163 00000098 6800 LDR r0, [r0]
|
|
164 0000009A F380 8808 MSR msp, r0
|
|
165 0000009E
|
|
166 0000009E ; enable interrupts at processor level
|
|
167 0000009E B661 CPSIE F
|
|
168 000000A0 B662 CPSIE I
|
|
169 000000A2
|
|
170 000000A2 ; never reach here!
|
|
171 000000A2 ENDP
|
|
172 000000A2
|
|
173 000000A2 ; compatible with old version
|
|
174 000000A2 rt_hw_interrupt_thread_switch
|
|
PROC
|
|
175 000000A2 EXPORT rt_hw_interrupt_thread_switch
|
|
176 000000A2 4770 BX lr
|
|
177 000000A4 ENDP
|
|
178 000000A4
|
|
179 000000A4 IMPORT rt_hw_hard_fault_exception
|
|
180 000000A4 EXPORT HardFault_Handler
|
|
181 000000A4 HardFault_Handler
|
|
PROC
|
|
182 000000A4
|
|
183 000000A4 ; get current context
|
|
184 000000A4 F01E 0F04 TST lr, #0x04 ; if(!EXC_RETURN[2]
|
|
)
|
|
185 000000A8 BF0C ITE EQ
|
|
186 000000AA F3EF 8008 MRSEQ r0, msp ; [2]=0 ==> Z=1, ge
|
|
t fault context fro
|
|
|
|
|
|
|
|
ARM Macro Assembler Page 5
|
|
|
|
|
|
m handler.
|
|
187 000000AE F3EF 8009 MRSNE r0, psp ; [2]=1 ==> Z=0, ge
|
|
t fault context fro
|
|
m thread.
|
|
188 000000B2
|
|
189 000000B2 E920 0FF0 STMFD r0!, {r4 - r11} ; push r4 - r11
|
|
register
|
|
190 000000B6 F840 ED04 STMFD r0!, {lr} ; push exec_return
|
|
register
|
|
191 000000BA
|
|
192 000000BA F01E 0F04 TST lr, #0x04 ; if(!EXC_RETURN[2]
|
|
)
|
|
193 000000BE BF0C ITE EQ
|
|
194 000000C0 F380 8808 MSREQ msp, r0 ; [2]=0 ==> Z=1, up
|
|
date stack pointer
|
|
to MSP.
|
|
195 000000C4 F380 8809 MSRNE psp, r0 ; [2]=1 ==> Z=0, up
|
|
date stack pointer
|
|
to PSP.
|
|
196 000000C8
|
|
197 000000C8 B500 PUSH {lr}
|
|
198 000000CA F7FF FFFE BL rt_hw_hard_fault_exception
|
|
199 000000CE F85D EB04 POP {lr}
|
|
200 000000D2
|
|
201 000000D2 F04E 0E04 ORR lr, lr, #0x04
|
|
202 000000D6 4770 BX lr
|
|
203 000000D8 ENDP
|
|
204 000000D8
|
|
205 000000D8 ALIGN 4
|
|
206 000000D8
|
|
207 000000D8 END
|
|
00000000
|
|
00000000
|
|
00000000
|
|
E000ED04
|
|
E000ED20
|
|
FFFF0000
|
|
E000ED08
|
|
Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
|
|
ork --depend=.\output\context_rvds.d -o.\output\context_rvds.o -IE:\code\rtt\rt
|
|
-thread\bsp\gd32107c-eval\RTE -ID:\Keil_v5\ARM\PACK\GigaDevice\GD32F10x_DFP\2.0
|
|
.1\Device\Include -ID:\Keil_v5\ARM\CMSIS\Include --predefine="__MICROLIB SETA 1
|
|
" --predefine="__UVISION_VERSION SETA 514" --predefine="GD32F10X_CL SETA 1" --p
|
|
redefine="USE_STDPERIPH_DRIVER SETA 1" --list=.\list\context_rvds.lst ..\..\lib
|
|
cpu\arm\cortex-m3\context_rvds.S
|
|
|
|
|
|
|
|
ARM Macro Assembler Page 1 Alphabetic symbol ordering
|
|
Relocatable symbols
|
|
|
|
.text 00000000
|
|
|
|
Symbol: .text
|
|
Definitions
|
|
At line 24 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
None
|
|
Comment: .text unused
|
|
HardFault_Handler 000000A4
|
|
|
|
Symbol: HardFault_Handler
|
|
Definitions
|
|
At line 181 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 180 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: HardFault_Handler used once
|
|
PendSV_Handler 0000002E
|
|
|
|
Symbol: PendSV_Handler
|
|
Definitions
|
|
At line 86 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 87 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: PendSV_Handler used once
|
|
_reswitch 00000020
|
|
|
|
Symbol: _reswitch
|
|
Definitions
|
|
At line 73 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 66 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: _reswitch used once
|
|
pendsv_exit 00000060
|
|
|
|
Symbol: pendsv_exit
|
|
Definitions
|
|
At line 119 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 96 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: pendsv_exit used once
|
|
rt_hw_context_switch 0000000E
|
|
|
|
Symbol: rt_hw_context_switch
|
|
Definitions
|
|
At line 59 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 60 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: rt_hw_context_switch used once
|
|
rt_hw_context_switch_interrupt 0000000E
|
|
|
|
Symbol: rt_hw_context_switch_interrupt
|
|
Definitions
|
|
At line 57 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 58 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: rt_hw_context_switch_interrupt used once
|
|
rt_hw_context_switch_to 0000006A
|
|
|
|
Symbol: rt_hw_context_switch_to
|
|
|
|
|
|
|
|
ARM Macro Assembler Page 2 Alphabetic symbol ordering
|
|
Relocatable symbols
|
|
|
|
Definitions
|
|
At line 132 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 133 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: rt_hw_context_switch_to used once
|
|
rt_hw_interrupt_disable 00000000
|
|
|
|
Symbol: rt_hw_interrupt_disable
|
|
Definitions
|
|
At line 36 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 37 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: rt_hw_interrupt_disable used once
|
|
rt_hw_interrupt_enable 00000008
|
|
|
|
Symbol: rt_hw_interrupt_enable
|
|
Definitions
|
|
At line 46 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 47 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: rt_hw_interrupt_enable used once
|
|
rt_hw_interrupt_thread_switch 000000A2
|
|
|
|
Symbol: rt_hw_interrupt_thread_switch
|
|
Definitions
|
|
At line 174 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 175 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: rt_hw_interrupt_thread_switch used once
|
|
switch_to_thread 00000052
|
|
|
|
Symbol: switch_to_thread
|
|
Definitions
|
|
At line 111 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 104 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: switch_to_thread used once
|
|
12 symbols
|
|
|
|
|
|
|
|
ARM Macro Assembler Page 1 Alphabetic symbol ordering
|
|
Absolute symbols
|
|
|
|
NVIC_INT_CTRL E000ED04
|
|
|
|
Symbol: NVIC_INT_CTRL
|
|
Definitions
|
|
At line 19 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 77 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
At line 156 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
|
|
NVIC_PENDSVSET 10000000
|
|
|
|
Symbol: NVIC_PENDSVSET
|
|
Definitions
|
|
At line 22 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 78 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
At line 157 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
|
|
NVIC_PENDSV_PRI FFFF0000
|
|
|
|
Symbol: NVIC_PENDSV_PRI
|
|
Definitions
|
|
At line 21 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 150 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: NVIC_PENDSV_PRI used once
|
|
NVIC_SYSPRI2 E000ED20
|
|
|
|
Symbol: NVIC_SYSPRI2
|
|
Definitions
|
|
At line 20 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 149 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: NVIC_SYSPRI2 used once
|
|
SCB_VTOR E000ED08
|
|
|
|
Symbol: SCB_VTOR
|
|
Definitions
|
|
At line 18 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 161 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: SCB_VTOR used once
|
|
5 symbols
|
|
|
|
|
|
|
|
ARM Macro Assembler Page 1 Alphabetic symbol ordering
|
|
External symbols
|
|
|
|
rt_hw_hard_fault_exception 00000000
|
|
|
|
Symbol: rt_hw_hard_fault_exception
|
|
Definitions
|
|
At line 179 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 198 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Comment: rt_hw_hard_fault_exception used once
|
|
rt_interrupt_from_thread 00000000
|
|
|
|
Symbol: rt_interrupt_from_thread
|
|
Definitions
|
|
At line 30 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 70 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
At line 102 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
At line 139 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
|
|
rt_interrupt_to_thread 00000000
|
|
|
|
Symbol: rt_interrupt_to_thread
|
|
Definitions
|
|
At line 31 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 74 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
At line 112 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
At line 135 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
|
|
rt_thread_switch_interrupt_flag 00000000
|
|
|
|
Symbol: rt_thread_switch_interrupt_flag
|
|
Definitions
|
|
At line 29 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
Uses
|
|
At line 63 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
At line 94 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
At line 144 in file ..\..\libcpu\arm\cortex-m3\context_rvds.S
|
|
|
|
4 symbols
|
|
357 symbols in table
|