关于ARM中断处理的问题----《ARM嵌入式系统开发-软件设计与优化》第九章中疑问
各位过年好哦~
呵呵,小弟这里有点疑惑相同大家讨论讨论~,这个问题是《ARM嵌入式系统开发-软件设计与优化》一书中的见下:
第九章-中断处理
9.3.2嵌套中断
在这一节中,描述了如何处理嵌套式的中断(不能单纯的在IRQ模式下打开中断允许位),作者介绍是从IRQ模式切换到SVC模式中去处理中断,并且一如了Stack Frame的用法,书中也有相关的一点代码,对这段代码有点疑问:
Maskmd EQU 0x1f ; processor mode maskSVC32md EQU 0x13 ; SVC modeI_Bit EQU 0x80 ; IRQ bitFRAME_R0 EQU 0x00FRAME_R1 EQU FRAME_R0+4FRAME_R2 EQU FRAME_R1+4FRAME_R3 EQU FRAME_R2+4FRAME_R4 EQU FRAME_R3+4FRAME_R5 EQU FRAME_R4+4FRAME_R6 EQU FRAME_R5+4FRAME_R7 EQU FRAME_R6+4FRAME_R8 EQU FRAME_R7+4FRAME_R9 EQU FRAME_R8+4FRAME_R10 EQU FRAME_R9+4FRAME_R11 EQU FRAME_R10+4FRAME_R12 EQU FRAME_R11+4FRAME_PSR EQU FRAME_R12+4FRAME_LR EQU FRAME_PSR+4FRAME_PC EQU FRAME_LR+4FRAME_SIZE EQU FRAME_PC+4IRQ_Entry ; instruction state : commentSUB r14,r14,#4 ; 2 :STMDB r13!,{r0-r3,r12,r14} ; 2 : save context<service interrupt> BL read_RescheduleFlag ; 3 : more processingCMP r0,#0 ; 3 : if processing?LDMNEIA r13!,{r0-r3,r12,pc}? ; 4 : else returnMRS r2,spsr ; 5 : copy spsr_irqMOV r0,r13 ; 5 : copy r13_irqADD r13,r13,#6*4 ; 5 : reset stackMRS r1,cpsr ; 6 : copy cpsrBIC r1,r1,#Maskmd ; 6 :ORR r1,r1,#SVC32md ; 6 :MSR cpsr_c,r1 ; 6 : change to SVCSUB r13,r13,#FRAME_SIZE-FRAME_R4 ; 7 : make spaceSTMIA r13,{r4-r11} ; 7 : save r4-r11LDMIA r0,{r4-r9} ; 7 : restore r4-r9BIC r1,r1,#I_Bit ; 8 :MSR cpsr_c,r1 ; 8 : enable IRASTMDB r13!,{r4-r7} ; 9 : save r4-r7 SVCSTR r2,[r13,#FRAME_PSR] ; 9 : save PSRSTR r8,[r13,#FRAME_R12] ; 9 : save r12STR r9,[r13,#FRAME_PC] ; 9 : save pcSTR r14,[r13,#FRAME_LR] ; 9 : save lr<complete interrupt service routine>LDMIA r13!,{r0-r12,r14} ; 11 : restore contextMSR spsr_cxsf,r14 ; 11 : restore spsrLDMIA r13!,{r14,pc}? ; 11 : return