stm32啟動檔案分析

2021-10-01 16:14:48 字數 2169 閱讀 8626

這篇文章主要是分析stm32啟動檔案,啟動檔案是由彙編編寫的,檔名為startup_stm32f40_41***.s。

啟動檔案最主要的功能就是初始化堆疊指標sp,執行復位程式進入c語言main函式

1.初始化堆疊空間大小,定義棧頂位置、堆起始位置等等

2.定義中斷向量表,初始化sp指標

3.reset_handler復位函式定義

4.配置系統時鐘,進入main函式

stack_size      equ     0x00000400

area stack, noinit, readwrite, align=3

stack_mem space stack_size

__initial_sp

在mdk幫助文件中可以查到equ是巨集定義的偽指令,它的作用就相當於c語言中的define,首先定義棧大小為1kb(0x00000400)。

棧的作用主要儲存函式中的區域性變數,函式呼叫過程中的形參,返回位址,因此在函式中如果有較多的區域性變數,大型陣列最好不要放在函式中定義,在這種情況下就要考慮棧大小是否充足,如果棧溢位了,那程式會出現跑飛,找不到返回位址。

area是告訴編譯器彙編乙個**段或者資料段,stack 表示段名,這個可以任意命名; noinit 表示不初始化; readwrite 表示可讀可寫, align=3,表示按照 2^3對齊,即 8 位元組對齊。

space是分配一定大小的記憶體空間,單位為位元組。

最後一句_initial_sp是棧頂指標,這裡棧的生長方向是從高位址到低位址,所以棧初始位址就是在高位址位置。

heap_size       equ     0x00000200

area heap, noinit, readwrite, align=3

__heap_base

heap_mem space heap_size

__heap_limit

這裡是宣告堆的大小,方法和棧類似,不同點在於_heap_base堆初始位置在記憶體分配之前,也就是低位址,_heap_limit是堆結束位置,堆的生長方向是從低位址向高位址。堆主要用於動態記憶體的分配。

__vectors       dcd     __initial_sp               ; top of stack

dcd reset_handler ; reset handler

dcd nmi_handler ; nmi handler

dcd hardfault_handler ; hard fault handler

dcd memmanage_handler ; mpu fault handler

dcd busfault_handler ; bus fault handler

dcd usagefault_handler ; usage fault handler

...

這裡就是中斷向量表的定義,中斷向量表是儲存在flash的0位址位置。向量表第乙個位置儲存的是棧頂位址,即 __initial_sp,這個值在stm32開始執行後會賦給棧指標sp。向量表第二個位置儲存的是復位中斷的位址,其函式名reset_handler就是位址,在後面有定義,這個位址值會賦給程式執行位址指標pc,然後就執行復位程式。

reset_handler    proc

export reset_handler [weak]

import systeminit

import __main

ldr r0, =systeminit

blx r0

ldr r0, =__main

bx r0

endp

復位程式會匯入systeminit和_main函式的位址,並由下面的彙編**,執行systeminit函式,這個函式是對系統時鐘進行設定,然後執行_main函式,這個函式是對堆疊進行一些初始化工作,然後跳轉到main函式,並且不在返回該位置。

整個過程就是先設定堆和棧的大小,並且設定相應的位址,然後定義中斷向量表,最後定義復位函式,跳轉到main函式。

STM32啟動檔案分析

1.啟動檔案主要作用 a.初始化指標大小 b.初始化堆指標大小 c.初始化中斷向量表 d.初始化系統時鐘 e.呼叫 main,實現堆疊的初始化,最終跳轉到c的main當中 2.棧主要儲存程式的變數,當程式變數較多時,可以將棧分配的更大,但不能超過內部sram的大小 mdk中,全域性變數和區域性變數都...

STM32 啟動檔案

先來看看啟動 中的偽操作和偽指令 equ 用於定義常量,相當於c中的巨集定義 如stack size equ 0x00000400 define stack size 0x00000400 align 位元組對齊方式 align 3 export 相當於宣告了乙個全域性變數 export vecto...

stm32啟動檔案

這是st提供的3個啟動檔案,分別適用於不同容量的stm32晶元。這三個檔案為 startup stm32f10x ld.s startup stm32f10x md.s startup stm32f10x hd.s 其中,ld.s適用於小容量 產品 md.s適用於中等容量產品 hd適用於大容量產品 ...