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/archive/2011/09/11/2196353.html

本书面向由传统51片机转向ARM嵌入式开发的硬件工程师、由硬件转嵌入式软件开发的工程师、没有嵌入式开发经验的软件工程师。分9个部分: 1、开发环境建立 2、S3C2410功能部件介绍与实验(含实验代码) 3、bootloader vivi详细注释 4、linux移植 5、linux驱动 6、yaffs文件系统详解 7、调试工具 8、GUI开发简介 9、UC/OS移植 通过学习第二部分,即可了解基于ARM CPU的嵌入式开发所需要的外围器件及其接口。对应的实验代码实现了对这些接口的操作,这可以让硬件工程师形成一个嵌入式硬件开发的概念。这部分也可以当作S3C2410的数据手册来使用。 一个完整的嵌入式linux系统包含4部分内容:bootloader、parameters、kernel、root file system。3、4、5、6部分详细介绍了这4部分的内容,这是linux底层软件开发人员应该掌握的。通过学习这些章节,您可以详细了解到如何在一个裸板上裁减、移植linux,如何构造自己的根文件系统,如何编写适合客户需求的驱动程序——驱动程序这章将结合几个经典的驱动程序进行讲解。您还可以了解到在用在nand flash上的非常流行的yaffs文件系统是如何工作的,本书将结合yaffs代码详细介绍yaffs文件系统。 第7部分介绍了嵌入式linux开发中使用gdb进行调试的详细过程。 此文档目前完成了1、2、3部分,后面部分将陆续完成。希望能对各位在嵌入式开发方面献上棉力。 欢迎来信指出文中的不足与错误,欢迎来信探讨技术问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值