S3C44B0的中断模式
来源:互联网 发布:OVI浏览器java 编辑:程序博客网 时间:2024/05/16 14:50
对于各种中断源的响应,S3C44B0有两种中断模式:向量中断模式和非向量中断模式,这就导致在软件处理上,可以很灵活的处理中断请求。一般来说做如下处理:
如果系统采用的ROM定位在地址0X00,则中断向量标应该包含一系列分支语句,跳转到相应的中断处理程序(这也是S3C44B0所支持的模式)
如果ROM定位到别的地址处,向量必须由初始化代码进行动态定位。
一般把这部分功能放在Bootloader中处理,对于这一点来说初学者很容易搞混,下面就详细解释中断处理的几种实现方式。
一、中断处理的实现方式
1、向量中断模式(也叫矢量中断模式)(IRQ支持,FIQ不支持)
为了缩短中断模式在进入所需的服务前所需要的中断响应时间,S3C44B0提供了一种新的中断模式——矢量中断模式。当多重中断源请求中断时,硬件优先级逻辑会判断哪一个中断将会被执行,同时,硬件逻辑自动执行由0x18地址到各个中断源向量地址的跳转指令,然后再由中断源向量进入相应的中断处理程序。简单的说,每个中断源对应一个内存地址,只要在对应的地址上设置一条到中断服务程序的跳转指令,CPU自动跳转到响应的中断处理函数。和原来的软件实现方式相比,这种方式可显著缩短中断响应时间。
2、非向量中断模式
这种模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将interrupt pending寄存器中对应标志位置位(当然向量中断模式也有这步发生),然后跳转到地址0x18处。用户需要在地址0x18处写一个统一中断函数,该函数通过读取interrupt pending寄存器中对应标志位,来判断中断源,并根据优先级关系再跳到对应中断源的处理代码中。
第一种方法,可以通过对I_ISPR/F_ISPR寄存器的分析判断出中断的类型,然后再把PC指向相应的中断处理程序。其中HandlerXXX实际上是一段跳转程序,运行这段程序将把HandleXXX指向的内容值赋给PC。由于HandleXXX所对应的地址中,存放的是每个相应的ISR的起始地址,这样就完成了向特定ISR的调转。这些ISR地址存放在HandleXXX指向的表项中,该表一般定位在RAM高端,基地址为ISR_STARTADDRESS。
第二种方法,对于IRQ处理程序可以通过对I_CMST寄存器的分析来判断中断源的类型,然后再把PC指向相应当中断处理程序。
之所以被称为向量中断模式,是因为它不需要用程序判断中断源,通过硬件实现直接跳转到相应ISR。而非向量中断必须在中断服务程序中判断中断来源,进而跳转到不同的处理程序。
在非向量中断模式下,中断响应流程如下:
1、通常情况下,CPU内核收到来自中断控制器的IRQ中断请求,会在0x00000018处执行一条指令,在从0x00000018处取指令时,中断控制器会在数据总线上加载分支指令。这些分支指令使程序计数器能够对应到每一个中断源的向量地址。所以,一般会在从0x00处到0xA0处放置跳转指令,跳转到HandlerXXX处。
2、HandlerXXX处一般放置汇编下面的一段中断处理宏(一般定义为HANDLER),入口是跳转地址,
主要流程:
栈空间递减保存跳转地址
保存工作寄存器R0到栈
载入中断入口地址所在位置到R0
载入中断入口地址到R0
保存中断入口地址到栈
二、向量中断模式的启动代码分析及编程。
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
- S3C44B0的中断模式
- S3C44B0的向量中断模式概念
- s3c44b0的中断(裸板中断)
- s3c44b0的中断(uclinux中断)
- S3C44B0 中断
- s3c44B0的启动代码44b0init.S的中断分析
- 关于S3C44B0中断的具体的启动代码解释
- 向量中断与非向量中断------s3c44b0
- S3C44B0的向量和非向量中断和的详细源码分析
- S3C44B0
- 基于S3C44B0的红外解码
- S3C44B0的初始化程序的理解(ran)
- S3C44B0存储器的BANK设计和控制
- S3C44B0存储器的BANK设计和控制
- 基于S3C44B0(ARM7TDI)的uCOS-II移植
- 求调试过S3C44B0的朋友
- S3C44B0 u-boot和uclinux的编译
- u-boot在s3c44b0 上的移植
- SHELL 脚本基本知识
- hdu 3033 I love sneakers! (多组中至少选一个的背包)
- 设计模式与多线程——用命令模式来设计多线程架构
- S3C44B0的向量和非向量中断和的详细源码分析
- 一点心得体会,关于忙
- S3C44B0的中断模式
- 设计模式几大原则
- uva 10618 Tango Tango Insurrection (DP)WA
- Servlet的生命周期
- 从摄像头中检测脸并保存图像
- POJ 3625 Building Road(Prim)
- Vim配置 Vim+Ctags+Taglist+cscope
- 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
- codeforces Coder