STM32 startup_stm32f10x_hd.s 啟動文件 初學筆記


  • 啟動文件簡介

啟動文件由匯編編寫,是系統上電復位后第一個執行的程序。主要做了以下工作:
1、初始化堆棧指針SP= _initial_sp
2、初始化PC指針=Reset_Handler(下一條指令地址)
3、初始化中斷向量表
4、配置系統時鍾
5、調用C庫函數main初始化用戶堆棧,從而最終調用main函數去到C的世界

  • 初始化堆棧指針SP= __initial_sp

 

開辟棧的大小為0x00000400(1KB),名字為STACK,NOINIT即不初始化,可讀可寫,8(2^3)字節對齊。
棧的作用是用於局部變量,函數調用,函數形參等的開銷,棧的大小不能超過內部SRAM的大小。如果編寫的程序比較大,定義的局部變量很多,那么就需要修改棧的大小。如果某一天,你寫的程序出現了莫名奇怪的錯誤,並進入了硬fault的時候,這時你就要考慮下是 是棧不夠大,溢出了。

AREA:告訴匯編器匯編一個新的代碼段或者數據段。STACK表示段名,這個可以任意命名;NOINIT表示不初始化;READWRITE表示可讀可寫,ALIGN=3,表示按照23對齊,即8字節對齊。
SPACE:用於分配一定大小的內存空間,單位為字節。這里指定大小等於Stack_Size.
標號__initial_sp緊挨着SPACE語句放置,表示棧的結束地址,即棧頂地址,棧是由高向低生長的(通過棧頂操作)。

開辟堆的大小為0x00000200(512字節),名字為HEAP,NOINIT即不初始化,可讀可寫,8(23)字節對齊。-heap-base表示堆的起始地址, heap-limit表示堆的結束地址。堆是由低向高生長的,跟棧的生長方向相反。
堆主要用來動態內存的分配,像malloco函數申請的內存就在堆上面。這個在STM32里面用的比較少。

  • 初始化中斷向量表

 

定義一個數據段,名字為RESET,可讀。並聲明 Vectors、Vectors End和Vectors Size這三個標號具有全局屬性,可供外部的文件調用。
EXPORT:聲明一個標號可被外部的文件使用,使標號具有全局屬性。如果是IAR編譯器,則使用的是GLOBAL這個指令。

當內核響應了一個發生的異常后,對應的異常服務例程(ESR)就會執行。為了決定ESR的入口地址,內核使用了“向量表查表機制”。這里使用一張向量表。向量表其實是一個WORD(32位整數)數組,每個下標對應一種異常,該下標元素的值則是該ESR的入口地址。向量表在地址空間中的位置是可以設置的,通過NVIC中的一個重定位寄存器來指出向量表的地址。在復位后,該寄存器的值為0。因此,在地址0(即FLASH地址0)處必須包含一張向量表,用於初始時的異常分配。要注意的是這里有個另類:0號類型並不是什么入口地址,而是給出了復位后MSP的初值。

向量表從FLASH的0地址開始放置,以4個字節為一個單位,地址0存放的是棧頂地址,0X04存放的是復位程序的地址,以此類推。從代碼上看,向量表中存放的都是中斷服務函數的函數名,可我們知道C語言中的函數名就是一個地址。
DCD:分配一個或者多個以位為單位的內存,以四字節對齊,並要求初始化這些內存。在向量表中,DCD分配了一堆內存,並且以ESR的入口地址初始化它們。

  • 配置系統時鍾、調用C庫函數main初始化用戶堆棧,從而最終調用main函數去到C的世界

 

復位子程序是系統上電后第一個執行的程序,調用Systemlnit函數初始化系統時鍾,然后調用C庫函數_mian,最終調用main函數去到C的世界。
WEAK:表示弱定義,如果外部文件優先定義了該標號則首先引用該標號,如果外部文件沒有聲明也不會出錯。這里表示復位子程序可以由用戶在其他文件重新實現,這里並不是唯一的。(與keil有關)
IMPORT:表示該標號來自外部文件,跟C語言中的EXTERN關鍵字類似。這里表示Systemlnit和_main這兩個函數均來自外部的文件。
Systemlnit是一個標准的庫函數,在system_stm32fl0x.c這個庫文件總定義。主要作用是配置系統時鍾,這里調用這個函數之后,單片機的系統時鍾配被配置為72M。_main是一個標准的C庫函數,主要作用是初始化用戶堆棧,並在函數的最后調用main函數去到C的世界。這就是為什么我們寫的程序都有一個main函數的原因。

 

 

 

 

 首先判斷是否定義了MICROLIB,如果定義了這個宏則賦予標號initial_sp(棧頂地址)heap_base(堆起始地址)heap_limit(堆結束地址)全局屬性,可外部文件使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM