lpc2000软中断分析

来源:互联网 发布:欠淘宝贷款1年了没还上 编辑:程序博客网 时间:2024/05/16 19:38

周立功在startup.s文件中添加了一段支持软中断的代码,代码如下:

;软中断
SoftwareInterrupt   
;        B       SoftwareInterrupt
;//增加开/关中断处理 Chenxibing-2004-02-09                                
        CMP     R0, #4//判断传过来的参数是否大于4
        LDRLO   PC, [PC, R0, LSL #2]//小于4(参数正确),PC = PC + R0*4进行查表
        MOVS    PC, LR

SwiFunction
        DCD     IRQDisable       ;0
        DCD     IRQEnable        ;1
        DCD  FIQDisable   ;2
        DCD  FIQEnable   ;3

IRQDisable
        ;关IRQ中断
        MRS     R0, SPSR
        ORR     R0, R0, #NoInt
        MSR     SPSR_c, R0
        MOVS    PC, LR

IRQEnable
        ;开IRQ中断
        MRS   R0, SPSR
        BIC   R0, R0, #NoInt
        MSR   SPSR_c, R0
        MOVS    PC, LR
       
FIQDisable
        ;关FIQ中断
        MRS     R0, SPSR
        ORR     R0, R0, #NoFIQ
        MSR     SPSR_c, R0
        MOVS    PC, LR

FIQEnable
        ;开FIQ中断
        MRS   R0, SPSR
        BIC   R0, R0, #NoFIQ
        MSR   SPSR_c, R0
        MOVS    PC, LR
;// Changed 2004-12-09

我们平时想使用软中断irq的时候,我们会在我们的应用程序中使用如下语句:

 IRQDisable() 

我们细细看,会发现它在target.h文件中定义,如下:

 __swi(0x00) void SwiHandle1(int Handle);
 #define IRQDisable() SwiHandle1(0)
 #define IRQEnable() SwiHandle1(1)
 #define FIQDisable() SwiHandle1(2)
 #define FIQEnable() SwiHandle1(3)
__swi是ADS编译器的关键字,用它做前缀可以声明一个软中断调用,格式为:
__swi(功能号)   返回值  名称 (参数列表)
功能号:即软中断指令中的24位立即数,软中断号
名  称:即调用软中断时用于描述软中断的函数名称
参  数:软中断函数的参数,根据ATPCS规则,如果软中断函数有不超过4个参数时,通过R0~R3传递,超过4个参数时用堆栈来传递。
—swi(0x00) void SwiHandle1(int Handle)。其中0x00为软中断功能号(软中断号);软中断函数名称为SwiHandle1;只有一个参数,则使用R0来传递;函数没有返回值。
紧接着这句代码的是定义了4个宏,分别表示禁能IRQ函数、使能IRQ函数、禁能FIQ函数、使能IFQ函数,其实调用的软中断函数是一样的,只是参数不同而已。例如在用户程序中调用“IRQEnable( );”时,处理器会产生软中断。
位于启动代码中的那些是软中断处理函数,当发生软中断时,PC被强制指向0x00000008(LDR     PC, SWI_Addr),这个地址中存放的是软中断异常的处理函数的地址(SWI_Addr            DCD     SoftwareInterrupt),所以程序会跳转至标号“SoftwareInterrupt ”处执行。SoftwareInterrupt 函数的功能是判断R0的值(R0的值为软中断函数传递过来的参数)是否小于4,如果小于4则跳转至标号“SwiFunction”执行,如果不是则函数返回。SwiFunction函数是一个散转函数,它的功能是根据R0的值跳转至对应的函数处执行,即如果参数为1,则函数会跳转至IRQEnable处执行,将IRQ中断使能。

原创粉丝点击