|
在IRQ处理函数起始处通过如下所示汇编代码进行现场保护,处理完毕后再进行恢复。
同时在保护好现场后需要将优先级等于或小于本身的IRQ中断禁掉,恢复现场后再将相应中断打开。中断关闭打开操作可以通过VIM进行。这样就可以实现高优先IRQ的
嵌套处理。
#pragma INTERRUPT(rtiCompare0Interrupt, IRQ)
void rtiCompare0Interrupt(void)
{
/* USER CODE BEGIN (39) */
/* USER CODE END */
rtiREG1->INTFLAG = 1U;
asm(" STMFD SP!, {R0-R12, LR}");/*Save R0- R12, LR_irq*/
asm(" mrs lr, spsr"); /* Copy SPSR_irq to LR */
asm(" STMFD SP!, {LR}"); /* Save SPSR_irq */
asm(" MSR CPSR_c, #0x1F"); /* Enable IRQ (Sys Mode) */
asm(" STMFD SP!, {LR}"); /* Save LR */
rtiDisableNotification(rtiNOTIFICATION_COMPARE0);/*Disable rtiCompare1 Interrupt iteself */
rtiNotification(rtiNOTIFICATION_COMPARE0);
//asm(" LDMFD SP!, {R0-R12}");/*Restore R0-R12*/
asm(" LDMFD SP!, {LR}"); /* Restore LR */
asm(" MSR CPSR_c, #0x92"); /* Disable IRQ (IRQ Mode) */
asm(" LDMFD SP!, {LR}"); /* Restore SPSR_irq to LR */
asm(" MSR SPSR_cxsf, LR"); /* Copy LR to SPSR_irq */
asm(" LDMFD SP!, {R0-R12, LR}");/* Restore LR */
rtiEnableNotification(rtiNOTIFICATION_COMPARE0);/*Enable rtiCompare1 Interrupt */
}
记得做好保护啥 |
|