深入理解 Cortex-M3 的內核寄存器組

每個 MCU 開發工程師一定都了解寄存器這個東西,以 STM32 為例,其擁有非常多的外設模塊,如串口、SPI、IIC 等等,如果要使用這些外設,使其按照我們的要求工作,就需要配置這些外設的寄存器,往這些寄存器中寫入對應的配置數據,從而使其工作在我們所需要的模式中。

上述寄存器都是工程師日常編程會操作的寄存器,可以說和工程師的關系非常緊密。但有這么一組寄存器,與大多數工程師的關系就很疏遠,甚至一些初學者完全不知道。

這,就是內核寄存器組

在大多數比較基礎的日常編程中你完全無需關注內核寄存器,但實際上你寫的每一行代碼,最終都是去操作內核寄存器,編譯器會負責完成這中間的轉換。并且,如果你要進行一些高級編程,如操作系統的編寫,或者做一些非常底層的優化,你就不得不去人為操作這些寄存器。

下面我們就基于 STM32F103 這款芯片來探一探其內核寄存器的究竟。

STM32F103 屬于 Cortex-M3 內核,其內核寄存器組中擁有 16 個寄存器,其中 13 個為 32 位通用寄存器,另外 3 個則有特殊用途:

圖片

R0 ~ R12

寄存器 R0?~ R12 為通用寄存器,其中前 8 個 (R0 ~ R7)也被稱為低寄存器。由于指令中的可用空間有限,許多 16 位的指令只能訪問低寄存器。

高寄存器 R8 ~ R12 則可以用于 32 位指令和幾個 16 位指令,如 MOV。

R0 ~ R12 的初始值是未定義的。

R13 棧指針 SP

R13 為棧指針,可以通過 PUSH 和 POP 指令實現棧的訪問。實際在物理上存在兩個棧指針:主棧指針 MSP(Main Stack Pointer)和進程棧指針 PSP(Process Stack Pointer)。

主棧指針(MSP)為默認的棧指針,在復位后或處理器處于特權模式(如進中斷)時會被使用。通常用于芯片初始化代碼和中斷服務函數中。

進程棧指針(PSP)只能用于線程模式。在使用支持任務或線程切換的實時操作系統(RTOS)中,PSP 用于管理用戶級任務的堆棧。這允許操作系統進行有效而穩定的任務調度,因為每個任務可以有自己的堆棧,在切換任務時只需要切換 PSP 的值即可。

大多數情況下,如果你是裸機編程,即沒有用到嵌入式操作系統,那么 PSP 也沒有必要使用。許多簡單的應用可以完全依賴于 MSP,一般在操作系統中才會使用到 PSP,因其各個任務(或線程)的棧是要求相互獨立的。

PSP 的初始值未定義,而 MSP 的初始值則會在復位流程中從存儲器的第一個字中取出。

R14?鏈接寄存器 LR

R14 也被稱作鏈接寄存器 LR,用于函數或子程序調用時返回地址的保存。

在函數或子程序被調用時,返回地址(即調用指令后面那條指令的地址)被保存到 LR 寄存器中。這樣,在函數或子程序結束時,處理器可以通過 LR 寄存器中的值返回到正確的地址繼續執行。

當執行了函數或子程序的調用后,LR 的數值會自動更新。若該函數或子程序內還要調用其他函數或子程序(如 A 調用 B,B 中還調用了 C),則此時需要將 LR 的數值保存在棧中,否則,一旦執行了 C 調用,LR 就會更新為 B 函數中調用 C 這條函數的下一條指令的地址,原本 A 調 B 的下一條指令地址就會被覆蓋丟失,從而無法再恢復到 A 函數中繼續運行。

在異常處理期間,LR 也會被自動更新為特殊的 EXC_RETURN(異常返回)數值,之后該數值會在異常處理結束時觸發異常返回,從而實現從異常處理返回到正確的用戶程序中 。

需要注意的是,盡管 Cortex-M 處理器中的返回地址總是偶數(由于指令會對齊到半字地址上,因此,最低位即第 0 位為 0),LR 的第 0 位是可讀可寫的,有些跳轉/調用操作需要將 LR(或正在使用的任何寄存器)的第 0 位置 1 來表示當前處理器處于 Thumb 狀態。

R15 程序計數器 PC

R15 為程序計數器 PC,可讀可寫。讀操作返回當前指令地址加 4(這是由于流水線特性及同 ARM7TDMI 處理器兼容的需要),而對 PC 的寫操作(例如使用數據傳輸/處理指令)則會引起程序的跳轉(不會更新 LR 寄存器)。

由于指令必須要對齊到半字或字地址,PC 的最低位(LSB)為 0.不過,在使用一些跳轉或讀存儲器指令更新 PC 時,需要將新 PC 值的 LSB 置 1 來表示 Thumb 狀態,否則就會由于試圖使用不支持的 ARM 指令(如 ARM7TDMI 中的 32 位 ARM 指令)而觸發錯誤異常。對于高級編程語言(包括 C 和 C++),編譯器會自動將跳轉目標的 LSB 置位。

多數情況下,跳轉和調用由專門的指令實現,利用數據處理指令更新 PC 的情況較為少見。不過,在訪問位于程序存儲器的字符數據時,PC的數值非常有用,因此,會經常發現存儲器的讀操作將 PC 作為基地址寄存器,而地址偏移則由指令中的立即數生成。

總結

以上就是 Cortex-M3 內核寄存器組中所有的寄存器。雖然在日常編程過程中我們很少或者可以說幾乎不會直接接觸并操作這些寄存器,一旦程序出現問題崩潰,或者運行過程中出現異常輸出或邏輯,此時這些內核寄存器就能夠為我們提供非常重要且直觀的調試分析依據,以此快速定位問題并解決。如果你不理解這些內核寄存器組,那你的問題分析過程將會變得異常艱辛,甚至最終從調試到放棄。

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

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

相關文章

網絡安全自動化:找準邊界才能筑牢安全防線

數字時代,企業每天要面對成千上萬的網絡攻擊。面對龐大的服務器群、分散的團隊和長期不重啟的設備,很多企業開始思考:哪些安全操作適合交給機器自動處理?哪些必須由人工把關?今天我們就用大白話聊聊這件事。 一、這些事…

C++負載均衡遠程調用學習之負載均衡算法與實現

目錄 01 lars 系統架構回顧 02 lars-lbAgentV0.4-route_lb處理report業務流程 03 lars-lbAgentV0.4-負責均衡判斷參數配置 04 lars-lbAgentV0.4-負載均衡idle節點的失敗率判斷 05 lars-lbAgentV0.4-負載均衡overload節點的成功率判斷 06 lars-lbAgentV0.4-負載均衡上報提交…

領略算法真諦: 多源bfs

嘿,各位技術潮人!好久不見甚是想念。生活就像一場奇妙冒險,而編程就是那把超酷的萬能鑰匙。此刻,陽光灑在鍵盤上,靈感在指尖跳躍,讓我們拋開一切束縛,給平淡日子加點料,注入滿滿的pa…

雷電模擬器-超好用的Windows安卓模擬器

一、雷電模擬器介紹 雷電模擬器是一款功能強大的軟件,它能夠在電腦上模擬出安卓手機系統,讓你可以在電腦上運行各類手機應用及游戲。其采用虛擬安卓手機操作界面,為玩家帶來了獨特的體驗。 (一)強大的兼容性 雷電模擬…

文章三《機器學習基礎概念與框架實踐》

文章3:機器學習基礎概念與框架實踐 ——從理論到代碼,用Scikit-learn構建你的第一個分類模型 一、機器學習基礎理論:三大核心類型 機器學習是人工智能的核心,通過數據讓計算機自動學習規律并做出預測或決策。根據學習方式,可分為三類: 1. 監督學習(Supervised Learni…

腦機接口技術:開啟人類與機器的全新交互時代

在科技飛速發展的今天,人類與機器的交互方式正經歷著前所未有的變革。從最初的鍵盤鼠標,到觸摸屏,再到語音控制,每一次交互方式的升級都極大地提升了用戶體驗和效率。如今,腦機接口(Brain-Computer Interfa…

8.2 GitHub企業級PDF報告生成實戰:ReportLab高級技巧與性能優化全解析

GitHub企業級PDF報告生成實戰:ReportLab高級技巧與性能優化全解析 GitHub Sentinel 高級功能實現:PDF 報告生成技術詳解 關鍵詞:PDF 報告生成, ReportLab 實戰, 結構化數據轉換, 容器化字體配置, 企業級報告模板 1. 需求分析與技術選型 PDF 報告生成需要滿足以下技術要求…

架構思維:構建高并發讀服務_基于流量回放實現讀服務的自動化測試回歸方案

文章目錄 引言一、升級讀服務架構,為什么需要自動化測試?二、自動化回歸測試系統:整體架構概覽三、日志收集1. 攔截方式2. 存儲與優化策略3. 架構進化 四、數據回放技術實現關鍵能力 五、差異對比對比方式靈活配置 六、三種回放模式詳解1. 離…

基于Spring Boot 3.0、ShardingSphere、PostgreSQL或達夢數據庫的分庫分表

要實現基于Spring Boot 3.0、ShardingSphere、PostgreSQL或達夢數據庫的分庫分表,首先需要對ShardingSphere進行一些基本配置。你提到的溯源碼、批次號等數據需要考慮到跨年數據的存儲,因此要設計一個能夠動態擴展的分表策略 添加ShardingSphere依賴 在…

位運算的應用

1. 判斷偶數&#xff0c;判斷最低位是0還是1即可&#xff0c;?求模快 x % 2 ! 0 //x正負都可以判斷&#xff1b;不?x%2 1&#xff0c;因為如果x為負奇數&#xff0c;x%2-1 (x & 0x1) 0 例如&#xff1a; int x; int main() { cin>>x; if((x & 0x1)0) cout<…

FOC算法開環控制基礎

1. 為什么要有FOC算法 先看看從有刷電機到無刷電機的簡單介紹&#xff0c;如下圖1&#xff0c;通電螺線圈會產生磁場&#xff0c;這個磁場會產生N級和S級&#xff0c;然后這個電磁鐵就可以吸引永磁體&#xff0c;S級吸引N級&#xff0c;N級吸引S級&#xff0c;通俗的來說&…

【計算機網絡】HTTP中GET和POST的區別是什么?

從以下幾個方面去說明&#xff1a; 1.定義 2.參數傳遞方式 3.安全性 4.冪等性 1.定義&#xff1a; GET&#xff1a; 獲取資源&#xff0c;通常請求數據而不改變服務器的狀態。POST&#xff1a; 提交數據到服務器&#xff0c;通常會改變服務器的狀態或副作用(如創建或更新資源…

7400MB/s5050TBW完美結合,全新希捷酷玩530R SSD體驗評測

7400MB/s&5050TBW完美結合&#xff0c;全新希捷酷玩530R SSD體驗評測 哈嘍小伙伴們好&#xff0c;我是Stark-C~ 說到希捷酷玩530 SSD&#xff0c;很多硬核進階玩家應該都知道&#xff0c;或者說正在使用&#xff08;比如說我~&#xff09;。 作為希捷大廠旗下高性能SSD的…

(undone) MIT6.S081 2023 學習筆記 (Day11: LAB10 mmap)

url: https://pdos.csail.mit.edu/6.1810/2023/labs/mmap.html mmap和munmap系統調用允許UNIX程序對其地址空間進行精細控制。它們可用于進程間共享內存、將文件映射到進程地址空間&#xff0c;并作為用戶級頁面錯誤處理方案的一部分&#xff0c;例如課程中討論的垃圾回收算法。…

Q_OBJECT宏的作用

Qt 中&#xff0c;如果一個類中定義了信號&#xff08;signals&#xff09;或槽&#xff08;slots&#xff09;&#xff0c;那么這個類必須包含 Q_OBJECT 宏。 Q_OBJECT宏是 Qt 元對象系統的核心部分&#xff0c;它使得信號和槽機制能夠正常工作。 Q_OBJECT宏是 Qt 的元對象系統…

信息安全基石:加解密技術的原理、應用與未來

信息加解密技術是信息安全領域的核心技術之一&#xff0c;以下為你詳細介紹&#xff1a; 一、加密技術 1.定義&#xff1a;加密是通過特定的算法和密鑰&#xff0c;將原始的明文信息轉化為看似無意義的密文信息的過程。這一過程使得信息在傳輸、存儲等過程中&#xff0c;即使…

LeetCode:返回倒數第k個結點

1、題目描述 實現一種算法&#xff0c;找出單向鏈表中倒數第 k 個節點。返回該節點的值。 注意&#xff1a;本題相對原題稍作改動 示例&#xff1a; 輸入&#xff1a; 1->2->3->4->5 和 k 2 輸出&#xff1a; 4 說明&#xff1a; 給定的 k 保證是有效的。 2、…

R004 -計算機硬件基礎

目錄 1.數據表示&計算機網絡組成 2.計算機網絡分類 3.馮諾依曼體系結構 4.指令系統基礎 5.指令系統類型 6.流水線技術 流水線周期 &#xff1a;各流水段中&#xff0c;執行時間最長的那一段。就是T 流水線時間&#xff1a;t 1t2t 3 (n-1) * T 7.流水線指標 8.存儲系…

Mybatis學習(下)

目錄 1. 動態sql的應用 1.2 1.2 1.3 、 、 標簽 1.4 1. 動態sql的應用 使用Mybatis框架時, 對于sql數據的操作量比較大的時候, 看著會覺得很亂, 可能寫著寫著就亂了, 或者說回過頭來發現sql語句寫錯了, 很麻煩, 所以動態sql就可以讓我們用Java代碼, 替換部分sql語句 1.2 &l…

iview 老版本合并單元格

新版的iview中已經支持了合并單元格了&#xff0c;我的版本比較老&#xff0c;為&#xff1a;"iview": "^3.5.2"。暫不支持。記錄一下別的大佬的方法。感覺思路比較活&#xff0c;正在這種思路需要在解決問題的過程中學習。 核心思路&#xff1a;通過rende…