在IRQ中断处理宏中有以下一段代码: <br /><br /> MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式<br /> LDR R2, =OsEnterSum; OsEnterSum,使OSIntExit退出时中断关闭<br /> MOV R1, #1<br /> STR R1, [R2]<br /><br /> BL OSIntExit<br /><br /> LDR R2, =OsEnterSum ; 因为中断服务程序要退出,所以OsEnterSum=0<br /> MOV R1, #0<br /> STR R1, [R2]<br /><br />我想求教大家的是:<br /> LDR R2, =OsEnterSum; OsEnterSum,使OSIntExit退出时中断关闭<br /> MOV R1, #1<br /> STR R1, [R2]<br /><br />及<br /><br /> LDR R2, =OsEnterSum ; 因为中断服务程序要退出,所以OsEnterSum=0<br /> MOV R1, #0<br /> STR R1, [R2]<br /><br />这两个部分什么作用???我个人觉的好像是多余的···请指点·<br /><br />另:这段代码之前的:MSR CPSR_c, #(NoInt | SYS32Mode); 切换到系统模式<br /> 这条语句意义也不是很明确,请大家讲解一下,谢谢····<br /> <br />---------------------------------------------------------------------<br />文件中IRQ部分完成的代码是:<br /> CODE32<br /><br /> AREA IRQ,CODE,READONLY<br /><br /> MACRO<br />$IRQ_Label HANDLER $IRQ_Exception_Function<br /><br /> EXPORT $IRQ_Label ; 输出的标号<br /> IMPORT $IRQ_Exception_Function ; 引用的外部标号<br /><br />$IRQ_Label<br /> SUB LR, LR, #4 ; 计算返回地址<br /> STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境<br /> MRS R3, SPSR ; 保存状态<br /> STMFD SP, {R3, SP, LR}^ ; 保存用户状态的R3,SP,LR,注意不能回写<br /> ; 如果回写的是用户的SP,所以后面要调整SP<br /> LDR R2, =OSIntNesting ; OSIntNesting++<br /> LDRB R1, [R2]<br /> ADD R1, R1, #1<br /> STRB R1, [R2]<br /><br /> SUB SP, SP, #4*3<br /> <br /> MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式<br /> CMP R1, #1<br /> LDREQ SP, =StackUsr<br /> <br /> BL $IRQ_Exception_Function ; 调用c语言的中断处理程序<br /><br /> MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式<br /> LDR R2, =OsEnterSum ; OsEnterSum,使OSIntExit退出时中断关闭<br /> MOV R1, #1<br /> STR R1, [R2]<br /><br /> BL OSIntExit<br /><br /> LDR R2, =OsEnterSum ; 因为中断服务程序要退出,所以OsEnterSum=0<br /> MOV R1, #0<br /> STR R1, [R2]<br /><br /> MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切换回irq模式<br /> LDMFD SP, {R3, SP, LR}^ ; 恢复用户状态的R3,SP,LR,注意不能回写<br /> ; 如果回写的是用户的SP,所以后面要调整SP<br /> LDR R0, =OSTCBHighRdy<br /> LDR R0, [R0]<br /> LDR R1, =OSTCBCur<br /> LDR R1, [R1]<br /> CMP R0, R1<br /><br /> ADD SP, SP, #4*3 ; <br /> MSR SPSR_cxsf, R3<br /> LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换<br /> LDR PC, =OSIntCtxSw ; 进行任务切换<br /> MEND<br /> |
|