📄 off
字号:
ARM Macro Assembler Page 1
1 00000000 ;/******************************************************
***********************/
2 00000000 ;/* IRQ_HANDLER: Philips LPC214x家族微控制器中断文件
*/
3 00000000 ;/* 作者:焦进星
*/
4 00000000 ;/* 时间:2008年月1月22日
*/
5 00000000 ;/* ARM初学
*/
6 00000000 ;/******************************************************
***********************/
7 00000000
8 00000000
9 00000000
10 00000000
11 00000000 INCLUDE IRQ.inc ;/* 首先包含IRQ.inc */
1 00000000
2 00000000
3 00000000
4 00000000
5 00000000 00000010
ARM_MODE_USER
EQU 0x10
6 00000000 00000011
ARM_MODE_FIQ
EQU 0x11
7 00000000 00000012
ARM_MODE_IRQ
EQU 0x12
8 00000000 00000013
ARM_MODE_SVC
EQU 0x13
9 00000000 00000017
ARM_MODE_ABORT
EQU 0x17
10 00000000 0000001B
ARM_MODE_UNDEF
EQU 0x1B
11 00000000 0000001F
ARM_MODE_SYS
EQU 0x1F
12 00000000
13 00000000 00000080
I_BIT EQU 0x80
14 00000000 00000040
F_BIT EQU 0x40
15 00000000 00000020
T_BIT EQU 0x20
16 00000000
17 00000000 ;External references
18 00000000 EXTERN OSPrioCur
19 00000000 EXTERN OSPrioHighRdy
20 00000000 EXTERN OSIntNesting
21 00000000 EXTERN OSIntExit
22 00000000 EXTERN OSIntCtxSw
23 00000000
24 00000000 MACRO
25 00000000 $IRQ_Label
ARM Macro Assembler Page 2
HANDLER $IRQ_Exception_Function
26 00000000
27 00000000 EXPORT $IRQ_Label ; 输出的标号
28 00000000 IMPORT $IRQ_Exception_Function ; 引用的外部标号
29 00000000
30 00000000 $IRQ_Label
31 00000000
32 00000000 SUB LR, LR, #4 ;- Adjust and save LR_irq in
IRQ stack
33 00000000
34 00000000 STMFD SP!, {R0-R3, R11, R12, LR} ;- Save scrat
ch/used registers and LR in
IRQ Stack
35 00000000 ;- #Save R11 only for the register 'LR_svc'
36 00000000
37 00000000 MRS R14, SPSR ;- Save SPSR need to be save
d for nested interrupt
38 00000000 STMFD SP!, {R14}
39 00000000
40 00000000 LDR R11, =OSIntNesting ; OSIntNesting++;
41 00000000 LDRB R12, [R11]
42 00000000 ADD R12, R12,#1
43 00000000 STRB R12, [R11]
44 00000000
45 00000000 MSR CPSR_c, #ARM_MODE_SVC ; - Enable Interru
pt and Switch to SVC mode
46 00000000 MOV R11, LR ; R11<-LR_svc
47 00000000
48 00000000 BL $IRQ_Exception_Function
; 调用c语言的中断处理程序
49 00000000
50 00000000 MOV LR, R11 ;- Restore LR_svc
51 00000000 MSR CPSR_c, #(I_BIT | F_BIT | ARM_MODE_IRQ)
;- Disable Interrupt and Swi
tch back in IRQ mode
52 00000000
53 00000000 BL OSIntExit ; OSIntExit() <not call OSIn
tCtxSw()>
54 00000000
55 00000000 LDR R0, =OSPrioCur ; if (OSPrioCur != OSPrio
HighRdy)
56 00000000 LDR R1, =OSPrioHighRdy
57 00000000 LDRB R0, [R0]
58 00000000 LDRB R1, [R1]
59 00000000 CMP R0, R1
60 00000000 BNE OSIntCtxSw ; Do OSIntCtxSw()
61 00000000
62 00000000 LDMFD SP!, {R14} ;- Restore SPSR_irq from IRQ
stack
63 00000000 MSR SPSR_cxsf, R14
64 00000000
65 00000000 LDMFD SP!, {R0-R3, R11, R12, PC}^ ;- Restore a
djusted LR_irq from IRQ stac
k directly in the PC
66 00000000
67 00000000 MEND
68 00000000
69 00000000 END
ARM Macro Assembler Page 3
12 00000000
13 00000000 PRESERVE8
14 00000000 CODE32
15 00000000 ;//段名 代码 只读
16 00000000 AREA IRQ_HANDLER,CODE,READONLY
17 00000000
18 00000000 ;/* 以下添加中断句柄,用户根据实际情况改变 */
19 00000000 Timer0Handler
HANDLER Timer0_Exception
26 00000000
27 00000000 EXPORT Timer0Handler ; 输出的标号
28 00000000 IMPORT Timer0_Exception ; 引用的外部标号
29 00000000
30 00000000 Timer0Handler
31 00000000
32 00000000 E24EE004 SUB LR, LR, #4 ;- Adjust and save LR_irq in
IRQ stack
33 00000004
34 00000004 E92D580F STMFD SP!, {R0-R3, R11, R12, LR} ;- Save scrat
ch/used registers and LR in
IRQ Stack
35 00000008 ;- #Save R11 only for the register 'LR_svc'
36 00000008
37 00000008 E14FE000 MRS R14, SPSR ;- Save SPSR need to be save
d for nested interrupt
38 0000000C E92D4000 STMFD SP!, {R14}
39 00000010
40 00000010 E59FB1B4 LDR R11, =OSIntNesting ; OSIntNesting++;
41 00000014 E5DBC000 LDRB R12, [R11]
42 00000018 E28CC001 ADD R12, R12,#1
43 0000001C E5CBC000 STRB R12, [R11]
44 00000020
45 00000020 E321F013 MSR CPSR_c, #ARM_MODE_SVC ; - Enable Interru
pt and Switch to SVC mode
46 00000024 E1A0B00E MOV R11, LR ; R11<-LR_svc
47 00000028
48 00000028 EBFFFFFE BL Timer0_Exception
; 调用c语言的中断处理程序
49 0000002C
50 0000002C E1A0E00B MOV LR, R11 ;- Restore LR_svc
51 00000030 E321F0D2 MSR CPSR_c, #(I_BIT | F_BIT | ARM_MODE_IRQ)
;- Disable Interrupt and Swi
tch back in IRQ mode
52 00000034
53 00000034 EBFFFFFE BL OSIntExit ; OSIntExit() <not call OSIn
tCtxSw()>
54 00000038
55 00000038 E59F0190 LDR R0, =OSPrioCur ; if (OSPrioCur != OSPrio
HighRdy)
56 0000003C E59F1190 LDR R1, =OSPrioHighRdy
57 00000040 E5D00000 LDRB R0, [R0]
58 00000044 E5D11000 LDRB R1, [R1]
59 00000048 E1500001 CMP R0, R1
60 0000004C 1AFFFFFE BNE OSIntCtxSw ; Do OSIntCtxSw()
61 00000050
62 00000050 E8BD4000 LDMFD SP!, {R14} ;- Restore SPSR_irq from IRQ
stack
63 00000054 E16FF00E MSR SPSR_cxsf, R14
64 00000058
ARM Macro Assembler Page 4
65 00000058 E8FD980F LDMFD SP!, {R0-R3, R11, R12, PC}^ ;- Restore a
djusted LR_irq from IRQ stac
k directly in the PC
66 0000005C
20 0000005C
21 0000005C FIQHandler
HANDLER FIQ_Exception
26 0000005C
27 0000005C EXPORT FIQHandler ; 输出的标号
28 0000005C IMPORT FIQ_Exception ; 引用的外部标号
29 0000005C
30 0000005C FIQHandler
31 0000005C
32 0000005C E24EE004 SUB LR, LR, #4 ;- Adjust and save LR_irq in
IRQ stack
33 00000060
34 00000060 E92D580F STMFD SP!, {R0-R3, R11, R12, LR} ;- Save scrat
ch/used registers and LR in
IRQ Stack
35 00000064 ;- #Save R11 only for the register 'LR_svc'
36 00000064
37 00000064 E14FE000 MRS R14, SPSR ;- Save SPSR need to be save
d for nested interrupt
38 00000068 E92D4000 STMFD SP!, {R14}
39 0000006C
40 0000006C E59FB158 LDR R11, =OSIntNesting ; OSIntNesting++;
41 00000070 E5DBC000 LDRB R12, [R11]
42 00000074 E28CC001 ADD R12, R12,#1
43 00000078 E5CBC000 STRB R12, [R11]
44 0000007C
45 0000007C E321F013 MSR CPSR_c, #ARM_MODE_SVC ; - Enable Interru
pt and Switch to SVC mode
46 00000080 E1A0B00E MOV R11, LR ; R11<-LR_svc
47 00000084
48 00000084 EBFFFFFE BL FIQ_Exception ; 调用c语言的中断处理程序
49 00000088
50 00000088 E1A0E00B MOV LR, R11 ;- Restore LR_svc
51 0000008C E321F0D2 MSR CPSR_c, #(I_BIT | F_BIT | ARM_MODE_IRQ)
;- Disable Interrupt and Swi
tch back in IRQ mode
52 00000090
53 00000090 EBFFFFFE BL OSIntExit ; OSIntExit() <not call OSIn
tCtxSw()>
54 00000094
55 00000094 E59F0134 LDR R0, =OSPrioCur ; if (OSPrioCur != OSPrio
HighRdy)
56 00000098 E59F1134 LDR R1, =OSPrioHighRdy
57 0000009C E5D00000 LDRB R0, [R0]
58 000000A0 E5D11000 LDRB R1, [R1]
59 000000A4 E1500001 CMP R0, R1
60 000000A8 1AFFFFFE BNE OSIntCtxSw ; Do OSIntCtxSw()
61 000000AC
62 000000AC E8BD4000 LDMFD SP!, {R14} ;- Restore SPSR_irq from IRQ
stack
63 000000B0 E16FF00E MSR SPSR_cxsf, R14
64 000000B4
65 000000B4 E8FD980F LDMFD SP!, {R0-R3, R11, R12, PC}^ ;- Restore a
djusted LR_irq from IRQ stac
k directly in the PC
ARM Macro Assembler Page 5
66 000000B8
22 000000B8
23 000000B8 DefaultVICHandler
HANDLER DefaultVIC_Exception
26 000000B8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -