lpc2103 软件中断原理

3 篇文章 0 订阅

最近看lpc2103的启动代码,在软件中断处停了下来,我仔细分析了下,觉得这样理解(如果分析不对,希望大牛更正):

代码中有一段(startup.s):

;软中断
SWI_Handler          
        CMP     R0, #4
        LDRLO   PC, [PC, R0, LSL #2]
        MOVS    PC, LR
       
;------------------------------------------------------------------------------------------------
SwiFunction
        DCD     IRQDisable         ;0
        DCD     IRQEnable          ;1
        DCD     FIQDisable         ;2
   DCD     FIQEable           ;3

显然SWI_Handler 是软中断服务程序入口,而SwiFunction软中断向量表。明显这样软中断服务程序很简单,它根本就没有处理不同软中断号对应的软中断处理程序(我的意思是对所有软中断号都产生相同处理)。因为我把红色部分红色部分R0理解为函数参数而不是软中断号。
然后在(target.h)中,有如下代码:

__swi(0x00) void SwiHandle1(int Handle);

#define IRQDisable() SwiHandle1(0)
#define IRQEnable()   SwiHandle1(1)
#define FIQDisable() SwiHandle1(2)
#define FIQEnable()   SwiHandle1(3)

即,我把R0理解为SwiHandle1函数的参数了。那么软中断号0x00哪去了呢?

(以下*号包含内容来自:blog.csdn.net/jianshe999/archive/2008/02/28/2126014.aspx

********************************************************************************************************************************

软件中断由专门的软中断指令SWI 触发,SWI 指令后面跟一个中断编号,
以标识可能共存的多个软件中断程序。

在C 程序中调用软件中断需要用到编译器的扩展功能,使用关键字“__swi”
来声明中断函数。注意软中断号码同时在函数定义时指定。
__swi(0x24) void my_swi (void);
这样当调用函数my_swi 的时候,就会用“SWI 0x24”来代替普通的函数调
用“BL my_swi”。

可以发现软件中断同样存在着中断分支的问题,即需要根
据中断号码来决定调用不同的处理程序。软中断号码只存在于SWI 指令码当中,
因此需要在中断处理程序中读取触发中断的指令代码,然后提取中断号信息,再进行进一步处理。

下面是软中断指令的编码格式:
ARM 状态下的SWI 指令编码格式,32 位长度,其中低24 位是中断编号。
Thumb 状态下的SWI 指令编码格式,16 位长度,其中低8 位是中断编号。

为了在中断处理程序里面得到SWI 指令的地址,可以利用LR 寄存器。每
当响应一次SWI 的时候,处理器都会自动保存并调整LR 寄存器,使里面的内
容指向SWI 下一条指令的地址,所以把LR 里面的地址内容上溯一条指令就是
所需的SWI 指令地址。需要注意的一点是当SWI 指令的执行状态不同时,其指
令地址间隔不一样,如果进入SWI 执行前是在ARM 状态下,需要通过LR-4 来
获得SWI 指令地址,如果是在Thumb 状态下进入,则只要LR-2 就可以了。

下面是一段提取SWI 中断号码的例程:
MRS R0, SPSR ;检查进入SWI 响应前的状态
TST R0, #T_bit ;是ARM 还是Thumb?#T_bit=0x20
LDRNEH R0, [LR, #-2] ;是Thumb,读回SWI 指令码
BICNE R0, R0, #0xff00 ;提取低8 位
LDREQ R0, [LR, #-4] ;是ARM,读回SWI 指令码
BICEQ R0, R0, #0xff000000 ;提取低24 位
;寄存器R0 中的内容是正确的软中断编号了

********************************************************************************************************************************

其实上面的分析也正是软中断服务程序应该做的,这跟IRQ中断服务程序做法差不多,都要根据相应的中断号找到相应的中断处理程序。好了,明白软中断号和参数的区别了吧。

 

来自: http://hi.baidu.com/xinghun%5F4/blog/item/405133d65e0ed6d6a144dfc7.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值