今天看uCOS任务切换的汇编代码,在PendSV异常中任务代码最后一行:
BX LR ; Exception return will restore remaining context
; 如果是从异常返回到线程状态,则使用新的PSP 的值作为栈顶指针
这里我的理解是从新任务的堆栈中取出R14(即LR的值),然后PC指向新的代码地址。
总结之:堆栈中新LR值弹出给LR寄存器——LR值给PC——程序跳转
而普通函数调用时:
main ;主程序
.
BL function1 ;调用function1
.
function1
.
BX LR ;函数返回
如果是没有嵌套调用的话,LR中存储的就是函数应该返回的地址,然后将该值直接赋给PC
总结之:LR值给PC——程序跳转
那么普通调用与异常返回时BX LR的区别是异常返回需要从堆栈中弹出已保存的LR的值到LR寄存器,然后才能跳转,而普通函数调用则是直接跳转,
不知我这么理解对不对? |