S3C44B0的向量中断模式概念

S3C44B0向量中断模式概念

 

注:arm7的工作模式是arm7的这个内核提供的,而厂商在生产时,在arm7这个内核的基础上,外扩了各种中断及其相关的中断控制器,而这些中断发生一般会进入IRQ模式,这点很好理解。

 

(1)向量中断模式(IRQ支持,FIQ不支持)
      
 当系统发生IRQ中断时候,cpuPC会读取位于0x18处的IRQ中断指令(也就是说跳到地址0x18处去执行指令),然后CPU自动读取对应于该中断源确定地址上的指令取代0x18处的指令(这个过程是由系统自动完成的,不需要用户编程),通过跳转指令,系统就直接跳转到对应地址,这样节省了中断处理时间,提高中断处理速度。——通俗点说,如果采用了向量中断模式,一旦发生中断,CPU就会跳到相应的地址来执行指令。例如ADC中断的向量地址为0xC0,一旦发生ADC中断,PC就先跳到了地址0x18再跳到0xC0上来执行命令,但对于用户来说,就跟一发生中断就直接跳到了0xC0上没有区别,这个先跳到0x18的过程可以忽略不计,由系统自动完成。如果在0xC0处放如下代码: ldr  PC , =HandlerADC ,当ADC中断产生的时候系统会自动跳转到HandlerADC函数中。


2)非向量中断模式

这种模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将interrupt pending寄存器中对应标志位置位(当然向量中断模式也有这步发生),然后跳转到地址0x18处。用户需要在地址0x18处写一个统一中断函数,该函数通过读取interrupt pending寄存器中对应标志位,来判断中断源,并根据优先级关系再跳到对应中断源的处理代码中。

 

 

二、向量中断模式的启动代码分析及编程。

 

1、中断向量模式中,具体实现如下:

中断服务入口地址处,写入一个调用宏的指令(类似于子程序),这个宏是一个“加载程序”,把中断服务的首地址装载于pc中。具体调用一个框图来表示,结合以下的程序理解,接下来还有一个针对框图的具体的讲解。以ADC中断为例子:

启动代码44binit.s定义了一个宏:$HandlerLabel HANDLER。

启动代码44binit.s把“ldr  PC , =Handler***”装入了对应的地址中(在0x0为首的一系列地址中),例如“ldr PC , =HandlerADC”这条指令被装入了0x000000c0地址中。

启动代码44binit.s开辟了一些在SDRAM>0x0c000000)上的以_ISR_STARTADDRESS(我的板子程序定义为0x0c7fff00)为基址的一些地址中,每个地址用一个标号表示,用于存放中断服务程序的地址。例如,HandleADC   #   4 ,可以HandleADC认为是_ISR_STARTADDRESS+0x20的这个地址的标号。详见代码。

main.c包含的头文件44b.H中,对于_ISR_STARTADDRESS+0x20”有如下定义,#define  pISR_ADC  (*(unsigned *)(_ISR_STARTADDRESS+0x20))pISR_ADC这是一个指针,在上一个步骤中,开辟出来空间就是给这个指针用的。

 在main.C或者其他的c文件里,包含44b.H这个头文件的前提下,可以编写一个中断处理函数,void __IRQISR_ADC(){……},然后再加入语句pISR_ADC=unsigndeISR_ADC,这样就把ISR_ADC()这个函数的地址写入了_ISR_STARTADDRESS+0x20)这个地址。值得注意的是,是地址被写入了地址。

ADC中断发生,PC跳转到执行0x 000000C0处。

CPU执行存放在地址0x000000C0上的“ldr  PC , =HandlerADC”这条指令。

PC再跳至执行宏指令“HandlerADC  HANDLER  HandleADC”,此宏指令(实质上就是一个子程序)执行完的结果,就是把(_ISR_STARTADDRESS+0x20)这个地址上存放的子程序ISR_ADC()地址给PCPC就执行ISR_ADC()。

执行完毕,返回。

 

 

注:(1)步骤①②③在出现在44binit.s,详见我的启动代码中的注释。

    2_ISR_STARTADDRESS的定义在option.inc中:_ISR_STARTADDRESS   EQU   0xc7fff00

    3)步骤④在44b.H中定义:#define  pISR_ADC     (*(unsigned *)(_ISR_STARTADDRESS+0x20))

(4)main.C或者其他的c文件里,写入:

void __IRQ ISR_ADC(){……}pISR_ADC=unsigndeISR_ADC

    (5)必须加入在中断服务程序中__IRQ,以高速编译器这个是一个中断服务程序,这样编译器会在编译时候加上返回用户模式的代码,以实现中断后程序的自动返还。

http://blog.sina.com.cn/s/blog_4e0fe0510100hzvm.html

http://blog.sina.com.cn/s/blog_4e0fe0510100i018.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值