热度 21
2012-4-4 12:31
3522 次阅读|
1 个评论
ARM7中断原理的最基本部分与单片机是一样的,如果对单片机中断原理比较熟悉,再来理解ARM7的中断原理是顺理成章的事情。 1.中断向量表 下面以Philips的lpc2136为例进行比较深入的分析: 我们在用ads1.2调试开发板时,有一个startup.s的汇编程序,这个程序就是lpc2136得以运行的启动代码,是及其重要的一部分,蕴含着ARM7的精髓。 其中,有这样一段代码: AREA vectors,CODE,READONLY ENTRY ;interrupt vectors ;中断向量表 Vector_Init_Block LDR PC, Reset_Addr LDR PC, Undefined_Addr LDR PC, SWI_Addr LDR PC, Prefetch_Addr LDR PC, Abort_Addr DCD 0xb9205f80 LDR PC, LDR PC, FIQ_Addr Reset_Addr DCD Start_Boot Undefined_Addr DCD Undefined_Handler SWI_Addr DCD SWI_Handler Prefetch_Addr DCD Prefetch_Handler Abort_Addr DCD Abort_Handler Nouse DCD 0 IRQ_Addr DCD 0 FIQ_Addr DCD FIQ_Handler ;未定义指令 Undefined_Handler B Undefined_Handler ;软中断 SWI_Handler B SWI_Handler ;取指令中止 Prefetch_Handler B Prefetch_Handler ;取数据中止 Abort_Handler B Abort_Handler ;快速中断 FIQ_Handler STMFD SP!, {R0-R3, LR} BL FIQ_Exception LDMFD SP!, {R0-R3, LR} SUBS PC, LR, #4 下面的这个截图来自ads1.2安装后的“online book”里面(这里面有很多非常重要的知识,你不懂的任何疑问都可以在此找到答案,可惜很多人不知道这个好地方) ARM体系设计有八种异常,并把所有现象用异常来表达,我们的代码任何时刻都在这八种异常中运行。 我们给开发板上电,这就是一种“异常”,这种异常用”Reset”来表示。 这八种异常对应八个地址: Reset(复位)=========0x00000000(当上电,或按下开发板的复位键时,程序跳到该地址运行) Undef(未定义指令)=========0x00000004(当程序指针访问地址出现未定义指令,程序跳到该地址运行) SWI(软件中断)=========0x00000008(当发生软件中断,程序跳到该地址运行) Prefetch Abort(预取指中止)=========0x0000000C(当预取值失败,程序跳到该地址运行) Data Abort(数据中止)=========0x00000010(当访问数据区失败,程序跳到该地址运行) Reserved(保留)===========0x00000014 IRQ===========0x00000018(当发生IRQ中断时,程序跳到该地址运行) FIQ(快速中断)========0x0000001C(当发生快速中断时,程序跳到该地址运行) 2 FIQ中断,向量IRQ,非向量IRQ区别 FIQ是指快速中断请求(Fast Interrupt reQuest),具有最高优先级,一般只声明一个中断源为FIQ,这样可以得到最快的相应速度,如果非要申请多个中断源为FIQ,那么当中断发生时,FIQ中断线程通过读取FIQ状态寄存器来判断当前发生的是那个中断。 向量IRQ(Vector IRQ)是指向量中断请求(Vector Interrupt ReQuest)。具有次高优先级。 非向量IRQ(NO_Vector IRQ)是指非向量中断请求。具有最低优先级。 (未完待续)