ARM中断机制小述

来源:互联网 发布:社会学考研学校知乎 编辑:程序博客网 时间:2024/05/16 04:54

转载请注明出处

作者:小马


根据自己的理解, 对lpc2xxx系列的ARM7的中断机制做一个简单的描述.

 

中断是嵌入式系统很重要的一个功能. ARM提供IRQ和FIQ两种中断模式. 实际应用中,IRQ用的比较多. IRQ的中断响应过程(比如保存状态寄存器等)我在这里就不说了,随便找本介结ARM的书都可以找到. 当系统检测到一个中断时(中断源),首先去中断向量表找到对应中断源的中断服务程序的入口地址. ARM支持32个中断源. 这样构成了一张中断向理表. 所以一个中断要执行,要做两件事,一是配置好中断向量表,二是写好相应的中断处理程序.

中断向量表通常在启动代码中配置好,一般向量表是放在存储器地址的0x00000000处, 当然在有些处理器向理表也可以定位在高地址处(0xffff0000). 中断向量表一定要严格按照从复位中断到FIQ中断的顺序排列. 用一些代码描述可能更清楚:

LDR     PC, Reset_AddressLDR     PC, Undefined_AddressLDR     PC, SWI_Address


第一个是复位中断, 第二个是未定义中断,第三个是软中断. 可以看出中断向量表的开始处放的是一些跳转指令,当然不一定要用LDR PC, [PC,#OFFSET]的形式. 还可以用B指令或mov pc , #immediate这种形式. 具体看个人怎么用. 不过要注意一点就是如果用mov的话,立即数地址必须是一个8位立即数循环右移偶数位得到的. 它受到地址对齐的一个限制.

Reset_Address           DCD     Reset_INT;Undefined_Address       DCD     Undefined_INTSWI_Address             DCD     Software_INT


 

跳转指令应该是跳到中断服务程序的入口处. 上面Reset_INT , Undefined_INT,  Software_INT, 就是中断服务程序的入口地址. 紧接着要定义各个中断服务

Undefined_INT   //。。。。


 

对于不用的中断,一般声明一个哑函数,类似于下面的形式

SWI_AddressB SWI_Address

用一个跳转指令跳转到自已,相当于一个死循环.

 

用lpc2214这个片子做一个例子,下面的这段代码是周立功开发板提供的启动代码截取下来的.

LDR     PC, ResetAddr;LDR     PC, UndefinedAddrLDR     PC, SWI_AddrLDR     PC, PrefetchAddrLDR     PC, DataAbortAddrDCD     0xb9205f80LDR     PC, [PC, #-0xff0]LDR     PC, FIQ_Addr


LDR     PC, [PC, #-0xff0] 这一条语句可以这样理解:

ARM7的三级流水线结构导致了PC指向的是当前指令的后8个字节. 本来IRQ是应该放在0x00000018处的. LDR     PC, [PC, #-0xff0]这条语句执行后,PC的当前值就是0x00000018+8-0xff0. 很容易计算出它的结果是0xfffff030. 看一下lpc22xx的手册就知道. 这个地址就是VICVectAddr. 也就是说本来这个地址是应该放IRQ服务程序的入口地址的,但是这个地址被放在了VICVectAddr 这个寄存器里. 英文手册里有一段对VICVectAddr 描述. 看了之后就容易明白是怎么回事了.

Vector Address Register. When an IRQ interrupt occurs, the IRQ service routine can read this register and jump to the value read.

 

原创粉丝点击