原创 LPC中的中断处理小结(转)

2008-12-16 00:02 2986 8 9 分类: MCU/ 嵌入式

LPC中的中断处理小结


近来在LPC的中断过程上看了点文献,作为一个初学者感觉这个内容与其它的处理器还是有很大的区别,比如说三星的S3C4510B,两者在中断的处理上理念是完全不同的,个人感觉LPC的要难一些,很多地方感觉上是在和ARM的规范打擦边球,下面具体说一下相关内容。


基础知识:LPC2294EXT中断分为了三类,包括FIQVectored IRQnon-- Vectored IRQ,其中,以FIQ的优先级最高,而以non-- Vectored IRQ的优先级最低,系统一共提供了27个中断源,并且给这27个中断源进行了固定的编号,但是注意,这个编号和优先级没有任何的关系,并非是编号在前面的优先级就越高,见下面说明。


关键内容:两套控制渠道


第一套:在ARM体系中,本来有SWIFIQIRQ等这些中断的定义,并且已经定义了这些中断的开关控制位,就是在CPSR寄存器中,该寄存器包含了一个I位和一个F位,I位用于控制IRQ中断的开关,F用于控制FIQ的开关,但是值得注意的是CPSR的读取和修改在用户模式下是不能完成的,必须要通过SWI指令进入到特权模式下才可以进行修改。


第二套:在LPCSFR(特殊功能寄存器)中,也提供了一套寄存器用于控制相应的中断的进行,这组控制器叫做VIC寄存器(都以VIC开头),改组寄存器包括了所有的与中断有关的设置,开启,分类等功能,仅仅是将外部中断引脚对应的部分功能分离出去,由EXT系列的寄存器来处理,因此,对这一个系列的寄存器的掌握是非常重要的!


两者间的关系:仅仅在第二套控制渠道下打开FIQIRQ中断是不够的,如果ARM内核没有开中断的话,整个系统就不会有中断产生,因此,常见的做法是这样:先将第二套渠道的控制内容处理好,然后通过SWI软件中断指令,将ARM处理器的模式切换为特权模式,在特权模式下,对CPSR进行“读出-修改-写回”的操作,将中断打开,然后在返回到用户模式。


LPC的中断的特殊性:FIQ的中断和普通的ARM规定是没有任何区别的,即是在产生中断时,指令跳转到0x0000001C处开始执行,这个是没有什么疑问的。但是IRQ的响应过程就不同了,先看下面一段代码,这个是写在程序的头部的部分字节:


Reset


        LDR     PC, ResetAddr       ;// 0x00000000Reset                                --->Supervisor Mode


        LDR     PC, Und_Addr        ;// 0x00000004Undefined Instruction      --->Undefined Mode


        LDR     PC, SWI_Addr        ;// 0x00000008Software Interrupt          --->Supervisor Mode


        LDR     PC, PAbort_Addr     ;// 0x0000000cAbort(Prefetch)                --->Abort Mode


        LDR     PC, DAbort_Addr     ;// 0x00000010Abort(Data)                           --->Abort Mode


        DCD            0xB9205F80      ;// 0x00000014Reserved                             --->


        LDR     PC, [PC,#-0xFF0]    ;// 0x00000018IRQ                                         --->IRQ Mode


        LDR     PC, FIQ_Addr        ;// 0x0000001cFIQ    


指令为“LDR     PC, [PC,#-0xFF0]”非常特殊,其并没有跳转到IRQ中断程序的入口处,而是进行了一个PC的运算后赋值,这里就要说明其缘由。在LPC系列中,IRQ的响应过程,程序的入口地址并不是直接写在这条语句中,而是放在一个寄存器中,该寄存器是:VICVectAddr,其地址是0xFFFFF030,现在就很明白了,在执行语句“LDR     PC, [PC,#-0xFF0]”时,PC的值已经变为该语句的后面第二条语句的地址了,也就是0x00000020,而0x000000200xFF0时,发生借位,其结果恰好为0xFFFFF030,也就是说,通过这个简单的运算,使PC跳转到了寄存器VICVectAddr中包含的值为地址的位置上,这样就简单的完成了IRQ的跳转。


当然,IRQ中断源不止一个,其中断服务程序也不止一个,这个寄存器的值是自动更新的,另有一组寄存器VICVectAddr015(后面有数字)将IRQ16个中断源的地址分别放在对应的位置上(优先级等内容有另外的寄存器来控制,这里不多说),当IRQ中断发生时,硬件自动将对应的VICVectAddr015中的某个对应的地址传给VICVectAddr寄存器,这个过程不用我们来编程实现。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1492773 2008-12-16 00:04

"硬件自动将对应的VICVectAddr0~15中的某个对应的地址传给VICVectAddr寄存器" 这句话有错误,应该是 “硬件自动将对应的AIC_SVR1-AIC_SVR31(存放中断函数地址)中的某个对应的地址传给VICVectAddr寄存器”
相关推荐阅读
用户1492773 2014-06-23 15:28
DSP 数据 Q格式
Q格式 许多DSP都是定点DSP,处理定点数据会相当快,但是处理浮点数据就会非常慢。可以利用Q格式进行浮点数据到定点的转化,节约CPU时间。实际应用中,浮点运算大都时候都是既有整数部分,...
用户1492773 2014-04-13 09:46
CPLD/FPGA学习前期了解
1. 什么是CPLD? 答:CPLD(Complex Programmable Logic Device)复杂可编程逻辑器件 2. 什么是FPGA? 答“:FPGA(Field-Pro...
用户1492773 2011-11-08 22:36
评论:@在路上 博客中提到的“书上永远不会告诉你的一些接插件知识”
细节 体现 专业...
用户1492773 2009-11-19 20:03
转 初学者学liunx
怎样才能学好linux 学习嵌入式linux,首先要了解通用的linux操作系统,下面转载网上一篇介绍如何学习linux的笔记,感觉写得不错,思路比较清晰,希望对大家的学习有所帮助~~    随着Li...
用户1492773 2009-11-19 19:47
[转]写得蛮好的linux学习笔记
[转]写得蛮好的linux学习笔记 linux目录架构/   根目录/bin    常用的命令 binary file 的目錄/boot   存放系统启动时必须读取的档案,包括核心 (kernel) ...
用户1492773 2009-09-11 14:33
TVS瞬态电压抑制二极管
瞬态电压抑制二极管(TVS)又叫钳位二极管,是目前国际上普遍使用的一种高效能电路保护器件,它的外型与普通二极管相同,但却能吸收高达数千瓦的浪涌功率,它的主要特点是在反向应用条件下,当承受一个高能量的大...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条