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