RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分析ARM Cortex-M內(nèi)核復(fù)位啟動(dòng)過(guò)程

STM32嵌入式開(kāi)發(fā) ? 來(lái)源:gaomf.cn ? 2023-03-20 09:58 ? 次閱讀

ARM Cortex-M內(nèi)核的復(fù)位啟動(dòng)過(guò)程也被稱為復(fù)位序列(Reset sequence),下面就來(lái)簡(jiǎn)要總結(jié)分析下這一過(guò)程。

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

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

2.從地址0x0000_0004處取出PC的初始值,然后從這個(gè)值對(duì)應(yīng)的地址處取指。

即下圖所示過(guò)程:

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

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

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

值得注意的是,在ARM Cortex-M內(nèi)核中,發(fā)生異常后,并不是去執(zhí)行中斷向量表中對(duì)應(yīng)位置處的代碼,而是將對(duì)應(yīng)位置處的數(shù)據(jù)存入PC中,然后去此地址處進(jìn)行取指。簡(jiǎn)而言之,在ARM Cortex-M的中斷向量表中不應(yīng)該放置跳轉(zhuǎn)指令,而是該放置ISR程序的入口地址。

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

另外還有兩個(gè)細(xì)節(jié)問(wèn)題需要注意:

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

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

第一個(gè)問(wèn)題是因?yàn)锳RM AAPCS中對(duì)棧使用的約定是這樣的:
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.
簡(jiǎn)而言之,規(guī)約規(guī)定,棧任何時(shí)候都必須4字節(jié)對(duì)齊,在調(diào)用入口需8字節(jié)對(duì)齊,而且SP的最低兩位在硬件上就被置為0了。


第二個(gè)問(wèn)題與ARM模式與Thumb模式有關(guān)。ARM中PC中的地址必須是32位對(duì)齊的,其最低兩位也被硬件上置0了,故寫(xiě)入PC中的數(shù)據(jù)最低兩位并不代表真實(shí)的取址地址。ARM中使用最低一位來(lái)判斷這條指令是ARM指令還是Thumb指令,若最低位為0,代表ARM指令;若最低位為1,代表Thumb指令。在Cortex-M內(nèi)核中,并不支持ARM模式,若強(qiáng)行切換到ARM模式會(huì)引發(fā)一個(gè)Hard Fault。


最后寫(xiě)一段小程序來(lái)驗(yàn)證下以上分析。這段程序基于STM32F4系列單片機(jī),作用是讓PA0管腳輸出高電平。這應(yīng)該也是實(shí)現(xiàn)這一目的最精簡(jiǎn)的寫(xiě)法了。


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個(gè)字節(jié)的存儲(chǔ)空間,并將其值設(shè)置為0x0000_0400;第12行同理,將Start標(biāo)號(hào)處的地址放置在偏移量為4字節(jié)的位置處;第17行Start標(biāo)號(hào)之后的部分就是程序主體,依次完成了GPIOA端口RCC時(shí)鐘使能、PA0設(shè)置為輸出模式、PA0置高這三個(gè)步驟。


程序在鏈接時(shí)會(huì)將RESET段放置在目標(biāo)文件開(kāi)頭,故相當(dāng)于在地址0x0000_0000處的數(shù)據(jù)為0x0000_0400,在地址0x0000_0004處的數(shù)據(jù)為Start部分的入口地址。


不過(guò)需要指出的是,實(shí)際上在STM32F4芯片中,內(nèi)部Flash的地址是從0x0800_0000處開(kāi)始的,在BOOT管腳設(shè)置為Flash啟動(dòng)的時(shí)候,芯片內(nèi)部會(huì)自動(dòng)將0x0000_00000 0x000F_FFFF區(qū)域映射至0x0800_0000 0x080F_FFFF處,此時(shí)可以視為二者是等價(jià)的。
使用Debug模式進(jìn)行調(diào)試,復(fù)位后CPU寄存器的值如下所示:

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

Flash中的數(shù)據(jù)如圖:
5100dc1c-c4c5-11ed-bfe3-dac502259ad0.png ??

可以看到,編譯器很智能的將0x0800_0004處的數(shù)據(jù)設(shè)置為了0x0800_0009,而不是Start標(biāo)號(hào)真實(shí)的地址值,這說(shuō)明了這是一條Thumb-2指令。復(fù)位后PC中的值是0x0800_0008,SP中的值是0x0000_0400,與預(yù)期結(jié)果完全相同。

最后順便提一下,上面那段簡(jiǎn)單的程序有個(gè)問(wèn)題,實(shí)際上Start部分的程序是占用了中斷向量表的空間,這在沒(méi)有異常發(fā)生的時(shí)候是沒(méi)有問(wèn)題的,不過(guò)一旦有異常發(fā)生,顯然程序執(zhí)行是會(huì)出錯(cuò)的。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9084

    瀏覽量

    367380
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1372

    瀏覽量

    40276
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10854

    瀏覽量

    211574
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    898

    瀏覽量

    41470
  • Cortex-M
    +關(guān)注

    關(guān)注

    2

    文章

    229

    瀏覽量

    29752

原文標(biāo)題:分析ARM Cortex-M內(nèi)核復(fù)位啟動(dòng)過(guò)程

文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ARM Cortex-M0 DesignStart系列--4啟動(dòng)過(guò)程分析

    書(shū)接上文《ARM_Cortex-M0 DesignStart系列--3rtl仿真過(guò)程的詳細(xì)分析》,本文基于hello這個(gè)case,對(duì)Cortex M
    的頭像 發(fā)表于 11-10 09:05 ?2813次閱讀
    <b class='flag-5'>ARM</b> <b class='flag-5'>Cortex-M</b>0 DesignStart系列--4<b class='flag-5'>啟動(dòng)過(guò)程</b><b class='flag-5'>分析</b>

    專家揭秘:STM32啟動(dòng)過(guò)程全解

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

    Cortex-M內(nèi)核的GCC編譯器

    下載ARM官方對(duì)應(yīng)Cortex-M內(nèi)核的GCC編譯器
    發(fā)表于 08-24 06:44

    ARM Cortex-M內(nèi)核的相關(guān)資料推薦

      大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是ARM Cortex-M功能模塊,不過(guò)側(cè)重點(diǎn)是三款安全特性處理器?! ?b class='flag-5'>ARM Cortex-M處理器家族發(fā)展至今(2
    發(fā)表于 12-27 07:21

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

    ARM Cortex-M 系列微控制器(ST) 意法半導(dǎo)體(ST)宣布在基于ARM Cortex-M系列處理器內(nèi)核的微控制器研發(fā)項(xiàng)目上取得
    發(fā)表于 11-02 09:29 ?951次閱讀

    嵌入式uCLinux內(nèi)核啟動(dòng)過(guò)程分析

    分析uCLinux的啟動(dòng)過(guò)程,可以加快系統(tǒng)啟動(dòng)速度、正確建立應(yīng)用環(huán)境。本文要研究的就是uCLinux操作系統(tǒng)內(nèi)核啟動(dòng)過(guò)程。
    發(fā)表于 08-15 16:51 ?787次閱讀

    傳統(tǒng)的單片機(jī)和ARM較量 助推MCU踏上高端Cortex-M市場(chǎng)

    據(jù)有關(guān)市場(chǎng)調(diào)研機(jī)構(gòu)稱,基于ARM Cortex-M內(nèi)核的MCU在2010年創(chuàng)紀(jì)錄地實(shí)現(xiàn)了100%的出貨量增長(zhǎng)。而整個(gè)MCU市場(chǎng)才增長(zhǎng)了37%。MCU市場(chǎng)的增長(zhǎng)也幾乎是來(lái)自于ARM
    發(fā)表于 04-28 10:00 ?1611次閱讀

    詳解bootloader的執(zhí)行流程與ARM Linux啟動(dòng)過(guò)程分析

    S3C2410 ARM處理器為例,詳細(xì)分析了系統(tǒng)上電后 bootloader的執(zhí)行流程及 ARM Linux的啟動(dòng)過(guò)程。
    的頭像 發(fā)表于 12-21 09:24 ?1w次閱讀
    詳解bootloader的執(zhí)行流程與<b class='flag-5'>ARM</b> Linux<b class='flag-5'>啟動(dòng)過(guò)程</b><b class='flag-5'>分析</b>

    Atmel Studio 6軟件中如何調(diào)試ARM Cortex-M

    Atmel Studio 6軟件中如何調(diào)試ARM Cortex-M
    的頭像 發(fā)表于 07-04 10:49 ?4239次閱讀

    關(guān)于STM32和Cortex-M內(nèi)核系列介紹(1)

    Cortex-M內(nèi)核系列和STM32-講座
    的頭像 發(fā)表于 07-05 01:07 ?8044次閱讀

    關(guān)于STM32與Cortex-M內(nèi)核系列的介紹(2)

    Cortex-M內(nèi)核系列和STM32-講座3
    的頭像 發(fā)表于 07-05 00:45 ?4523次閱讀

    Cortex-M內(nèi)核的MPU內(nèi)存保護(hù)單元

    講講Cortex-M內(nèi)核的MPU內(nèi)存保護(hù)單元
    的頭像 發(fā)表于 03-04 11:17 ?3673次閱讀
    <b class='flag-5'>Cortex-M</b><b class='flag-5'>內(nèi)核</b>的MPU內(nèi)存保護(hù)單元

    美信cortex-m3內(nèi)核芯片的啟動(dòng)過(guò)程及連接文件介紹

    本文以美信cortex-m3內(nèi)核某型號(hào)芯片以及eclipse開(kāi)發(fā)環(huán)境介紹芯片啟動(dòng)過(guò)程以及連接文件。
    的頭像 發(fā)表于 03-01 11:39 ?1545次閱讀
    美信<b class='flag-5'>cortex-m</b>3<b class='flag-5'>內(nèi)核</b>芯片的<b class='flag-5'>啟動(dòng)過(guò)程</b>及連接文件介紹

    基于32位Arm Cortex-M內(nèi)核N32系列MCU應(yīng)用

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

    stm32軟復(fù)位 內(nèi)核復(fù)位和系統(tǒng)復(fù)位

    內(nèi)核復(fù)位:它會(huì)使STM32內(nèi)核Cortex-M)進(jìn)行復(fù)位,而不會(huì)影響其外設(shè),如GPIO、TIM、USART、SPI等這些寄存器的
    的頭像 發(fā)表于 08-01 17:21 ?4847次閱讀
    RM新时代网站-首页