微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 2440之中断管理

2440之中断管理

时间:11-11 来源:互联网 点击:
中断处理:

中断是嵌入式里最重要的一个概念。一般一个系统对于一个设备要么采用中断方式,要么采用轮询方式 。中断方式可以有效地减少处理器负荷 ,但是如果大量采用中断则有可能降低处理速度 ,因为中断处理破坏了处理器的流水机制。复习下微机原理中中断处理过程和中断机制。

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方法。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top