您的位置 首页 传感器

2440之中止办理

中断处理:中断是嵌入式里最重要的一个概念。一般一个系统对于一个设备要么采用中断方式,要么采用轮询方式。中断方式可以有效地减少处…

中止处理:

中止是嵌入式里最重要的一个概念。一般一个体系关于一个设备要么选用中止办法,要么选用轮询办法 。中止办法能够有效地削减处理器负荷 ,可是假如许多选用中止则有或许下降处理速度 ,由于中止处理破坏了处理器的流水机制。温习下微机原理中中止处理进程和中止机制。

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/274694.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部