中断是嵌入式里最重要的一个概念。一般一个系统对于一个设备要么采用中断方式,要么采用轮询方式 。中断方式可以有效地减少处理器负荷 ,但是如果大量采用中断则有可能降低处理速度 ,因为中断处理破坏了处理器的流水机制。复习下微机原理中中断处理过程和中断机制。
2440中支持FIQ(快速中断)和IRQ(普通中断)2种中断方式,一般只采用IRQ中断。2440有60个中断源,不支持中断嵌套。具体的参考用户手册第14章。下图是2440中断产生过程。
具体的讲解一下,关于寄存器请查阅用户手册。
中断源分为2种,子中断中断源和中断源,当一个子中断产生一个中断信号,子中断源挂起寄存器(SUBRCPND)相应位自动置1,察看子中断屏蔽寄存器(SUBMASK)该子中断是否被屏蔽(人工设置),如果没屏蔽,则中断源寄存器(SRCPND)置1,察看该中断源是否被屏蔽和采用那种模式,如果没被屏蔽,采用IRQ模式,进行优先级判断后,高优先级的执行,中断挂起寄存器置1,产生IRQ信号。同时CPSR寄存器的I位置1,表明当前有一个IRQ中断产生。记得以前让大家注意该寄存器中的I和Q位了吧,他的作用就在这 。
中断处理过程:
CPU每执行一条指令都会检查CPSR寄存器,当发现I和F位被置1时,就进行中断处理。第一步跳入异常向量表:
b ResetHandler
b HandlerUndef ;handler for Undefined mode
b HandlerSWI ;handler for SWI interrupt
b HandlerPabort ;handler for PAbort
b HandlerDabort ;handler for DAbort
b . ;reserved
b HandlerIRQ ;handler for IRQ interrupt
b HandlerFIQ ;handler for FIQ interrupt
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
如果是IRQ 则跳到HandlerIRQ,此过程由硬件来完成。接下来
ldr r0,=HandleIRQ ;This routine is needed
ldr r1,=IsrIRQ ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c
str r1,[r0]
进行第2次跳转,跳转到2级中断向量表
IsrIRQ
sub sp,sp,#4 ;reserved for PC
stmfd sp!,{r8-r9}
ldr r9,=INTOFFSET
ldr r9,[r9]
ldr r8,=HandleEINT0
add r8,r8,r9,lsl #2
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc}
HandleEINT0 # 4
HandleEINT1 # 4
HandleEINT2 # 4
HandleEINT3 # 4
次代码完成了建立2级中断向量表,在我们中断程序中我们先对中断进行注册
例 EINT0 = ISR_FUNC();这样就完成了中断向量和中断服务程序的关联。跳到2级中断向量表后就进入了中断处理程序。中断处理完成了CPU返回继续执行中断处理前的下一条程序,关于处理现场的保护部分参考微原部分。
下边是一个关于中断处理函数的测试题:明白中断处理函数的使用
中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字
__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
上边就是2440的中断产生及处理过程,这些是最基本的知识要牢牢掌握。对于ARM这些都是一样的,只不过是寄存器有可能不一样,但处理过程是一样的,有些处理器支持中断可重入,如710处理器。阅读下用户手册14章中关于优先级部分,注意下有些寄存器的清0方法。
上一篇:s3c2440头文件之2440addr.h
下一篇:ARM-Linux GPIO操作事宜
推荐阅读最新更新时间:2024-03-16 15:04