注:arm7的工作模式是arm7的这个内核提供的,而厂商在生产时,在arm7这个内核的基础上,外扩了各种中断及其相关的中断控制器,而这些中断发生一般会进入IRQ模式,这点很好理解。
(1)向量中断模式(IRQ支持,FIQ不支持)
(2)非向量中断模式
这种模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将interrupt pending寄存器中对应标志位置位(当然向量中断模式也有这步发生),然后跳转到地址0x18处。用户需要在地址0x18处写一个统一中断函数,该函数通过读取interrupt pending寄存器中对应标志位,来判断中断源,并根据优先级关系再跳到对应中断源的处理代码中。
二、向量中断模式的启动代码分析及编程。
1、中断向量模式中,具体实现如下:
中断服务入口地址处,写入一个调用宏的指令(类似于子程序),这个宏是一个“加载程序”,把中断服务的首地址装载于pc中。具体调用一个框图来表示,结合以下的程序理解,接下来还有一个针对框图的具体的讲解。以ADC中断为例子:
①启动代码44binit.s定义了一个宏:$HandlerLabel HANDLER。
②启动代码44binit.s把“ldr
③启动代码44binit.s开辟了一些在SDRAM(>0x0c000000)上的以_ISR_STARTADDRESS(我的板子程序定义为0x0c7fff00)为基址的一些地址中,每个地址用一个标号表示,用于存放中断服务程序的地址。例如,“HandleADC
④在main.c包含的头文件44b.H中,对于“_ISR_STARTADDRESS+0x20”有如下定义,#define
⑤ 在main.C或者其他的c文件里,包含44b.H这个头文件的前提下,可以编写一个中断处理函数,void __IRQISR_ADC(){……},然后再加入语句pISR_ADC=(unsignde)ISR_ADC,这样就把ISR_ADC()这个函数的地址写入了_ISR_STARTADDRESS+0x20)这个地址中。值得注意的是,是地址被写入了地址。
⑥ADC中断发生,PC跳转到执行0x 000000C0处。
⑦CPU执行存放在地址0x000000C0上的“ldr
⑧PC再跳至执行宏指令“HandlerADC
⑨执行完毕,返回。
注:(1)步骤①②③在出现在44binit.s,详见我的启动代码中的注释。
(4)在main.C或者其他的c文件里,写入:
void __IRQ ISR_ADC(){……}和pISR_ADC=(unsignde)ISR_ADC
http://blog.sina.com.cn/s/blog_4e0fe0510100hzvm.html
http://blog.sina.com.cn/s/blog_4e0fe0510100i018.html