裸奔的程序,用软中断来打开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,模式变为管理模式。
请问有谁知道吗?困扰了好几天了