S3c2410裸板程序入门单按键(一)

有点入门了,好吧,开始学点稍微复杂的,写一个单按键的程序。

有人可能会笑,这个复杂?的确,只有一个按键是比较简单的,关键是我们要通过这个按键引出中断处理的部分,这个就比较核心了。中断是学习某个CPU最重要的部分之一。

这次我们将使用realview提供的初始化文件,学会自己配置(以后还有自己写呢)。然后完成一次按键触发一次中断处理函数的功能。怎么判断有没有触发中断呢?我们不是写了串口的程序吗,中断一次由串口向PC机发送个数据好了。

1 配置(s3c2410a.s 对应的configuration):

等会儿截几个图吧,现在手头没有截图工具。

2 s3c2410a.s 的几个片段,着重关注中断部分。

159IntVT_SETUP
EQU
1
160IntVTAddress
EQU
0x33FFFF20

...........

795
AREA
RESET
,
CODE
,
READONLY
796
ARM
799; Exception Vectors
800;  Mapped to Address 0.
801;  Absolute addressing mode must be used.
802;  Dummy Handlers are implemented as infinite loops which can be modified.
803
804Vectors
LDR
PC
,
Reset_Addr
805
LDR
PC
,
Undef_Addr
806
LDR
PC
,
SWI_Addr
807
LDR
PC
,
PAbt_Addr
808
LDR
PC
,
DAbt_Addr
809
NOP
; Reserved Vector
810
LDR
PC
,
IRQ_Addr
811
LDR
PC
,
FIQ_Addr
813
814
IF
IntVT_SETUP
<>
0
816;Interrupt Vector Table Address
817HandleEINT0
EQU
IntVTAddress
818HandleEINT1
EQU
IntVTAddress
+
4
819HandleEINT2
EQU
IntVTAddress
+
4
*
2
820HandleEINT3
EQU
IntVTAddress
+
4
*
3
821HandleEINT4_7
EQU
IntVTAddress
+
4
*
4
822HandleEINT8_23
EQU
IntVTAddress
+
4
*
5
823HandleReserved
EQU
IntVTAddress
+
4
*
6

850IRQ_Entry
851
sub
sp
,
sp
,
#4       ;reserved for PC
852
stmfd
sp!,{r8-r9} ;备份r8 r9
853
854
ldr
r9
,=
INTOFFSET ;取的中断偏移
855
ldr
r9
,[
r9
]
856
ldr
r8
,=
HandleEINT0 ;得到中断处理函数地址的基地址
857
add
r8
,
r8
,
r9
,
lsl
#2 ;根据基地址和偏移得到实际中断处理函数地址
858
ldr
r8
,[
r8
]
859
str
r8
,[
sp
,
#8]
860
ldmfd
sp!,{r8-r9,pc} ;修改pc指针,跳转到二级中断处理函数处
861
862
ENDIF
863
864Reset_Addr
DCD
Reset_Handler
865Undef_Addr
DCD
Undef_Handler
866SWI_Addr
DCD
SWI_Handler
867PAbt_Addr
DCD
PAbt_Handler
868DAbt_Addr
DCD
DAbt_Handler
869
DCD
0
; Reserved Address
870IRQ_Addr
DCD
IRQ_Handler
871FIQ_Addr
DCD
FIQ_Handler
872
873Undef_Handler
B
Undef_Handler
874SWI_Handler
B
SWI_Handler
875PAbt_Handler
B
PAbt_Handler
876DAbt_Handler
B
DAbt_Handler
877
878
IF
IntVT_SETUP
<>
1
879IRQ_Handler
B
IRQ_Handler
880
ENDIF
881
882
IF
IntVT_SETUP
<>
0
883IRQ_Handler
B
IRQ_Entry
884
ENDIF
885
886FIQ_Handler
B
FIQ_Handler

可见触发irq中断时,cpu自动把cpsr保存到spsr,把pc指针置为0x18。经过LDR PC,IRQ_AddrIRQ_Handler B IRQ_Entry,两次跳转,最终跳到了IRQ_ENTRY, 这其实就是一级中断处理函数,一级中断处理函数的作用就是根据中断偏移寄存器查的其处理函数的地址,请看代码中的注释。

因为用html粘贴的代码,所以提示我文章过长,只有另开一文喽。


原文地址:https://www.cnblogs.com/liujiahi/p/2196353.html