异常(Exception):
是由内/外部源引起的需要处理器干预的一个事件,
每种异常模式有自己的特殊功能寄存器,堆栈。
处理异常需要保护处理器的当前状态,以便在异常处理后可以恢复执行。
当异常发生时,系统强制从固定的地址执行程序
进入异常时,PC->R14和CPSR->SPSR保存PC和处理器状态,返回时则,CPSR->SPSR,R14->PC.
中断是异常的一个子集。未用中断通常指向一个空函数。
ARM提供了两种中断源IRQ,FIQ,发生中断时,会进入相应的IRQ,FIQ异常模式,
由异常处理程序识别不同的中断,调用相应的中断服务程序.
ARM的异常向量表位置:从0x0地址开始,连续8×4字节的空间,具体分配下:
HandleReset # 4
HandleUndef # 4
HandleSwi # 4
HandlePrefetch # 4
HandleAbort # 4
HandleReserv # 4
HandleIrq # 4
HandleFiq # 4
vxWorks下处理:
把相应的异常处理函数指针(或地址)存放在内存0x100处,在0x0的异常向量表存放
PC指针加载指令, LDR PC,[PC,#100],来加栽0x100处的异常处理函数.
vxWorks for arm 只使用了IRQ异常,所有外部中断ISR都以IRQ异常处理例程为入口.
当外部中断引起IRQ异常时,由IRQ异常处理例程调用挂在中断向量表中的ISR.
中断嵌套:
一般,vxWorks以不可重入方式使用中断,在config.h中定义:
#define INT_MODE INT_NON_PREEMPT_MODEL
使用可重入中断方式时,存在中断嵌套,需要保存堆栈和返回地址.(SVC保护模式).
详略...
MMU:
MMU是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。
MMU通常是CPU的一部分,本身有少量存储空间存放从虚拟地址到物理地址的匹配表。
此表称作TLB(转换旁置缓冲区)。所有数据请求都送往MMU,由MMU决定数据是在RAM内
还是在大容量存储器设备内。如果数据不在存储空间内,MMU将产生页面错误中断。
一般,使用MMU解决了如下几个问题:
①使用DRAM作为大容量存储器时,如果DRAM的行列是非平方的,
会导致该DRAM的物理地址不连续,这将给程序的编写调试造成极大不便,
而适当配置MMU可将其转换成虚拟地址连续的空间。
②ARM内核的中断向量表要求放在0地址, 对于ROM在0地址的情况,无法调试中断服务程序,
所以在调试阶段有必要将可读写的存储器空间映射到0地址。
③系统的某些地址段是不允许被访问的,否则会产生不可预料的后果,为了避免这类错误,
可以通过MMU匹配表的设置将这些地址段设为用户不可存取类型。
在IXP1200中,SDRAM的物理地址0--24M被提供给微码使用,物理地址0x1800000被映射到
虚拟地址0x0.
注意:在使能MMU后,程序继续运行,程序计数器的指针已经改变,指向了相应的虚拟地址,
在调试中要注意。