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.
- ARM中断机制小述
- ARM中断机制
- ARM中断机制
- ARM中断机制
- ARM的异常中断机制
- ARM的异常中断机制
- ARM的异常中断机制 .
- ARM Linux中断机制分析
- ARM的异常中断机制
- ARM Linux中断机制分析
- ARM Linux中断机制之中断处理
- ARM Linux中断机制之中断处理
- arm linux中断机制学习第一篇
- ARM Linux中断机制之中断的初始化
- ARM Linux中断机制之中断的初始化
- ARM中断
- ARM中断
- ARM 中断
- bash中exit/exec/source
- 回顾我的2009
- UNC
- Linux Firewalls Using iptables
- IT项目资源索引
- ARM中断机制小述
- Effective Java 学习笔记 (11)
- 企业信息化系统索引
- 基于s3c2410的YL-LCD35液晶驱动的分析
- 打开本地安全策略mmc无法创建管理单元regsvr32 gpedit.dll提示失败
- 权限表设计
- ASP.NET 关闭进程
- Atmega128 控制直流伺服电机
- 使用C#多线程程序(1)