LPC2000系列中断嵌套处理
ARM的中断管理体系与51系列微控制器不一样。ARM的中断不会自动嵌套,要自己相应代码保护中断寄存器入口的现场,以及后面的回复现场等。ZLG提供的代码中提到了关于中断嵌套现场保护的代码,如下:
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
CODE32
AREA IRQ,CODE,READONLY
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ; 输出的标号
IMPORT $IRQ_Exception_Function ; 引用的外部标号
$IRQ_Label
SUB LR, LR, #4 ; 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
MRS R3, SPSR ; 保存状态
STMFD SP, {R3,LR}^ ; 保存SPSR和用户状态的SP,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
NOP
SUB SP, SP, #4*2
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式
BL $IRQ_Exception_Function ; 调用c语言的中断处理程序
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切换回irq模式
LDMFD SP, {R3,LR}^ ; 恢复SPSR和用户状态的SP,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
MSR SPSR_cxsf, R3
ADD SP, SP, #4*2 ;
LDMFD SP!, {R0-R3, R12, PC}^ ;
MEND
;/* 以下添加中断句柄,用户根据实际情况改变 */
;/* Add interrupt handler here,user could change it as needed */
;/*中断*/
;IRQ_Handler HANDLER IRQ_Exception
我们仅需要在下面添加中断句柄即可。
对于中断嵌套的编写,应按以下方式实现:
1、保存当前中断使能寄存器VICIntEnable的值;
2、禁止当前中断;
3、清楚中断逻辑;
4、使能VIC,使之能响应其他中断;
5、中断处理服务程序;
6、恢复保存的中断使能寄存器的值。
中断嵌套中,并不分优先级的高低,高优先级的中断可嵌套低优先级的中断。特别要注意,要明确自己的中断编写,否则可能中断嵌套混乱出错。不建议多层中断嵌套。
阅读(1117) | 评论(0) | 转发(0) |