- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验四 中断实验
一、实验目的
1、了解中断的作用;
2、掌握嵌入式系统中断的处理流程;
3、掌握ARM中断编程。
二、实验内容
1、编写中断处理程序,处理外部中断;
2、实验各种外部中断触发方式。
三、实验设备
1、硬件:
DM2410实验板;
测控与显示扩展板;
PC机;
JTAG仿真器;
2、软件:
PC机操作系统(WINDOWS 2000);
ARM Developer Suite v1.2;
Multi-ICE V2.2.5(Build1319);
四、基础知识
1、了解ADS集成开发环境的基本功能;
2、了解I/O口的设置相关知识。
3、了解中断的作用以及基本处理过程;
(三)实验说明:
S3C2410处理器的中断处理与其他CPU的处理模式基本上是一致的,只是由于它引入了几种不同的处理器模式,使中断处理变得更加容易。其典型的步骤如下:
1)保存现场:当系统出现中断时,处理器首先要做的就是保存现场,这一过程包括:保存当前的PC值到lr中,保存当前的程序运行状态到spsr中。值得注意的就是由于ARM采用三级流水线结构,当时的PC值实际上等于当前指令地址加上8(ARM指令时),所以返回时还需将保存的PC值减4;
2)模式切换:当处理器完成现场保护后,就进入中断模式,并将PC值置为一个固定的值0这就是IRQ模式的中断入口地址。在中断模式下,有2个独立的寄存器R13、R14,这样可以便于中断程序使用自己特有的堆栈。但这样随之而来产生了一个问题,也就是堆栈溢出保护的问题,需要我们认真的估计堆栈的大小,同时在中断处理时也要尽量减少函数调用的层次,否则将产生一些不可预知的错误;
3)获取中断源:所有的IRQ中断都从0始执行,通常在该地址处放一条跳转指令,进一步跳到我们的中断程序中;
4)处理中断:在中断程序中需要进一步获取中断源,即谁引发了该中断,然后通过查表获取相应中断的程序入口,并调用对应的函数;
5)中断返回,保护现场:在返回时需要恢复处理器模式,包括恢复中断处理用到的所有寄存器、恢复被中断的程序运行状态到CPSR,并跳转到被中断的主程序。
中断的入口代码(汇编代码):
……
b HandlerIRQ
HandlerIQR
sub sp,sp,#4 ; 为中断分发例程入口地址预留堆栈空间
stmfd sp!,{r0} ; 保存r0
sdr r0,=HandleIRQ ; 将中断分发例程入口地址指针保存到r0中
sdr r0,[r0] ; 将中断分发例程入口地址保存到r0中
str r0,[sp,#4] ; 将中断分发例程入口地址保存到预留的堆栈空间
ldmfd sp!,{r0,pc} ; 将r0和中断分发例程入口地址出栈,也实现了一个跳转
上述代码实现了从FLASH中跳到了RAM的中断入口,然后有从中断入口跳到中断分发例程入口。因此,必须在HandleIRQ地址处保存正确的分发例程入口地址,使用如下代码后,
IsrIRQ就是中断分发例程:
……
; Setup IRQ handler
ldr r0,=HandleIRQ ;This routine is needed
ldr r1,=IsrIRQ ;if there isnt subs pc,lr,#4 at 0x18, 0x1c
str r1,[r0]
IsrIRQ采用汇编语言编写,通过读取INTOFFSET寄存器获取产生中断的中断源的偏移,然后根据该偏移值获取该中断对应与中断向量表中的偏移,最后从中断向量表中获取中断服务函数入口地址,再跳转到该地址处执行,代码如下:
……
IsrIRQ
sub sp,sp,#4 ; reserved for PC
stmfd sp!,{r8-r9}
ldr r9,=INTOFFSET ; 将中断偏移寄存器地址送到r9中
ldr r9,[r9] ; 将INTOFFSET寄存器的值送到r9
ldr r8,=HandleEINT0 ; Load the ISR vector base address to r8
add r8,r8,r9,lsl #2 ; get the ISR vector r8=r8+r9*4
ldr r8,[r8] ; Load the ISR address
str r8,[sp,#8]
文档评论(0)