不知你在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函數。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
原文標題:神秘的LR寄存器
文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機】歡迎添加關注!文章轉載請注明出處。
相關推薦
本文主要介紹Matlab如何實現移位寄存器,首先介紹的是移位寄存器的原理及作用,其次介紹了m序列的生成原理及m序列的matlab 仿真實現,最后介紹了Matlab如何實現移位寄存器的代碼。
發表于 04-26 09:28
?1.7w次閱讀
筆者今天來聊聊對于ARM幾個特殊寄存器的理解,FP、SP和LR。
發表于 11-22 09:02
?4310次閱讀
連接寄存器(Link Register, LR),在ARM體系結構中LR的特殊用途有兩種:一是用來保存子程序返回地址;二是當異常發生時,LR
發表于 01-27 14:21
寄存器與移位寄存器
寄存器是用來寄存數碼的邏輯部件,所以必須具備接收和寄存數碼的功能。任何一種
發表于 03-12 15:19
?59次下載
寄存器,寄存器是什么意思
寄存器定義 寄存器是中央處理器內的組成部分。寄存器是有限存貯容量
發表于 03-08 14:26
?2.2w次閱讀
數據寄存器,數據寄存器是什么意思
數據寄存器數據寄存器包括累加器AX、基址寄存器BX、計數
發表于 03-08 14:38
?1.3w次閱讀
移位寄存器,移位寄存器是什么意思
移位寄存器_
發表于 03-08 14:50
?1.8w次閱讀
寄存器與移位寄存器:介紹寄存器原理和移位寄存器的原理及實現。
發表于 05-20 11:47
?0次下載
本文開始介紹了暫存器的定義和結構組成,其次介紹了暫存器分類與寄存器定義,最后介紹了寄存器的原理。
發表于 04-11 09:30
?1.6w次閱讀
8086有14個16位寄存器,這14個寄存器按其用途可分為通用寄存器、指令指針、標志寄存器和段寄存器等4類。下面就來看看這四個
發表于 04-16 11:36
?1.1w次閱讀
在我們正真的讀取寄存器前,調試器需要知道一些關于x8664架構的相關知識。包括通用寄存器,專用寄存器
發表于 05-14 17:28
?1506次閱讀
工業機器人FANUC數據位置寄存器和位置寄存器的運用
一、寄存器指令 Registers① 寄存器指令R[i] i=1~200② 位置
發表于 06-22 10:08
?3.3w次閱讀
MIPS 有32個寄存器(0~31), 每個寄存器各有不同的用途。
發表于 06-23 08:59
?7834次閱讀
幾乎我們設計的每個模塊都會有寄存器,而它們的寄存器或多或少能被CPU訪問到。但CPU的接口通常只有一組總線去訪問這些模塊,所以設計上都會把CPU和各個模塊掛到總線上。這樣CPU作為Master就能夠訪問到所有的模塊了。
發表于 07-26 13:52
?1w次閱讀
寄存器是計算機中用于存儲數據的高速存儲單元,它們是CPU內部的重要組成部分。寄存器可以分為基本寄存器和擴展寄存器兩種類型。 一、基本
發表于 07-12 10:31
?1577次閱讀
評論