嵌入式學習筆記 -函數嵌套時以及異常響應時,LR使用的具體過程

函數嵌套時以及異常響應時,寄存器LR的作用存在顯著區別,理解這個問題對于理解freeRTOS底層代碼的實現大有幫助,具體使用過程如下:

一 函數嵌套時的LR使用的具體過程

在ARM架構(特別是M0處理器)中,函數嵌套調用時LR(Link Register)寄存器的處理過程如下:

1 基本調用機制

當使用BL指令調用函數時,處理器在進行跳轉之前,會將當前函數的下一條地址,即(PC+4)的地址,存入LR寄存器,

被調函數執行完畢函數返回時,通過MOV pc,lr 指令加載LR寄存器的值到PC寄存器,實現函數返回。

2 函數嵌套時的處理過程

每次BL調用時LR都會被新的返回值覆蓋,

內層函數調用前需要對原LR值進行保存,通常壓棧。以下是一個具體示例:

main:
? ? BL outer_func
? ? B .

outer_func:
? ? PUSH {LR} ? ? ? ; 保存返回地址
? ? BL inner_func
? ? POP {LR} ? ? ? ?; 恢復LR
? ? BX LR

inner_func:
? ? ; 函數體
? ? BX LR

從以上紅色字體可以看出,最后一層函數在返回時,是先執行BX lr指令返回,然后再執行出棧操作恢復包括上一層函數返回地址寄存器LR在內的所有棧內容。

二 異常發生時,LR的使用機制

以FreeRTOS操作系統為例,LR工作在異常返回機制狀態下:

?1. LR寄存器(R14)的作用

  • ARM Cortex-M架構中,LR寄存器在觸發異常(如SVC)時會被自動設置為特殊的EXC_RETURN值。該值包含兩部分信息:
    • ?異常返回模式?:標識返回后使用MSP(主棧指針)還是PSP(進程棧指針);
    • ?棧幀類型?:指示硬件需要恢復的寄存器集合。
  • 在FreeRTOS任務切換場景中,EXC_RETURN通常設置為使用PSP,并觸發硬件自動從任務棧恢復上下文。

2.?BX R14的執行邏輯

中斷返回時,BX R14的執行邏輯,通常不是直接將LR寄存器的值賦值給PC寄存器,而是通過EXC_RETURN觸發異常返回流程,此時處理器會:

  1. 根據EXC_RETURN確定使用PSP作為棧指針;
  2. 從PSP指向的任務棧中彈出保存的寄存器(包括R0-R3、R12、LR、PC、xPSR);
  3. 將PC設置為任務入口地址(即任務函數指針)。

以下為freeRTOS代碼示例:

SVC異常:

PendSV異常:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81520.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81520.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81520.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java String函數的使用

文章目錄 String字符串比較字符串查找轉化字符串替換字符串拆分字符串截取(常用)字符串的不可變性 String str本來是字符串常量的引用,應該打印地址,但是編譯器重寫了toString方法,所以打印hello String 的構造方法 …

Oracle 11G RAC重啟系統異常

vmware安裝centos7環境部署Oracle RAC (11.2.0.4) 部署時所有資源情況都是正常的,關機重啟虛擬機后集群資源狀態異常,請教CSDN大佬 – 部署規劃 域名地址備注rac16192.168.31.16rac17192.168.31.17rac16vip192.168.31.26viprac17vip192.168.31.27vip…

吉林省CCPC與全國邀請賽(東北地區賽)游記

總述: 本次賽段共獲得一銀(吉林省賽)、一銅(東北地區賽)、一鐵(全國邀請賽的成績)。總體成績跟校內賽的情況相比隊伍狀態與發揮水準都有提升),但也體現出很多不足&#x…

「Python教案」循環語句的使用

課程目標 1.知識目標 能使用for循環和while循環設計程序。能使用循環控制語句,break、continue、else設計程序。能使用循環實際問題。 2.能力目標 能根據需求合適的選擇循環結構。能對嵌套循環代碼進行調試和優化。能利用循環語句設計&am…

OpenCV---findCountours

一、基本概念與用途 findContours是OpenCV中用于在二值圖像中查找輪廓的核心函數。輪廓作為連續的點集,能夠精確勾勒出物體的邊界,廣泛應用于目標檢測、形狀分析、圖像分割等領域。 函數核心價值 目標檢測:通過輪廓定位圖像中的物體&#…

20250523-BUG:無法加載“GameLib/Framework.h“頭文件(已解決)

BUG:無法加載"GameLib/Framework.h"頭文件(已解決) 最近在打開新的C項目時報了這個錯,我是按照以下步驟來排除的BUG,希望對您有所幫助~ 檢查【C/C】-【附加包含目錄】中的路徑有無問題,一般需要加…

商品條形碼查詢接口如何用C#進行調用?

一、什么是商品條碼查詢接口? 1974年6月26日,美國俄亥俄州的一家超市首次使用商品條碼完成結算,標志著商品條碼正式進入商業應用領域。這項技術通過自動識別和數據采集,極大提升了零售行業的作業效率,減少了人工錄入錯…

SD07_NVM的安裝及相關操作

以下是在 Windows 系統 上使用 NVM(Node Version Manager) 管理多個 Node.js 版本的詳細步驟,從零開始操作: 一、準備工作 卸載舊版 Node.js 打開 控制面板 → 程序和功能,找到已安裝的 Node.js 和 npm,徹底…

OSI 深度安全防御體系架構深度剖析

文章目錄 前言什么是 OSI 深度安全防御體系架構各層的安全防御措施物理層數據鏈路層網絡層傳輸層會話層表示層應用層 OSI 深度安全防御體系架構的優勢全方位防護深度防御靈活性和可擴展性 總結 前言 大家好,我是沛哥兒。今天咱們來深入探討一下 OSI 深度安全防御體…

大模型應用:開發移動端頁面個人中心頁面提示詞

角色 你是一個移動端web頁面開發專家,擅長開發移動端頁面,使用原生web技術(html,css,js),開發的頁面針對手機移動端友好 技術棧 使用基礎的Html,CSS,JavaScript方案實現&#xff…

從零到一:影刀RPA學習者的破局之路

1. 學習目標與預期差距分析 1.1 官方課程學習目標梳理 影刀RPA的官方課程旨在幫助學習者掌握RPA(機器人流程自動化)的基本概念、操作技能和常見應用場景。課程內容通常包括: RPA基礎理論:介紹RPA的定義、優勢、發展歷程以及與其…

計算機組成與體系結構:硬盤驅動器(Hard Disk Drives)

目錄 💽 硬盤驅動器(HDD):傳統的固定輔助存儲設備 什么是硬盤驅動器? 硬盤的工作原理 HDD 的物理結構 Disk Pack(盤組) Tracks(磁道) Cylinders(柱面&…

GitCode鏡像倉庫批量下載開發實錄

GitCode作為國內領先的開源代碼托管平臺,其鏡像倉庫批量下載功能對開發者生態建設與開源協作效率提升具有關鍵價值。本文基于企業級代碼資產管理需求,系統記錄從需求分析到生產部署的全周期開發實踐。內容覆蓋鏡像倉庫同步機制設計、分布式任務調度優化、…

基線配置管理:為什么它對網絡穩定性至關重要

什么是基線配置(Baseline Configuration) 基線配置(Baseline Configuration)是經過批準的標準化主設置,代表所有設備應遵循的安全、合規且運行穩定的配置基準,可作為評估變更、偏差或未授權修改的參考基準…

AJAX get請求如何提交數據呢?

在 AJAX 中使用 GET 請求提交數據,主要通過 在 URL 后拼接查詢參數 的方式實現,具體步驟如下: 1.構造帶參數的 URL 將數據以 鍵值 的形式拼接在 URL 后,多個參數間用 & 連接。例如: var url "https://exa…

基于FashionMnist數據集的自監督學習(對比式自監督學習SimCLR算法)

目錄 一,對比式自監督學習 1.1 簡介 1.2 常見算法 1.2.1 SimCLR (2020) 1.2.2 MoCo (2020) 1.2.3 BYOL (2021) 1.2.4 SimSiam (2021) 1.2.5 CLIP (2021) 1.2.6 DINO (2021) 1.2.7 SwAV (2020) 二,代碼邏輯分析 2.1 整體目標與流程 2.2 數據…

Linux:基礎指令與內涵理解(下)與權限

1.mv 作用:將文件移動、文件重命名 語法: mv (選項) 源文件/目錄 目標文件/目錄 (1)將文件/目錄移動到當前目錄的新文件/目錄(也就是重命名操作) 這里我們mv了test.txt文件到當前目錄下當前并不存在的ln.tx…

卷積神經網絡(CNN)入門學習筆記

什么是 CNN? CNN,全稱 卷積神經網絡(Convolutional Neural Network),是一種專門用來處理圖片、語音、文本等結構化數據的神經網絡。 它模仿人眼識別圖像的方式: 從局部到整體,一步步提取特征&a…

c#基礎07(調試與異常捕捉)

文章目錄 調試與異常捕捉調試異常處理C#中的異常類異常處理拋出對象 調試與異常捕捉 很多時間,寫代碼不能一擼到底,中間都是經歷過無數次的調試,才能正常正確的運行起來。.Net調試有很多方法和技巧。 調試 在C#中程序調試主要指在Visual S…

一種比較精簡的協議

鏈接地址為:ctLink: 一個比較精簡的支持C/C的嵌入式通信的中間協議。 本文采用的協議格式如下 *幀頭 uint8_t 起始字節:0XAF\ *協議版本 uint8_t 使用的協議版本號:當前為0X01\ *負載長度 uint8_t 數據段內容長…