不知你在DEBUG程序,又或者閱讀操作系統(tǒng)源碼時候有沒細心觀察,從一個普通子函數(shù)返回與異常(中斷)返回的匯編指令都是BX LR,但是這兩者的意義是一樣的嗎?這篇文章就來揭開LR寄存器的神秘面紗。
當單片機涉及函數(shù)跳轉(zhuǎn)或者任務調(diào)度的時候,理解MCU如何處理堆棧與改變各個通用寄存器的狀態(tài)尤為重要,下面就來比較一下在不同情況下LR寄存器的意義。
上圖是一個簡單的例子,當仿真點擊“下一步”的時候,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)相應的位置。
任務調(diào)度函數(shù)會將PSP堆棧指針指向我們定義自定義的堆棧,然后最后一句匯編是BX LR,那么按照普通子函數(shù)執(zhí)行BX LR的意義,這個時候MCU是會運行OS_TaskReturn這個函數(shù)嗎?這樣不就進入錯誤函數(shù)了嗎?
其實不然,因為用M系列實現(xiàn)ucos的任務調(diào)度是在PendSV異常(中斷)里面實現(xiàn)的,而在異常(中斷)里的LR寄存器不再是普通函數(shù)里面“返回地址”的意義,而是一個定義為一個稱作exc-return的值,當執(zhí)行BX LR時候,這個值決定了MCU退出異常(中斷)之后的運行等級是在特權(quán)級還是用戶級以及用的堆棧是MSP還是PSP,而MCU即將要執(zhí)行的是從PSP堆棧中POP出來的p_task函數(shù),而不是OS_TaskReturn函數(shù)。
是不是覺得很有趣,蠢蠢欲動,迫不及待想上手體驗一下呢?考慮到廣大群眾的焦慮,我司提供 LPC824仿真套餐服務,不用998,也不用99,只要49,你還在想什么呢?趕緊復制下面的淘口令打開淘寶上車吧
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
相關推薦
電子發(fā)燒友網(wǎng)站提供《用智能DAC揭開醫(yī)療報警設計的神秘面紗.pdf》資料免費下載
發(fā)表于 09-14 10:50
?0次下載
在計算機科學中,寄存器(Register)是一個高速存儲單元,它位于中央處理器(CPU)內(nèi)部,用于存儲計算機程序執(zhí)行過程中所需要的數(shù)據(jù)、指令地址或狀態(tài)信息。寄存器是計算機體系結(jié)構(gòu)中至關
發(fā)表于 08-02 18:23
?2484次閱讀
,這些時間信息又是從哪里來的呢?為什么我們可以隨時隨地都能獲取準確的時間信息?這得益于高精度的 授時服務 ,今天我們就來揭開“授時”的神秘面紗。 ? ? ?大家都知道我國的北斗導航衛(wèi)星,是用于定位導航的。那么北斗是怎么進行定位導
發(fā)表于 07-25 16:21
?284次閱讀
。 一、寄存器尋址 寄存器尋址的定義 寄存器尋址是一種將操作數(shù)直接存儲在CPU內(nèi)部寄存器中的尋址
發(fā)表于 07-12 10:42
?883次閱讀
在計算機體系結(jié)構(gòu)中,寄存器尋址是一種常見的尋址方式,它允許程序直接訪問CPU內(nèi)部的寄存器。寄存器尋址可以提高程序的執(zhí)行效率,因為它避免了對內(nèi)存的訪問。
發(fā)表于 07-12 10:36
?444次閱讀
寄存器是計算機中用于存儲數(shù)據(jù)的高速存儲單元,它們是CPU內(nèi)部的重要組成部分。寄存器可以分為基本寄存器和擴展寄存器兩種類型。 一、基本
發(fā)表于 07-12 10:31
?848次閱讀
在科技界的浩瀚星空中,埃隆·馬斯克的每一次發(fā)聲都如同璀璨的新星,瞬間照亮前行的道路。近日,這位科技巨擘在推特上的一則簡短宣告,再次將全球的目光聚焦于人工智能的前沿陣地——他的初創(chuàng)公司xAI即將在八月揭開其最新力作Grok-2大語
發(fā)表于 07-02 11:38
?421次閱讀
創(chuàng)新成果具有挽救生命、改變生活和創(chuàng)造夢想的能力。現(xiàn)在讓我們一起緊隨Pluto產(chǎn)品發(fā)布會的步伐,揭開PlutoXZU20的神秘面紗,與我們一起
發(fā)表于 06-21 08:09
?266次閱讀
內(nèi)核寄存器與外設寄存器: 內(nèi)核寄存器與外設寄存器是完全不同的概念。內(nèi)核寄存器是指 CPU 內(nèi)部的寄存器
發(fā)表于 04-17 11:47
?2484次閱讀
UFP芯片是一種用于USB快充技術的關鍵元件,它在移動設備和充電器之間進行通信和協(xié)調(diào),以實現(xiàn)高效、安全、快速的充電過程。下面我們將揭開快充芯片的神秘面紗,深入探討UFP快充芯片的工作原
發(fā)表于 04-15 12:51
?513次閱讀
無論是FPGA還是ASIC,系統(tǒng)設計中總會存在配置寄存器總線的使用,我們會將各種功能、調(diào)試寄存器掛載在寄存器總線上使用。
發(fā)表于 03-04 13:56
?961次閱讀
CPU寄存器是中央處理器內(nèi)的組成部分,是有限存貯容量的高速存貯部件。寄存器是CPU內(nèi)部的元件,包括通用寄存器、專用寄存器和控制
發(fā)表于 02-03 15:15
?3344次閱讀
移位寄存器是一種用于在數(shù)字電路中實現(xiàn)數(shù)據(jù)移位操作的基本電路元件。它由多個觸發(fā)器以及相關控制電路組成,具有存儲、接受和移動數(shù)據(jù)的功能。移位寄存器可以分為兩種類型:串行移位
發(fā)表于 01-18 10:52
?6532次閱讀
16進制位關系,但是對寄存器數(shù)值的每一位并沒有很直觀的展示。因此就需要一個軟件直觀的查看寄存器值與位的關系。
發(fā)表于 11-28 12:26
?1633次閱讀
coresight對于每個coresight組件,規(guī)定了一些寄存器,這些寄存器的偏移是固定的,這些寄存器,是必須存在的。但是有的,可以不實現(xiàn)該寄存器
發(fā)表于 11-02 11:45
?974次閱讀
評論