不知你在DEBUG程序,又或者閱讀操作系統源碼時候有沒細心觀察,從一個普通子函數返回與異常(中斷)返回的匯編指令都是BX LR,但是這兩者的意義是一樣的嗎?這篇文章就來揭開LR寄存器的神秘面紗。
當單片機涉及函數跳轉或者任務調度的時候,理解MCU如何處理堆棧與改變各個通用寄存器的狀態尤為重要,下面就來比較一下在不同情況下LR寄存器的意義。
上圖是一個簡單的例子,當仿真點擊“下一步”的時候,MCU就會執行BX LR指令,并且從aa子函數返回到main函數中,可以看到在普通子函數里執行BX LR的意義是“跳轉到LR寄存器里的地址執行”。
對比一下一段ucos的源碼,如果對M3內核有所了解的小伙伴一定知道堆棧為什么是這樣定義的,那么這時候我們發現OS_TaskReturn是作為一個錯誤返回函數,并且賦值到堆棧中R14(LR)相應的位置。
任務調度函數會將PSP堆棧指針指向我們定義自定義的堆棧,然后最后一句匯編是BX LR,那么按照普通子函數執行BX LR的意義,這個時候MCU是會運行OS_TaskReturn這個函數嗎?這樣不就進入錯誤函數了嗎?
其實不然,因為用M系列實現ucos的任務調度是在PendSV異常(中斷)里面實現的,而在異常(中斷)里的LR寄存器不再是普通函數里面“返回地址”的意義,而是一個定義為一個稱作exc-return的值,當執行BX LR時候,這個值決定了MCU退出異常(中斷)之后的運行等級是在特權級還是用戶級以及用的堆棧是MSP還是PSP,而MCU即將要執行的是從PSP堆棧中POP出來的p_task函數,而不是OS_TaskReturn函數。
是不是覺得很有趣,蠢蠢欲動,迫不及待想上手體驗一下呢?考慮到廣大群眾的焦慮,我司提供 LPC824仿真套餐服務,不用998,也不用99,只要49,你還在想什么呢?趕緊復制下面的淘口令打開淘寶上車吧
-
寄存器
+關注
關注
31文章
5363瀏覽量
121205 -
匯編指令
+關注
關注
0文章
38瀏覽量
11512 -
LPC824
+關注
關注
0文章
8瀏覽量
5288
發布評論請先 登錄
相關推薦
寄存器間接尋址和寄存器尋址的區別
寄存器的類型和作用
寄存器是什么意思?寄存器是如何構成的?
![<b class='flag-5'>寄存器</b>是什么意思?<b class='flag-5'>寄存器</b>是如何構成的?](https://file1.elecfans.com/web2/M00/00/2C/wKgZomasr0-AZeFEAAQm5QfLT8M176.png)
北斗衛星時鐘——揭開“授時”的神秘面紗
![北斗衛星時鐘——<b class='flag-5'>揭開</b>“授時”的<b class='flag-5'>神秘</b><b class='flag-5'>面紗</b>](https://file1.elecfans.com/web2/M00/FE/6F/wKgZomaiCpSAQWovAACH0bDFnX4749.png)
寄存器尋址的實現方式
寄存器分為基本寄存器和什么兩種
xAI公司將在八月揭開其新Grok-2大語言模型的神秘面紗
揭開Pluto XZU20的神秘面紗—探尋未來緊湊而強大的FPGA解決方案
![<b class='flag-5'>揭開</b>Pluto XZU20的<b class='flag-5'>神秘</b><b class='flag-5'>面紗</b>—探尋未來緊湊而強大的FPGA解決方案](https://file.elecfans.com/web2/M00/72/C1/poYBAGNXQoOAUojlAAA6Yo1bG0M913.jpg)
評論