CODE32
AREA Startup,CODE,READONLY
; /* 异常向量表 */
Vectors
LDR PC, ResetAddr ;把ResetAdde地址上的存储器的内容装载到PC上
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit ;为ResetAddr分配以ResetInit地址值,
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD IRQ_Exception
FIQ_Addr DCD FIQ_Handler
此时ResetAddr实质上只作为一个指针(指向ResetInit),没有分配空间,
ResetAddr地址的存储器上装载的是ResetInit的地址。
ResetInit
BL InitStack ; 初始化堆栈
BL TargetBusInit ; 总线系统初始化 (函数中不允许堆栈操作)
BL TargetResetInit ; 针对目标板的系统初始化
以ResetInit为例,存储器空间分配如下所示:
注意中断向量表要存放在代码段startup的开始处(Entry开始),而程序被链接时,该startup代码段被链接在整个程序的入口地址。
=========================
1. undef exception handler
当前指令,如果CPU不支持,它会自动将该指令交给Co-processor.(如:MMU, FPU) 处理。
如果Co-processor也无法识别这条指令,则产生异常.
当执行SWI指令时,产生这种中断.
3. Data abort
由数据异常触发.
通常有3种指令引发数据异常, 这些指令都是访存操作.(都是由MMU引入后才可能会发生的情况)
LDR / STR
SWAP
LDM / STM
MMU的失效类型,又分为5种:
存储访问失效
地址对齐失效
地址变换失效
域控制器失效
访问控制权限失效
因此当异常发生后,需要通过访问CP15来获知异常产生的具体原因和情况。
4. Pretetch Abort
对于ARM处理器来说,由于其内部使用了哈佛结构---独立的数据的指令总线.
因此,在数据/指令的读取过程中产生的异常也就很自然地可以区分开来
本质上而言,这些异常都是同属于存储访问失败产生的异常,因此这些异常都由MMU相关,在ARM手册中DataAbort和PrefetchAbort都
称为Memory abort。
Prefetch也就是在预取指令的动作后产生的,当处理器运行到这个无效的指令时(这个无效与undefined exception中的不可识别不同,
是指不存在或是无法得到)就触发该异常。
上一篇:S3C2410 GPIO接口
下一篇:基于ARM的硬件启动程序设计-分配中断向量表
推荐阅读最新更新时间:2024-03-16 15:01