您的位置 首页 资料

看看大神是怎么做LPC中的中止处理

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

近来在LPC的中止进程上看了点文献,作为一个初学者感觉这个内容与其它的处理器仍是有很大的差异,比如说三星的S3C4510B,两者在中止的处理上理念是彻底不同的,个人感觉LPC的要难一些,许多当地感觉上是在和ARM的标准打擦边球。

看看大神是怎么做LPC中的中止处理

基础知识: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寄存器,这个进程不必咱们来编程完成。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/101942.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部