吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

分析ARM Cortex-M內核復位啟動過程

STM32嵌入式開發 ? 來源:gaomf.cn ? 2023-03-20 09:58 ? 次閱讀

ARM Cortex-M內核的復位啟動過程也被稱為復位序列(Reset sequence),下面就來簡要總結分析下這一過程。

ARM Cortex-M內核的復位啟動過程與其他大部分CPU不同,也與之前的ARM架構(ARM920T、ARM7TDMI等)不相同。大部分CPU復位后都是從0x0000_0000處取得第一條指令開始運行的,然而在ARM Cortex-M內核中并不是這樣的。其復位序列為:

1.從地址0x0000_0000處取出MSP的初始值;

2.從地址0x0000_0004處取出PC的初始值,然后從這個值對應的地址處取指。

即下圖所示過程:

5071c8e2-c4c5-11ed-bfe3-dac502259ad0.png ??

事實上,地址0x0000_0004開始存放的就是默認中斷向量表(有些資料中將地址0x0000_0000處的MSP指針初始值也算作中斷向量表的一部分,這個說法似乎不太妥當),ARM Cortex-M內核的中斷向量表布局情況如下圖所示:
50bc09f2-c4c5-11ed-bfe3-dac502259ad0.png ????

注意:中斷向量表的位置可以改變,此處是默認情況下的設置。

值得注意的是,在ARM Cortex-M內核中,發生異常后,并不是去執行中斷向量表中對應位置處的代碼,而是將對應位置處的數據存入PC中,然后去此地址處進行取指。簡而言之,在ARM Cortex-M的中斷向量表中不應該放置跳轉指令,而是該放置ISR程序的入口地址。

有了上面的分析就很好理解復位序列了,復位其實就相當于發生了一次Reset異常,而從圖中可以看到,地址0x0000_0004處存放的正是Reset異常對應的中斷處理函數入口地址。

另外還有兩個細節問題需要注意:

1. 0x0000_0000處存放的MSP初始值最低三位需要是0;

2.0x0000_0004處存放的地址最低位必須是1。

第一個問題是因為ARM AAPCS中對棧使用的約定是這樣的:
5.2.1.1
Universal stack constraints
At all times the following basic constraints must hold:
Stack-limit < SP <= stack-base. The stack pointer must lie within the extent of the stack.
SP mod 4 = 0. The stack must at all times be aligned to a word boundary.
5.2.1.2
Stack constraints at a public interface
The stack must also conform to the following constraint at a public interface:
SP mod 8 = 0. The stack must be double-word aligned.
簡而言之,規約規定,棧任何時候都必須4字節對齊,在調用入口需8字節對齊,而且SP的最低兩位在硬件上就被置為0了。


第二個問題與ARM模式與Thumb模式有關。ARM中PC中的地址必須是32位對齊的,其最低兩位也被硬件上置0了,故寫入PC中的數據最低兩位并不代表真實的取址地址。ARM中使用最低一位來判斷這條指令是ARM指令還是Thumb指令,若最低位為0,代表ARM指令;若最低位為1,代表Thumb指令。在Cortex-M內核中,并不支持ARM模式,若強行切換到ARM模式會引發一個Hard Fault。


最后寫一段小程序來驗證下以上分析。這段程序基于STM32F4系列單片機,作用是讓PA0管腳輸出高電平。這應該也是實現這一目的最精簡的寫法了。


rAHB1ENR        EQU     0x40023830
AHB1ENRValue    EQU     0x00000001
    
rMODER          EQU     0x40020000
MODERValue      EQU     0xA8000001
    
rODR            EQU     0x40020014
ODRVaule        EQU     0x00000001


    AREA RESET, DATA, READONLY
    DCD 0x00000400
    DCD Start


    AREA |.text|, CODE, READONLY
    ENTRY


Start
    LDR R0, =rAHB1ENR
    LDR R1, =AHB1ENRValue
    STR R1, [R0]
    
    LDR R0, =rMODER
    LDR R1, =MODERValue
    STR R1, [R0]
    
    LDR R0, =rODR
    LDR R1, =ODRVaule
    STR R1, [R0]


    B .  
    END

第11行使用DCD偽指令分配了4個字節的存儲空間,并將其值設置為0x0000_0400;第12行同理,將Start標號處的地址放置在偏移量為4字節的位置處;第17行Start標號之后的部分就是程序主體,依次完成了GPIOA端口RCC時鐘使能、PA0設置為輸出模式、PA0置高這三個步驟。


程序在鏈接時會將RESET段放置在目標文件開頭,故相當于在地址0x0000_0000處的數據為0x0000_0400,在地址0x0000_0004處的數據為Start部分的入口地址。


不過需要指出的是,實際上在STM32F4芯片中,內部Flash的地址是從0x0800_0000處開始的,在BOOT管腳設置為Flash啟動的時候,芯片內部會自動將0x0000_00000 0x000F_FFFF區域映射至0x0800_0000 0x080F_FFFF處,此時可以視為二者是等價的。
使用Debug模式進行調試,復位后CPU寄存器的值如下所示:

50ee5d76-c4c5-11ed-bfe3-dac502259ad0.png ????

Flash中的數據如圖:
5100dc1c-c4c5-11ed-bfe3-dac502259ad0.png ??

可以看到,編譯器很智能的將0x0800_0004處的數據設置為了0x0800_0009,而不是Start標號真實的地址值,這說明了這是一條Thumb-2指令。復位后PC中的值是0x0800_0008,SP中的值是0x0000_0400,與預期結果完全相同。

最后順便提一下,上面那段簡單的程序有個問題,實際上Start部分的程序是占用了中斷向量表的空間,這在沒有異常發生的時候是沒有問題的,不過一旦有異常發生,顯然程序執行是會出錯的。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9165

    瀏覽量

    369170
  • 內核
    +關注

    關注

    3

    文章

    1382

    瀏覽量

    40421
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10902

    瀏覽量

    212997
  • 中斷
    +關注

    關注

    5

    文章

    900

    瀏覽量

    41746
  • Cortex-M
    +關注

    關注

    2

    文章

    229

    瀏覽量

    29841

原文標題:分析ARM Cortex-M內核復位啟動過程

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ARM Cortex-M0 DesignStart系列--4啟動過程分析

    書接上文《ARM_Cortex-M0 DesignStart系列--3rtl仿真過程的詳細分析》,本文基于hello這個case,對Cortex M
    的頭像 發表于 11-10 09:05 ?2903次閱讀
    <b class='flag-5'>ARM</b> <b class='flag-5'>Cortex-M</b>0 DesignStart系列--4<b class='flag-5'>啟動過程</b><b class='flag-5'>分析</b>

    專家揭秘:STM32啟動過程全解

    電子發燒友網核心提示: 本文主要闡述了STM32啟動過程全面解析,包括啟動過程的介紹、啟動代碼的陳列以及深入解析。 相對于ARM上一代的主流ARM
    發表于 09-10 08:50 ?5.3w次閱讀
    專家揭秘:STM32<b class='flag-5'>啟動過程</b>全解

    Cortex-M內核的GCC編譯器

    下載ARM官方對應Cortex-M內核的GCC編譯器
    發表于 08-24 06:44

    ARM Cortex-M內核的相關資料推薦

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是ARM Cortex-M功能模塊,不過側重點是三款安全特性處理器。  ARM Cortex-M處理器家族發展至今(2
    發表于 12-27 07:21

    ARM Cortex-M 系列微控制器(ST)

    ARM Cortex-M 系列微控制器(ST) 意法半導體(ST)宣布在基于ARM Cortex-M系列處理器內核的微控制器研發項目上取得
    發表于 11-02 09:29 ?963次閱讀

    嵌入式uCLinux內核啟動過程分析

    分析uCLinux的啟動過程,可以加快系統啟動速度、正確建立應用環境。本文要研究的就是uCLinux操作系統內核啟動過程
    發表于 08-15 16:51 ?796次閱讀

    傳統的單片機和ARM較量 助推MCU踏上高端Cortex-M市場

    據有關市場調研機構稱,基于ARM Cortex-M內核的MCU在2010年創紀錄地實現了100%的出貨量增長。而整個MCU市場才增長了37%。MCU市場的增長也幾乎是來自于ARM
    發表于 04-28 10:00 ?1647次閱讀

    詳解bootloader的執行流程與ARM Linux啟動過程分析

    S3C2410 ARM處理器為例,詳細分析了系統上電后 bootloader的執行流程及 ARM Linux的啟動過程
    的頭像 發表于 12-21 09:24 ?1.1w次閱讀
    詳解bootloader的執行流程與<b class='flag-5'>ARM</b> Linux<b class='flag-5'>啟動過程</b><b class='flag-5'>分析</b>

    Atmel Studio 6軟件中如何調試ARM Cortex-M

    Atmel Studio 6軟件中如何調試ARM Cortex-M
    的頭像 發表于 07-04 10:49 ?4279次閱讀

    關于STM32和Cortex-M內核系列介紹(1)

    Cortex-M內核系列和STM32-講座
    的頭像 發表于 07-05 01:07 ?8128次閱讀

    關于STM32與Cortex-M內核系列的介紹(2)

    Cortex-M內核系列和STM32-講座3
    的頭像 發表于 07-05 00:45 ?4581次閱讀

    Cortex-M內核的MPU內存保護單元

    講講Cortex-M內核的MPU內存保護單元
    的頭像 發表于 03-04 11:17 ?3756次閱讀
    <b class='flag-5'>Cortex-M</b><b class='flag-5'>內核</b>的MPU內存保護單元

    美信cortex-m3內核芯片的啟動過程及連接文件介紹

    本文以美信cortex-m3內核某型號芯片以及eclipse開發環境介紹芯片啟動過程以及連接文件。
    的頭像 發表于 03-01 11:39 ?1657次閱讀
    美信<b class='flag-5'>cortex-m</b>3<b class='flag-5'>內核</b>芯片的<b class='flag-5'>啟動過程</b>及連接文件介紹

    基于32位Arm Cortex-M內核N32系列MCU應用

    國民技術N32系列MCU產品基于32位Arm Cortex-M內核,內置嵌入式高速閃存、低功耗電源管理,集成數模混合電路,并內置硬件密碼算法加速引擎以及安全單元。
    發表于 03-28 11:35 ?984次閱讀

    stm32軟復位 內核復位和系統復位

    內核復位:它會使STM32內核Cortex-M)進行復位,而不會影響其外設,如GPIO、TIM、USART、SPI等這些寄存器的
    的頭像 發表于 08-01 17:21 ?5127次閱讀
    上市百家乐官网评论| 台南县| 大发888百家乐| 金冠百家乐的玩法技巧和规则| 百家乐直杀| 百家乐现金投注信誉平台| 网上百家乐的技巧| 百家乐公式球打法| 百家乐智能投注系统| 闲和庄百家乐娱乐平台| 致胜百家乐的玩法技巧和规则| 金域百家乐的玩法技巧和规则| 百家乐特殊技巧| 百家乐单注打| 大发888网页ban| 和记娱乐开户| 隆安县| 百家乐官网网上最好网站| 真钱百家乐官网开户试玩| 百家乐官网赌博技巧论坛| 缅甸百家乐官网赌城| 百家乐庄家胜率| 百家乐揽法大全| 大发888线上娱乐城二十一点| 德州扑克秘籍| 百家乐官网加牌规则| 百家乐官网开户优惠多的平台是哪家 | 百家乐高级技巧| 大发888手机版官网| 永川市| 作弊百家乐官网赌具| 八卦24山| 李雷雷百家乐的奥妙| 德州扑克荷官招聘| 国际百家乐官网规则| 致胜百家乐官网软件| 百家乐线上代理网站| 捷豹百家乐的玩法技巧和规则| 沙龙娱乐开户| 百家乐官网AG| ea百家乐系统|