日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

STM32 CM3/CM4 ------ startup.s 文件分析 ------ IAR 版本

發(fā)布時(shí)間:2023/12/15 综合教程 39 生活家
生活随笔 收集整理的這篇文章主要介紹了 STM32 CM3/CM4 ------ startup.s 文件分析 ------ IAR 版本 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

startup.s 功能

不同的開發(fā)環(huán)境(IAR、KEIL、GCC編譯器),startup.s的內(nèi)容多少有些差別,但是功能基本如下:

文件功能:

;* This module performs:
;* - Set the initial SP
;* - Configure the clock system
;* - Set the initial PC == __iar_program_start,
;* - Set the vector table entries with the exceptions ISR address.
;* After Reset the Cortex-M3 processor is in Thread mode,priority is Privileged, and the Stack is set to Main.

The vector table is normally located at address 0.

在函數(shù)__iar_program_start() 內(nèi)會(huì)調(diào)用 main() 函數(shù)

向量表

在 startup.s 內(nèi),定義了一個(gè)向量表,不同于GCC編譯器由鏈接腳本決定向量表存儲(chǔ)在ROM(flash)的哪個(gè)地址,IAR是 .icf 文件內(nèi)決定存儲(chǔ)地址,默認(rèn)從地址0開始(對(duì)于STM32,就是 flash 的起始地址 0x08000000)存每個(gè)向量,向量指向的位置就是對(duì)應(yīng)的中斷服務(wù)函數(shù)

向量表的起始處都必須包含以下向量:
  主堆棧指針(MSP)的初始值
  復(fù)位向量(根據(jù)CM3權(quán)威指南,復(fù)位向量是PC初始值,也就是說程序是從中斷服務(wù)函數(shù) Reset_Handler 開始運(yùn)行的
  NMI
  硬 fault 服務(wù)例程
后兩者也是必需的,因?yàn)橛锌赡茉谝龑?dǎo)過程中發(fā)生這兩種異常。

所以 0x20000D84 就是主堆棧指針的初始值,0x08059545-1就是復(fù)位向量,指向中斷服務(wù)函數(shù)Reset_Handler

startup.s 文件內(nèi)容

以下是 IAR 版本的 startup.s

        MODULE  ?cstartup

        ;; Forward declaration of sections.
        SECTION CSTACK:DATA:NOROOT(3)

        SECTION .intvec:CODE:NOROOT(2)

        EXTERN  __iar_program_start
        EXTERN  SystemInit        
        PUBLIC  __vector_table

        DATA
__vector_table
        DCD     sfe(CSTACK)
        DCD     Reset_Handler             ; Reset Handler
        DCD     NMI_Handler               ; NMI Handler
        DCD     HardFault_Handler         ; Hard Fault Handler
......



        THUMB

        PUBWEAK Reset_Handler
        SECTION .text:CODE:REORDER(2)
Reset_Handler
        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__iar_program_start
        BX      R0
        
        PUBWEAK NMI_Handler
        SECTION .text:CODE:REORDER(1)
NMI_Handler
        B NMI_Handler

        PUBWEAK HardFault_Handler
        SECTION .text:CODE:REORDER(1)
HardFault_Handler
        B HardFault_Handler
......

除了 Reset_Handler 中斷服務(wù)函數(shù), 其他中斷服務(wù)函數(shù)都是死循環(huán),B 是跳轉(zhuǎn)指令(即函數(shù)調(diào)用)。BLX 也是跳轉(zhuǎn)指令。

        DCD     sfe(CSTACK)
        DCD     Reset_Handler             ; Reset Handler
        DCD     NMI_Handler               ; NMI Handler
        DCD     HardFault_Handler         ; Hard Fault Handler

DCD:數(shù)據(jù)定義( Data Definition )偽指令
一般用于為特定的數(shù)據(jù)分配存儲(chǔ)單元,同時(shí)可完成已分配存儲(chǔ)單元的初始化。

語法格式:

標(biāo)號(hào) DCD(或 DCDU) 表達(dá)式

DCD(或 DCDU)偽指令用于分配一片連續(xù)的字存儲(chǔ)單元并用指定的表達(dá)式初始化。其中表達(dá)式可以為程序標(biāo)號(hào)或數(shù)字表達(dá)式。 DCD 也可用 “ &” 代替。

用 DCD 分配的字存儲(chǔ)單元是字對(duì)齊的,而用 DCDU 分配的字存儲(chǔ)單元并不嚴(yán)格字對(duì)齊。

結(jié)合前面的截圖,上面幾行分析如下:

為 CSTACK 分配存儲(chǔ)地址 0x08000000,地址上的內(nèi)容為 CSTACK 的值是 0x20000D84

為 Reset_Handler 分配存儲(chǔ)地址 0x08000004,地址上的內(nèi)容為中斷服務(wù)函數(shù)指針(0x08059545),指向中斷服務(wù)函數(shù) Reset_Handler

為 NMI_Handler 分配存儲(chǔ)地址 0x08000008,地址上的內(nèi)容為中斷服務(wù)函數(shù)指針(0x08059591),指向中斷服務(wù)函數(shù) NMI_Handler

函數(shù) Reset_Handler 內(nèi)沒有對(duì) SP 進(jìn)行初始化,存疑。

總結(jié)

以上是生活随笔為你收集整理的STM32 CM3/CM4 ------ startup.s 文件分析 ------ IAR 版本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。