不知你在DEBUG程序,又或者閱讀操作系統(tǒng)源碼時候有沒細心觀察,從一個普通子函數(shù)返回與異常(中斷)返回的匯編指令都是BX LR,但是這兩者的意義是一樣的嗎?這篇文章就來揭開LR寄存器的神秘面紗。
當(dāng)單片機涉及函數(shù)跳轉(zhuǎn)或者任務(wù)調(diào)度的時候,理解MCU如何處理堆棧與改變各個通用寄存器的狀態(tài)尤為重要,下面就來比較一下在不同情況下LR寄存器的意義。
上圖是一個簡單的例子,當(dāng)仿真點擊“下一步”的時候,MCU就會執(zhí)行BX LR指令,并且從aa子函數(shù)返回到main函數(shù)中,可以看到在普通子函數(shù)里執(zhí)行BX LR的意義是“跳轉(zhuǎn)到LR寄存器里的地址執(zhí)行”。
對比一下一段ucos的源碼,如果對M3內(nèi)核有所了解的小伙伴一定知道堆棧為什么是這樣定義的,那么這時候我們發(fā)現(xiàn)OS_TaskReturn是作為一個錯誤返回函數(shù),并且賦值到堆棧中R14(LR)相應(yīng)的位置。
任務(wù)調(diào)度函數(shù)會將PSP堆棧指針指向我們定義自定義的堆棧,然后最后一句匯編是BX LR,那么按照普通子函數(shù)執(zhí)行BX LR的意義,這個時候MCU是會運行OS_TaskReturn這個函數(shù)嗎?這樣不就進入錯誤函數(shù)了嗎?
其實不然,因為用M系列實現(xiàn)ucos的任務(wù)調(diào)度是在PendSV異常(中斷)里面實現(xiàn)的,而在異常(中斷)里的LR寄存器不再是普通函數(shù)里面“返回地址”的意義,而是一個定義為一個稱作exc-return的值,當(dāng)執(zhí)行BX LR時候,這個值決定了MCU退出異常(中斷)之后的運行等級是在特權(quán)級還是用戶級以及用的堆棧是MSP還是PSP,而MCU即將要執(zhí)行的是從PSP堆棧中POP出來的p_task函數(shù),而不是OS_TaskReturn函數(shù)。
原文標題:神秘的LR寄存器
文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
一文解析Matlab如何實現(xiàn)移位寄存器

lr寄存器
數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思
一文看懂暫存器和寄存器的區(qū)別
一文看懂8086CPU寄存器的特點和作用

開發(fā)一個Linux調(diào)試器就必須要知道寄存器和內(nèi)存!
工業(yè)機器人FANUC數(shù)據(jù)位置寄存器和位置寄存器的運用小知識分享

評論