关于中断及时钟节拍 流程图 保存当前任务的 寄存器组 中断嵌套数加1 切换到系统模式 执行中断服务程序 关中断 执行OSIntExit( ) 切换到IRQ模式 判断是否需要进行任务切换 切换任务或返回 关于中断及时钟节拍 流程图 保存当前任务的 寄存器组 中断嵌套数加1 切换到系统模式 执行中断服务程序 关中断 执行OSIntExit( ) 切换到IRQ模式 判断是否需要进行任务切换 切换任务或返回 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 ; 保存状态 ; 保存用户状态的R3,SP,LR,不能回写 STMFD SP, {R3, SP, LR}^ LDR R2, =OSIntNesting LDRB R1, [R2] ADD R1, R1, #1 STRB R1, [R2] SUB SP, SP, #4*3 ; 切换到系统模式 MSR CPSR_c, #(NoInt | SYS32Mode) CMP R1, #1 LDREQ SP, =StackUsr ... 关于中断及时钟节拍 中断嵌套层数加1 切换到系统模式,如果是第一次中断还要设置堆栈指针 压栈保存被中断任务的运行环境 关于中断及时钟节拍 流程图 保存当前任务的 寄存器组 中断嵌套数加1 切换到系统模式 执行中断服务程序 关中断 执行OSIntExit( ) 切换到IRQ模式 判断是否需要进行任务切换 切换任务或返回 中断服务程序 (ISR) 在ISR中可以打开中断实现中断嵌套 MACRO $IRQ_Label HANDLER $IRQ_Exception_Function EXPORT $IRQ_Label ; 输出的标号 IMPORT $IRQ_Exception_Function ; 引用的外部标号 $IRQ_Label ... BL $IRQ_Exception_Function ; 切换到系统模式 MSR CPSR_c, #(NoInt | SYS32Mode) ; OsEnterSum,使OSIntExit退出时中断关闭 LDR R2, =OsEnterSum MOV R1, #1 STR R1, [R2] BL OSIntExit ; 因为中断服务程序要退出,所以OsEnterSum=0 LDR R2, =OsEnterSum MOV R1, #0 STR R1, [R2] ; 切换回irq模式,并恢复用户状态的R3,SP,LR MSR CPSR_c, #(NoInt | IRQ32Mode) LDMFD SP, {R3, SP, LR}^ ; 注意不能回写 ... 关于中断及时钟节拍 关闭中断 执行中断服务程序(ISR) 使OSEnterSum为1,防止在OSIntExit函数中打开中断 通知系统,中断退出 使OSEnterSum为0,运行中断打开 恢复任务的R3、SP和LR 关于中断及时钟节拍 流程图 保存当前任务的 寄存器组 中断嵌套数加1 切换到系统模式 执行中断服务程序 关中断 执行OSIntExit( ) 切换到IRQ模式 判断是否需要进行任务切换 切换任务或返回 MACRO $IRQ
原创力文档

文档评论(0)