1、ARM7TDMI内核的中断
至于中断的概念这里就说的,下面我来介绍一下ARM7TDMI内核下的中断。
和51单片机只有一种模式不同,ARM7TDMI内核CPU在响应中断后会切换到异常模式下:FIQ中断是进入快中断模式,IRQ中断时进入中断模式(ARM7TDMI内核有7种模式:用户模式,系统模式,快中断模式,中断模式,管理模式,中止模式和未定义模式,其中后5种被称为异常模式,由程序状态寄存器的M4M3M2M1M0这5位来决定,其实ARM7的模式管理的这5位和51单片机状态寄存器的RS1RS0两位的作用相似)。
1.1、中断处理过程
ARM7进入及退出快中断模式和中断模式的过程(中断响应过程)如下:
① 将下一条指令的地址复制到LR(R14)中(在ARM状态下)。
② 将CPSR复制到适当的SPSR(各种模式处CPSR是共用一个的,而SPSR在不同异常模式下是不同的)。
③ 根据异常将CPSR模式强制设为快中断模式或中断模式。
④ 强制PC从相关的异常向量处取指。(到此完成进入中断服务程序的动作)
⑤ 执行异常服务程序。
⑥ 将LR中的值减去偏移量后移入PC。ARM状态快中断模式和中断模式下这个偏移量为4,因为LR保存的是由于FIQ或IRQ占先面没有被执行的指令的地址。
⑦ 将SPSR的值复制回CPSR中。
⑧ 清零在入口置位的中断禁止标志。
1.2、异常向量表
一旦产生IRQ中断,微控制器会切换到IRQ模式,并且跳转到向量表0x0000018地址处执行程序。而一旦产生FIQ中断,微控制器会切换到FIQ模式,并且跳转到向量表0x000001C地址处执行程序。所示,在0x00000080处和0x0000001C处必须各有一条跳转指令,分别跳转的IRQ和FIQ中断处理的代码处。在0x00000000处的一般向量表称为异常向量表,定义如下:
ENTRY
b ResetHandler ;for debug
b HandlerUndef ;handlerUndef
b HandlerSWI ;SWI interrupt handler
b HandlerPabort ;handlerPAbort
b HandlerDabort ;handlerDAbort
b . ;handlerReserved
b HandlerIRQ ;这里是IRQ中断入口处0x00000018
b HandlerFIQ ;这里是FIQ中断入口处0x0000001C
ResetHandler、HandlerUndef等只是地址标签,是由用户自己在这些异常处理代码的开始处定义的。
2、44b0X的中断
2.1、44b0X的启动时中断的初始化
44B0的初始化程序就是初始化各个关键的寄存器,建立中断向量,然后转移到主函数去执行程序。不过44B0不支持地址映射,所以程序不COPY到RAM种执行。44B0初始化对我们广大初学者来说,比较难理解的是中断的处理和一些少见的操作符号。下面我来一段一段地分析。
2.1.1、44b0的中断子程序地址
就是存放在初始化程序最后的一段:
^ _ISR_STARTADDRESS
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
;Don''t use the label ''IntVectorTable'',
;because armasm.exe cann''t recognize this label correctly.
;the value is different with an address you think it may be.
;IntVectorTable
HandleADC # 4
HandleRTC # 4
HandleUTXD1 # 4
HandleUTXD0 # 4
HandleSIO # 4
… …
HandleEINT3 # 4
HandleEINT2 # 4
HandleEINT1 # 4
HandleEINT0 # 4 ;0xc1(c7)fff84
这段第一行 “^”符号表示在RAM区开辟空间。^ _ISR_STARTADDRESS 表示在RAM的_ISR_STARTADDRESS处开辟一段空间。这里开辟的空间是用来存放中断服务程序及其他异常处理程序地址的。每个中断或其他异常都开辟4个字节的空间,这是因为RAM区的程序地址要4个字节才能放得下。而中断程序的地址是应用程序在使用这个中断时,将中断服务程序的地址存入这对应的空间内。_ISR_STARTADDRESS一般是定义在RAM的最后一段空间,可以在一些配置文件中找到这个标签,如:Option.inc。
2.1.2、IRQ中断
44B0的IRQ中断有两种装断模式一种是非向量IRQ中断,一种是向量IRQ中断。
当有两个中断同时发生时,前者是由软件方式来判断决定先执行那个中断服务,而后者是由硬件逻辑来决定的。
非向量IRQ中断的执行过程
(1) 中断允许并且外部中断请示产生。
(2) PC自动跳转一0x00000018处
也就是异常向量表:
b ResetHandler
b HandlerUndef
b HandlerSWI
b HandlerPabort
b HandlerDabort
b .
b HandlerIRQ ;这里是非向量IRQ中断入口处0x00000018