📄 off
字号:
ARM Macro Assembler Page 1
1 00000000 ;/****************************************Copyright (c)*
*************************************************
2 00000000 ;** Guangzou ZLG-MCU Devel
opment Co.,LTD.
3 00000000 ;** graduate school
4 00000000 ;** http://www.zlgmcu.co
m
5 00000000 ;**
6 00000000 ;**--------------File Info------------------------------
-------------------------------------------------
7 00000000 ;** File Name: IRQ.s
8 00000000 ;** Last modified Date: 2004-06-14
9 00000000 ;** Last Version: 1.1
10 00000000 ;** Descriptions: The irq handle that what allow the int
errupt nesting.
11 00000000 ;**
12 00000000 ;**-----------------------------------------------------
-------------------------------------------------
13 00000000 ;** Created By: Chenmingji
14 00000000 ;** Created date: 2004-09-17
15 00000000 ;** Version: 1.0
16 00000000 ;** Descriptions: First version
17 00000000 ;**
18 00000000 ;**-----------------------------------------------------
-------------------------------------------------
19 00000000 ;** Modified by:
20 00000000 ;** Modified date:
21 00000000 ;** Version:
22 00000000 ;** Descriptions:
23 00000000 ;**
24 00000000 ;*******************************************************
*************************************************/
25 00000000
26 00000000
27 00000000 INCLUDE ..\..\arm\irq.inc ; Inport the head file
引入头文件
1 00000000 ;/****************************************Copyright (c)*
*************************************************
2 00000000 ;** 广州周立功单片机发展有
限公司
3 00000000 ;** 研 究 所
4 00000000 ;** 产品一部
5 00000000 ;**
6 00000000 ;** http://www.zlgmcu.co
m
7 00000000 ;**
8 00000000 ;**--------------文件信息-------------------------------
-------------------------------------------------
9 00000000 ;**文 件 名: IRQ.inc
10 00000000 ;**创 建 人: 陈明计
11 00000000 ;**最后修改日期: 2004年8月27日
12 00000000 ;**描 述: 定义IRQ汇编接口代码宏
13 00000000 ;**
14 00000000 ;**--------------历史版本信息---------------------------
-------------------------------------------------
15 00000000 ;** 创建人: 陈明计
16 00000000 ;** 版 本: v1.0
17 00000000 ;** 日 期: 2004年8月27日
ARM Macro Assembler Page 2
18 00000000 ;** 描 述: 原始版本
19 00000000 ;**
20 00000000 ;**--------------当前版本修订---------------------------
---------------------------------------------------
21 00000000 ;** 修改人:
22 00000000 ;** 日 期:
23 00000000 ;** 描 述:
24 00000000 ;**
25 00000000 ;**-----------------------------------------------------
-------------------------------------------------
26 00000000 ;*******************************************************
*************************************************/
27 00000000
28 00000000 00000080
NoInt EQU 0x80
29 00000000
30 00000000 00000010
USR32Mode
EQU 0x10
31 00000000 00000013
SVC32Mode
EQU 0x13
32 00000000 0000001F
SYS32Mode
EQU 0x1f
33 00000000 00000012
IRQ32Mode
EQU 0x12
34 00000000 00000011
FIQ32Mode
EQU 0x11
35 00000000
36 00000000
37 00000000 ;引入的外部标号在这声明
38 00000000 IMPORT OSIntCtxSw ;任务切换函数
39 00000000 IMPORT OSIntExit ;中断退出函数
40 00000000 IMPORT OSTCBCur
41 00000000 IMPORT OSTCBHighRdy
42 00000000 IMPORT OSIntNesting ;中断嵌套计数器
43 00000000 IMPORT StackUsr
44 00000000 IMPORT OsEnterSum
45 00000000
46 00000000 CODE32
47 00000000
48 00000000 AREA IRQ,CODE,READONLY
49 00000000
50 00000000 MACRO
51 00000000 $IRQ_Label
HANDLER $IRQ_Exception_Function
52 00000000
53 00000000 EXPORT $IRQ_Label ; 输出的标号
54 00000000 IMPORT $IRQ_Exception_Function ; 引用的外部标号
55 00000000
56 00000000 $IRQ_Label
57 00000000 SUB LR, LR, #4 ; 计算返回地址
58 00000000 STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
59 00000000 MRS R3, SPSR ; 保存状态
60 00000000 STMFD SP, {R3, SP, LR}^ ; 保存用户状态的R3,SP,
ARM Macro Assembler Page 3
LR,注意不能回写
61 00000000 ; 如果回写的是用户的SP,所以后面要调整SP
62 00000000 LDR R2, =OSIntNesting ; OSIntNesting++
63 00000000 LDRB R1, [R2]
64 00000000 ADD R1, R1, #1
65 00000000 STRB R1, [R2]
66 00000000
67 00000000 SUB SP, SP, #4*3
68 00000000
69 00000000 MSR CPSR_c, #(NoInt | SYS32Mode)
; 切换到系统模式
70 00000000 CMP R1, #1
71 00000000 LDREQ SP, =StackUsr
72 00000000
73 00000000 BL $IRQ_Exception_Function
; 调用c语言的中断处理程序
74 00000000
75 00000000 MSR CPSR_c, #(NoInt | SYS32Mode)
; 切换到系统模式
76 00000000 LDR R2, =OsEnterSum ; OsEnterSum,使OSIntExit
退出时中断关闭
77 00000000 MOV R1, #1
78 00000000 STR R1, [R2]
79 00000000
80 00000000 BL OSIntExit
81 00000000
82 00000000 LDR R2, =OsEnterSum ; 因为中断服务程序要退出
,所以OsEnterSum=0
83 00000000 MOV R1, #0
84 00000000 STR R1, [R2]
85 00000000
86 00000000 MSR CPSR_c, #(NoInt | IRQ32Mode)
; 切换回irq模式
87 00000000 LDMFD SP, {R3, SP, LR}^ ; 恢复用户状态的R3,SP,
LR,注意不能回写
88 00000000 ; 如果回写的是用户的SP,所以后面要调整SP
89 00000000 LDR R0, =OSTCBHighRdy
90 00000000 LDR R0, [R0]
91 00000000 LDR R1, =OSTCBCur
92 00000000 LDR R1, [R1]
93 00000000 CMP R0, R1
94 00000000
95 00000000 ADD SP, SP, #4*3 ;
96 00000000 MSR SPSR_cxsf, R3
97 00000000 LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换
98 00000000 LDR PC, =OSIntCtxSw ; 进行任务切换
99 00000000 MEND
100 00000000
101 00000000 END
28 00000000
29 00000000 CODE32
30 00000000
31 00000000 AREA IRQ,CODE,READONLY
32 00000000
33 00000000
34 00000000 ;/* 以下添加中断句柄,用户根据实际情况改变 */
35 00000000 ;/* Add interrupt handler here,user could change it as
needed */
36 00000000
ARM Macro Assembler Page 4
37 00000000 ;/*中断*/
38 00000000 ;/*Interrupt*/
39 00000000 IRQ_Handler
HANDLER IRQ_Exception
52 00000000
53 00000000 EXPORT IRQ_Handler ; 输出的标号
54 00000000 IMPORT IRQ_Exception ; 引用的外部标号
55 00000000
56 00000000 IRQ_Handler
57 00000000 E24EE004 SUB LR, LR, #4 ; 计算返回地址
58 00000004 E92D500F STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
59 00000008 E14F3000 MRS R3, SPSR ; 保存状态
60 0000000C E94D6008 STMFD SP, {R3, SP, LR}^ ; 保存用户状态的R3,SP,
LR,注意不能回写
61 00000010 ; 如果回写的是用户的SP,所以后面要调整SP
62 00000010 E59F20E8 LDR R2, =OSIntNesting ; OSIntNesting++
63 00000014 E5D21000 LDRB R1, [R2]
64 00000018 E2811001 ADD R1, R1, #1
65 0000001C E5C21000 STRB R1, [R2]
66 00000020
67 00000020 E24DD00C SUB SP, SP, #4*3
68 00000024
69 00000024 E321F09F MSR CPSR_c, #(NoInt | SYS32Mode)
; 切换到系统模式
70 00000028 E3510001 CMP R1, #1
71 0000002C 059FD0D0 LDREQ SP, =StackUsr
72 00000030
73 00000030 EBFFFFFE BL IRQ_Exception ; 调用c语言的中断处理程序
74 00000034
75 00000034 E321F09F MSR CPSR_c, #(NoInt | SYS32Mode)
; 切换到系统模式
76 00000038 E59F20C8 LDR R2, =OsEnterSum ; OsEnterSum,使OSIntExit
退出时中断关闭
77 0000003C E3A01001 MOV R1, #1
78 00000040 E5821000 STR R1, [R2]
79 00000044
80 00000044 EBFFFFFE BL OSIntExit
81 00000048
82 00000048 E59F20B8 LDR R2, =OsEnterSum ; 因为中断服务程序要退出
,所以OsEnterSum=0
83 0000004C E3A01000 MOV R1, #0
84 00000050 E5821000 STR R1, [R2]
85 00000054
86 00000054 E321F092 MSR CPSR_c, #(NoInt | IRQ32Mode)
; 切换回irq模式
87 00000058 E8DD6008 LDMFD SP, {R3, SP, LR}^ ; 恢复用户状态的R3,SP,
LR,注意不能回写
88 0000005C ; 如果回写的是用户的SP,所以后面要调整SP
89 0000005C E59F00A8 LDR R0, =OSTCBHighRdy
90 00000060 E5900000 LDR R0, [R0]
91 00000064 E59F10A4 LDR R1, =OSTCBCur
92 00000068 E5911000 LDR R1, [R1]
93 0000006C E1500001 CMP R0, R1
94 00000070
95 00000070 E28DD00C ADD SP, SP, #4*3 ;
96 00000074 E16FF003 MSR SPSR_cxsf, R3
97 00000078 08FD900F LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换
98 0000007C E59FF090 LDR PC, =OSIntCtxSw ; 进行任务切换
40 00000080
ARM Macro Assembler Page 5
41 00000080
42 00000080 ;/*定时器0中断*/
43 00000080 ;/*Time0 Interrupt*/
44 00000080 Timer0_Handler
HANDLER Timer0_Exception
52 00000080
53 00000080 EXPORT Timer0_Handler ; 输出的标号
54 00000080 IMPORT Timer0_Exception ; 引用的外部标号
55 00000080
56 00000080 Timer0_Handler
57 00000080 E24EE004 SUB LR, LR, #4 ; 计算返回地址
58 00000084 E92D500F STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
59 00000088 E14F3000 MRS R3, SPSR ; 保存状态
60 0000008C E94D6008 STMFD SP, {R3, SP, LR}^ ; 保存用户状态的R3,SP,
LR,注意不能回写
61 00000090 ; 如果回写的是用户的SP,所以后面要调整SP
62 00000090 E59F2068 LDR R2, =OSIntNesting ; OSIntNesting++
63 00000094 E5D21000 LDRB R1, [R2]
64 00000098 E2811001 ADD R1, R1, #1
65 0000009C E5C21000 STRB R1, [R2]
66 000000A0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -