主题 : 请教关于软中断的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 11127
精华: 0
发帖: 28
金钱: 145 两
威望: 32 点
综合积分: 56 分
注册时间: 2009-11-27
最后登录: 2014-01-22
楼主  发表于: 2009-12-12 20:17

 请教关于软中断的问题

裸奔的程序,用软中断来打开IRQ中断,具体的程序时这样的
启动代码中的有关程序段
/* 异常向量表 */
Vectors
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0
        LDR     PC, IRQ_Addr
        LDR     PC, FIQ_Addr

ResetAddr           DCD     ResetInit
UndefinedAddr       DCD     Undefined
SWI_Addr            DCD     SoftwareInterrupt
......


; /* 未定义指令 */
Undefined
        B       Undefined
        

; /* 软中断 */
SoftwareInterrupt                                          
        CMP     R0, #4
        LDRLO   PC, [PC, R0, LSL #2]
        MOVS    PC, LR

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

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

IRQEnable
        ; 开IRQ中断
        MRS     R0, SPSR
        BIC     R0, R0, #I_BIT
        MSR     SPSR_c, R0
        MOVS    PC, LR
......

C语言程序中的相关代码段
// 使能/禁能IRQ、FIQ中断
__swi(0x00) void SwiHandle1(int Handle);

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



main函数中的相关代码段
......
IRQEnable();                // 使能IRQ中断(CPSR)    
......
使用ARMUL仿真的时候是没问题,但是连接开发板,一运行到
IRQEnable();

程序便会报错,具体错误信息是uncognized SWI, PC停在0X00000008,模式变为管理模式。
请问有谁知道吗?困扰了好几天了
        
级别: 新手上路
UID: 63601
精华: 0
发帖: 21
金钱: 105 两
威望: 21 点
综合积分: 42 分
注册时间: 2012-02-22
最后登录: 2014-06-13
1楼  发表于: 2012-05-14 14:42
你猜。。。。。。。。