近来在LPC的中止进程上看了点文献,作为一个初学者感觉这个内容与其它的处理器仍是有很大的差异,比如说三星的S3C4510B,两者在中止的处理上理念是彻底不同的,个人感觉LPC的要难一些,许多当地感觉上是在和ARM的标准打擦边球。
基础知识:LPC2294的EXT中止分为了三类,包括FIQ,Vectored IRQ,non– Vectored IRQ,其间,以FIQ的优先级最高,而以non– Vectored IRQ的优先级最低,体系总共供给了27个中止源,而且给这27个中止源进行了固定的编号,可是留意,这个编号和优先级没有任何的联系,并非是编号在前面的优先级就越高,见下面阐明。
要害内容:两套操控途径,
第一套:在ARM体系中,本来有SWI,FIQ,IRQ等这些中止的界说,而且现已界说了这些中止的开关操控位,便是在CPSR寄存器中,该寄存器包括了一个I位和一个F位,I位用于操控IRQ中止的开关,F用于操控FIQ的开关,可是值得留意的是CPSR的读取和修正在用户形式下是不能完结的,必需要经过SWI指令进入到特权形式下才能够进行修正。
第二套:在LPC的SFR(特别功用寄存器)中,也供给了一套寄存器用于操控相应的中止的进行,这组操控器叫做VIC寄存器(都以VIC最初),改组寄存器包括了一切的与中止有关的设置,敞开,分类等功用,仅仅是将外部中止引脚对应的部分功用别离出去,由EXT系列的寄存器来处理,因而,对这一个系列的寄存器的把握是十分重要的!
两者间的联系:仅仅在第二套操控途径下翻开FIQ,IRQ中止是不行的,假如ARM内核没有开中止的话,整个体系就不会有中止产生,因而,常见的做法是这样:先将第二套途径的操控内容处理好,然后经过SWI软件中止指令,将ARM处理器的形式切换为特权形式,在特权形式下,对CPSR进行“读出-修正-写回”的操作,将中止翻开,然后在返回到用户形式。
LPC的中止的特别性:FIQ的中止和一般的ARM规定是没有任何差异的,便是在产生中止时,指令跳转到0x0000001C处开端履行,这个是没有什么疑问的。可是IRQ的呼应进程就不同了,先看下面一段代码,这个是写在程序的头部的部分字节:
Reset
LDR
PC, ResetAddr
;// 0x00000000,Reset
—》Supervisor Mode
LDR
PC, Und_Addr
;// 0x00000004,Undefined InstrucTIon
—》Undefined Mode
LDR
PC, SWI_Addr
;// 0x00000008,Software Interrupt
—》Supervisor Mode
LDR
PC, PAbort_Addr
;// 0x0000000c,Abort(Prefetch)
—》Abort Mode
LDR
PC, DAbort_Addr
;// 0x00000010,Abort(Data)
—》Abort Mode
DCD
0xB9205F80
;// 0x00000014,Reserved
—》
LDR
PC, [PC,#-0xFF0]
;// 0x00000018,IRQ
—》IRQ Mode
LDR
PC, FIQ_Addr
;// 0x0000001c,FIQ
指令为“LDR
PC, [PC,#-0xFF0]”十分特别,其并没有跳转到IRQ中止程序的进口处,而是进行了一个PC的运算后赋值,这儿就要阐明其缘由。在LPC系列中,IRQ的呼应进程,程序的进口地址并不是直接写在这条句子中,而是放在一个寄存器中,该寄存器是:VICVectAddr,其地址是0xFFFFF030,现在就很理解了,在履行句子“LDR
PC, [PC,#-0xFF0]”时,PC的值现已变为该句子的后边第二条句子的地址了,也便是0x00000020,而0x00000020-0xFF0时,产生借位,其成果刚好为0xFFFFF030,也便是说,经过这个简略的运算,使PC跳转到了寄存器VICVectAddr中包括的值为地址的方位上,这样就简略的完结了IRQ的跳转。
当然,IRQ中止源不止一个,其间止服务程序也不止一个,这个寄存器的值是主动更新的,还有一组寄存器VICVectAddr0~15(后边有数字)将IRQ的16个中止源的地址别离放在对应的方位上(优先级等内容有别的的寄存器来操控,这儿不多说),当IRQ中止产生时,硬件主动将对应的VICVectAddr0~15中的某个对应的地址传给VICVectAddr寄存器,这个进程不必咱们来编程完成。