void IRQDisable(void) { int tmp; __asm { MRS tmp, CPSR BIC tmp, tmp, #0x80 MSR CPSR_c, tmp } } /* **************************************** * 中断使能 **************************************** */
void IRQEnable(void) { int tmp; __asm { MRS tmp, CPSR ORR tmp, tmp, #0x80 MSR CPSR_c, tmp } }
以上代码在应用中会有问题, 而使用SWI 命令:
__swi(0x00) void SwiHandle1(int Handle); #define IRQDisable() SwiHandle1(0) #define IRQEnable() SwiHandle1(1)
;软中断 SoftwareInterrupt CMP R0, #2 LDRLO PC, [PC, R0, LSL #2] MOVS PC, LR
SwiFunction DCD IRQDisable ;0 DCD IRQEnable ;1 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
则正常。
没搞清楚为什么?请高手们分析分析!
|