【ARMv7】系統復位上電后的程序執行過程

引子:

? ? 對于ARMv7-M系列SOC來說,上電后程序復位執行的過程相對來說比較簡單,因為絕大部分芯片,都是XIP(eXecute In Place,就地執行)模式執行程序,不需要通過BooROM->PL(preloader)->SBL(second bootloader)->Kernel這樣的復雜加載過程。XIP的程序復位執行的總體流程如下圖(以STM32F407為例):

階段1:硬件自動初始化

1. SOC上電或復位

  • 當STM32F407上電或接收到復位信號時,芯片開始啟動過程

  • 內部電壓調節器、時鐘系統開始工作

2. CPU讀取地址 0x0000_0000

  • ARM Cortex-M4內核從內存映射的0x0000_0000地址讀取第一個值

  • 在STM32F407中,這個地址映射到Flash存儲器起始位置(0x0800_0000)

  • 讀取的值被加載到主堆棧指針(MSP)中

3. 加載值到MSP

  • 讀取的32位值作為初始堆棧指針值

  • 堆棧通常設置在RAM的起始位置加上棧大小(如0x2000_0000 + RAM大小)

4. CPU讀取地址 0x0000_0004

  • CPU繼續讀取下一個32位地址(0x0000_0004)

  • 這個地址包含復位向量的值

5. 加載值到PC(復位向量)

  • 從0x0000_0004讀取的值被加載到程序計數器(PC)

  • 這個值指向Reset_Handler函數的地址

  • CPU開始執行Reset_Handler處的代碼

階段2:軟件初始化(Reset_Handler)

6. PC跳轉到Reset_Handler()

  • CPU開始執行啟動文件(如startup_stm32f407xx.s)中的Reset_Handler函數

  • 這是芯片上電后執行的第一段程序代碼

7. 堆棧設置判斷

  • 檢查是否需要設置多堆棧(進程堆棧PSP)

  • 對于大多數應用,只使用主堆棧(MSP)

8. C環境設置

復制.data段從Flash到RAM
  • 將已初始化的全局變量和靜態變量從Flash復制到RAM

  • 使用鏈接器定義的符號:

    • _sidata: .data段在Flash中的起始地址

    • _sdata: .data段在RAM中的起始地址

    • _edata: .data段在RAM中的結束地址

在RAM中清零.bss段
  • 將未初始化的全局變量和靜態變量所在的內存區域清零

  • 使用鏈接器定義的符號:

    • _sbss: .bss段的起始地址

    • _ebss: .bss段的結束地址

9. 系統初始化

調用SystemInit()函數
  • 在system_stm32f4xx.c文件中定義

  • 關鍵配置:

    • 時鐘配置:啟用PLL,設置系統時鐘為168MHz

    • 總線分頻器:配置AHB、APB1、APB2總線時鐘

    • Flash延遲:設置Flash等待狀態,確保在高速時鐘下可靠運行

    • 電源控制:配置電源管理相關設置

10. (可選)初始化C庫

  • 如果需要,初始化C標準庫

  • 設置堆(heap)和標準I/O等

階段3:應用程序啟動

11. 跳轉到main()函數

  • 所有初始化完成后,跳轉到用戶編寫的main()函數

  • 此時:

    • 時鐘系統已正確配置

    • 內存已正確初始化

    • 外設寄存器處于默認狀態

12. C應用程序運行

  • 用戶應用程序開始執行

  • 可以安全地初始化外設、創建任務、處理中斷等

STM32F407特定細節

  • Flash基地址:0x0800_0000

  • RAM基地址:0x2000_0000(112KB或192KB,取決于型號)

  • 系統時鐘:最高168MHz

  • 向量表:位于Flash起始位置,包含中斷服務例程的地址

? ? 這個啟動過程確保了硬件和軟件環境在main()函數執行前都已正確初始化,為應用程序提供了穩定可靠的運行基礎。

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

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

相關文章

神經網絡的初始化:權重與偏置的數學策略

在深度學習中,神經網絡的初始化是一個看似不起眼,卻極其重要的環節。它就像是一場漫長旅程的起點,起點的選擇是否恰當,往往決定了整個旅程的順利程度。今天,就讓我們一起深入探討神經網絡初始化的數學策略,…

第 16 篇:服務網格的未來 - Ambient Mesh, eBPF 與 Gateway API

系列文章:《Istio 服務網格詳解》 第 16 篇:服務網格的未來 - Ambient Mesh, eBPF 與 Gateway API 本篇焦點: 反思當前主流 Sidecar 模式的挑戰與權衡。 深入了解 Istio 官方的未來演進方向:Ambient Mesh (無邊車模式)。 探討革命性技術 eBPF 將如何從根本上重塑服務網格的…

擺動序列:如何讓數組“上下起伏”地最長?

文章目錄摘要描述題解答案題解代碼分析代碼解析示例測試及結果時間復雜度空間復雜度總結摘要 今天我們要聊的是 LeetCode 第 376 題 —— 擺動序列。 題目的意思其實很有意思:如果一個序列里的相鄰差值能保持正負交替,就叫做“擺動”。比如 [1, 7, 4, 9…

玩轉Docker | 使用Docker部署KissLists任務管理工具

玩轉Docker | 使用Docker部署KissLists任務管理工具 前言 一、KissLists介紹 KissLists簡介 KissLists核心特點 KissLists注意事項 二、系統要求 環境要求 環境檢查 Docker版本檢查 檢查操作系統版本 三、部署KissLists服務 下載KissLists鏡像 編輯部署文件 創建容器 檢查容器狀…

【滑動窗口】C++高效解決子數組問題

個人主頁 : zxctscl 專欄 【C】、 【C語言】、 【Linux】、 【數據結構】、 【算法】 如有轉載請先通知 文章目錄前言1 209. 長度最小的子數組1.1 分析1.2 代碼2 3. 無重復字符的最長子串2.1 分析2.2 代碼3 1004. 最大連續1的個數 III3.1 分析3.2 代碼4 1658. 將 x …

[rStar] 搜索代理(MCTS/束搜索)

第2章:搜索代理(MCTS/束搜索) 歡迎回到rStar 在前一章中,我們學習了求解協調器,它就像是解決數學問題的項目經理。 它組織整個過程,但本身并不進行"思考",而是將這項工作委托給其專家團隊。 今天&#x…

Electron 核心模塊速查表

為了更全面地覆蓋常用 API,以下表格補充了更多實用方法和場景化示例,同時保持格式清晰易讀。 一、主進程模塊 模塊名核心用途關鍵用法 示例注意事項app應用生命周期管理? 退出應用:app.quit()? 重啟應用:app.relaunch() 后需…

Qt C++ 圖形繪制完全指南:從基礎到進階實戰

Qt C 圖形繪制完全指南:從基礎到進階實戰 前言 Qt框架提供了強大的2D圖形繪制能力,通過QPainter類及其相關組件,開發者可以輕松實現各種復雜的圖形繪制需求。本文將系統介紹Qt圖形繪制的核心技術,并通過實例代碼演示各種繪制技巧…

二分搜索邊界問題

在使用二分搜索的時候&#xff0c;更新條件不總是相同&#xff0c;雖然說使用bS目的就是為了target&#xff0c;但也有如下幾種情況&#xff1a;求第一個target的索引求第一個>target的索引求第一個>target的索引求最后一個target的索引求最后一個<target的索引求最后…

【springboot+vue3】博客論壇管理系統(源碼+文檔+調試+基礎修改+答疑)

目錄 一、整體目錄&#xff1a; 項目包含源碼、調試、修改教程、調試教程、講解視頻、開發文檔&#xff08;項目摘要、前言、技術介紹、可行性分析、流程圖、結構圖、ER屬性圖、數據庫表結構信息、功能介紹、測試致謝等約1萬字&#xff09; 二、運行截圖 三、代碼部分&…

20250907_梳理異地備份每日自動巡檢Python腳本邏輯流程+安裝Python+PyCharm+配置自動運行

一、邏輯流程(autocheckbackup.py在做什么) 1.連接Linux服務器 用 paramiko 登錄你配置的 Linux 服務器(10.1.3.15, 10.1.3.26),進入指定目錄(如 /home, /backup/mes),遞歸列出文件。 采集到的信息:服務器IP、目錄、數據庫名稱、文件名、大小、修改時間。 2.連接Wind…

terraform-state詳解

一、Treeaform-state的作用 Terraform-state是指Terroform的狀態&#xff0c;是terraform不可缺少的生命周期元素。本質上來講&#xff0c;terraform狀態是你的基礎設施配置的元數據存儲庫&#xff0c;terraform會把它管理的資源狀態保存在一個狀態文件里。 默認情況下&#xf…

四、kubernetes 1.29 之 Pod 生命周期

一、概述當容器與 pause 容器共享網絡&#xff08;Network&#xff09;、IPC&#xff08;進程間通信&#xff09;和 PID&#xff08;進程命名空間&#xff09;后&#xff0c;二者形成了一種緊密的 "共享命名空間" 關系&#xff0c;共同構成了 Kubernetes 中 "Po…

AI與環保:禮貌用語背后的能源挑戰與解決方案

程序員的技術管理推薦閱讀 窄化效應&#xff1a;程序員與管理者的隱形情緒陷阱 從“激勵”到“保健”&#xff1a;80后與90后程序員&#xff0c;到底想要什么&#xff1f; 從“激勵”到“保健”&#xff1a;80后與90后程序員&#xff0c;到底想要什么&#xff1f; 場景引入&…

OpenCV C++ 特征提取:從角點檢測到對象識別

特征提取是計算機視覺的核心技術,通過識別圖像中具有代表性的關鍵點及其描述信息,實現圖像匹配、對象識別、姿態估計等高級任務。本章將系統講解從基礎的圖像金字塔、角點檢測,到復雜的 ORB 和 SIFT 特征提取與匹配,最終實現基于特征的對象檢測完整流程。 一、圖像金字塔 …

Codeforces Round 1049 (Div. 2) D題題解記錄

大致題意&#xff1a;給定nnn個區間(li,ri)(l_i,r_i)(li?,ri?)。每次選取兩個尚未被標記的區間(l1,r1)(l_1,r_1)(l1?,r1?)與(l2,r2)(l_2,r_2)(l2?,r2?)&#xff0c;使得他們均被標記&#xff0c;同時可以任選x∈[l1,r1]&#xff0c;y∈[l2,r2]x\in[l_1,r_1]&#xff0c;y…

《WINDOWS 環境下32位匯編語言程序設計》第15章 注冊表和INI文件

15.1 注冊表和INI文件簡介在一個操作系統中&#xff0c;無論是操作系統本身還是運行于其中的大部分應用程序&#xff0c;都需要使用某種方式保存配置信息。在DOS系統中&#xff0c;配置信息往往是軟件的開發者根據自己的喜好用各種途徑加以保存的&#xff0c;比如在磁盤上面寫一…

JDK 17、OpenJDK 17、Oracle JDK 17 的說明

Java生態系統的核心概念&#xff1a;簡單來說&#xff1a;JDK 17 是一個標準規范&#xff0c;定義了Java開發工具包第17個長期支持版應該包含什么功能。openjdk-17-jdk 是一個具體的實現&#xff0c;是遵循上述規范、由OpenJDK社區提供的開源軟件包。下面我們通過一個表格和詳細…

手寫MyBatis第58彈:如何優雅輸出可執行的SQL語句--深入理解MyBatis日志機制:

&#x1f942;(???)您的點贊&#x1f44d;?評論&#x1f4dd;?收藏?是作者創作的最大動力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;點贊&#x1f44d;收藏??留言&#x1f4dd;歡迎留言討論 &#x1f525;&#x1f525;&…

Spring Boot 監控實戰:集成 Prometheus 與 Grafana,打造全方位監控體系

前言 在當今微服務架構盛行的時代&#xff0c;應用程序的監控變得尤為重要。Spring Boot 作為廣泛使用的微服務框架&#xff0c;其監控需求也日益增加。Prometheus 和 Grafana 作為開源監控領域的佼佼者&#xff0c;為 Spring Boot 應用提供了強大的監控能力。本文將詳細介紹如…