uc/os 上下文切换
;ARM处理器任务上下文的切换汇编语言函数OS_TSK_SW(): ;指令说明:STMFD,是按照高地址->低地址存储,并且指针往前-4. STMFD sp!,{pc} ; 保存当前任务PC的任务栈区 STMFD SP!,{lr} ; 保存当前任务LR,即当前任务的返回地址,即任务栈区 STMFD SP!,{ro-r12}; 保存R0...R12到任务栈区 MRS R4,CPSR; R4用作中间暂存数据寄存器 STMFD SP!,{R4}; 保存CPSR到任务栈区 MRS R4,SPSR; R4用作中间暂存数据寄存器 STMFD SP!{R4}; 保存SPSR到任务栈区 LDR R4,addr_OSPrioCur; 将当前任务的优先级变量送入R4寄存器 LDR R5,addr_OSPrioHighRby; 将保存就绪任务最高优先级的变量送入到R5的寄存器 LDRB R6,[R5]; R5间接寻址,将就绪任务最高优先级的变量送入到R6寄存器 STRB R6,[R4]; R4简洁寻址,将就绪任务的最高优先级赋给当前任务优先级变量 ;上述实现了INT8U整数变量的赋值:addr_OSPrioCur=addr_OSPrioHighRby; LDR R4,addr_OSTCBCur; 将指向当前任务TCB的指针地址存入到R4寄存器 ;此时R4的值为OSTCRCur指针的地址 LDR R5,[R4]; R4间接寻址,将指向当前任务的TCB指针存入到R5寄存器 ;此时R5的值为OSTCBCur指针,即指向当前任务控制块的指针 STR SP,[R5]; R5间接寻址,将处理器栈区指针寄存器(R13)的值 ;存入到当前任务TCB的起始地址(零偏移地址) LDR R6,addr_OSTCBHighBy; R6=就绪表中当前优先级最高任务的TCB指针的地址 LDR R6,[R6]; 将就绪表中最高优先级任务TCB指针存入到R6中 LDR SP,[R6]; 将HP任务TCB指针所指向的内存单元的值送入到Sp寄存器, ;也就是将最高优先级任务TCB中保存的自用栈区指针存入Sp寄存器 STR R6,[R4]; 将最高优先级任务TCB指针赋给当前任务指针变量 ;实现了TCB指针的赋值:OSTCBCur=OSTCBHighRby ;以下指令把保存最高优先级任务自用栈区的各个寄存器弹出到CPU的各个寄存器 LDRFD SP!,{R4}; 将栈顶的字元素弹出到R4寄存器中 MSR SPSR_IRQ,R4; 该弹出字原先保存的SPSR_IRQ,从R4寄存器中进行恢复 LDRFD SP!,{R4}; 将栈顶的字元素弹出到R4寄存器中 MSR CPSR_IRQ,R4; 该弹出字原先保存的CPSR_IRQ,从R4寄存器中进行恢复 LDRFD SP!,{R0-R12,LR,PC}; 恢复R0-R12通用寄存器的值和LR和PC
Live together,or Die alone!