欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3254|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32啟動(dòng)代碼詳細(xì)分析

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
在上電復(fù)位后,我們都知道會(huì)先運(yùn)行啟動(dòng)代碼,但是啟動(dòng)代碼到底使干什么用的呢?下面小弟給大家一一列出來(lái)。
1、初始化堆棧指針
2、初始化 PC 指針
3、初始化中斷向量表
4、配置系統(tǒng)時(shí)鐘
5、調(diào)用 C 庫(kù)函數(shù)_main 初始化用戶堆棧
我們根據(jù)這以上的幾個(gè)步驟一一進(jìn)行詳細(xì)的解析:
1、棧的內(nèi)存分配
這段代碼的意思是,開(kāi)辟了一個(gè)棧,這個(gè)棧的大小是0x00000400也就是1KB的大小,名字為STACK,不初始化,可讀可寫(xiě),2^3=8字節(jié)對(duì)齊。
那么問(wèn)題來(lái)了,那這個(gè)棧到底使干什么的呢?小弟相信大家在學(xué)習(xí)C語(yǔ)言的時(shí)候應(yīng)該也是知道了,棧區(qū)保存的是局部變量,只是當(dāng)時(shí)并沒(méi)有深入研究它的大小問(wèn)題。那在這里小弟給大家詳細(xì)講解一下棧的作用:
1、局部變量
2、函數(shù)調(diào)用
3、函數(shù)形參
以上的這三種情況的開(kāi)銷都是使用我們的棧區(qū)的資源的。所以!這里小弟給個(gè)位提個(gè)醒,千萬(wàn)不要把棧區(qū)當(dāng)成無(wú)止境大小的
哦!STM32可不比我們的電腦,沒(méi)有那么多的空間可以給大伙揮霍,如果我們定義的局部變量過(guò)大可是會(huì)莫名其妙報(bào)錯(cuò)的。
溫馨提示:請(qǐng)不要在寫(xiě)程序時(shí),過(guò)度使用局部變量,會(huì)造成棧的益處,從而導(dǎo)致編譯報(bào)錯(cuò),如果在特殊情況下真的需要很大的棧區(qū)空間,只需來(lái)這里進(jìn)行棧區(qū)大小的修改即可。
那么小弟再來(lái)給這個(gè)程序段里的匯編指令做一個(gè)詳細(xì)的介紹
Stack_Size      EQU     0x00000400
EQU:宏定義的偽指令,相當(dāng)于等于,類似與 C 中的 define。
這句話的意思是,定義一個(gè)宏名Stack_Size這個(gè)宏代表0x00000400的意思,用我們C語(yǔ)言來(lái)表示就是
#define Stack_Size 0x00000400

AREA    STACK, NOINIT, READWRITE, ALIGN=3
AREA:告訴匯編器匯編一個(gè)新的代碼段或者數(shù)據(jù)段。
STACK:表示段名
NOINIT:表示不初始化
READWRITE:表示可讀可寫(xiě)
ALIGN=n:表示按照 2^n字節(jié)對(duì)齊
這里小弟就不多說(shuō)了,解釋已經(jīng)很詳細(xì)了,小哥哥小姐姐們自己組合起來(lái)吧
Stack_Mem       SPACE   Stack_Size
SPACE:用于分配一定大小的內(nèi)存空間,單位為字節(jié)。
這句話的意思是,分配一個(gè)內(nèi)存空間,這個(gè)內(nèi)存空間的大小為Stack_Size,也就是我們剛才宏定義的0x00000400
然后最后標(biāo)號(hào)__initial_sp 緊挨著 SPACE 語(yǔ)句放置,表示棧的結(jié)束地址。也就是棧頂?shù)牡刂贰?/font>
溫馨提示:棧的生長(zhǎng)是由高地址向低地址生長(zhǎng)的。


2、堆的內(nèi)存分配

這段代碼的意思是,開(kāi)辟堆的大小為0x00000200也就是512B的大小,名字為HEAP,不初始化,8字節(jié)對(duì)齊。


在之前我們一直認(rèn)為的是,全局變量,靜態(tài)變量都分配在堆區(qū)中,這里是不正確的,我們的全局變量和靜態(tài)變量,并不是直接
分配在堆中,這里的堆只有malloc函數(shù)分配的內(nèi)存,會(huì)在這里進(jìn)行分配,而靜態(tài)變量和局部變量都是在SRAM中分配,這也就是為什么我們?nèi)肿兞靠梢远x一個(gè)大于512B大小的空間了。

溫馨提示:如果使用了malloc函數(shù)一定要注意這個(gè)堆咯!不可以大于512B呢!當(dāng)然這里也可以進(jìn)行修改。

那咱們?cè)賮?lái)一條一條語(yǔ)句進(jìn)行分析吧!
Heap_Size       EQU     0x00000200
這里我們就不多說(shuō)了這條代碼和上面那條是一個(gè)意思

AREA    HEAP, NOINIT, READWRITE, ALIGN=3
這里也和上面差不多,唯一改變的就是段名是HEAP而不是STACK了

__heap_base
在SPACE前出現(xiàn)這條代碼代表的是堆的起始地址

Heap_Mem        SPACE   Heap_Size
這里是分配一個(gè)0X00000200大小的空間

__heap_limit
在SPACE后出現(xiàn)這條代碼代表的是堆的結(jié)束地址

PRESERVE8
指定當(dāng)前文件的堆棧按照 8 字節(jié)對(duì)齊
THUMB
表示后面指令兼容 THUMB 指令。THUBM 是 ARM 以前的指令集,16bit,現(xiàn)在 Cortex-M 系列的都使用 THUMB-2 指令集,THUMB-2 是 32 位的,兼容 16 位和 32 位的指令。
3、向量表


這段代碼的意思是,定義了一個(gè)數(shù)據(jù)短,名字叫RESET,只可讀。
那么這里問(wèn)題來(lái)了,什么是向量表呢!在這里,這個(gè)向量表示為了決定中斷服務(wù)函數(shù)的入口的,每一個(gè)向量表都是4個(gè)字節(jié),
向量表決定了入口的偏移地址。
AREA    RESET, DATA, READONLY
這句話的意思是定義了一個(gè)代碼段RESET,只可讀

EXPORT  __Vectors
EXPORT  __Vectors_End
EXPORT  __Vectors_Size
這三句話都是同一個(gè)意思,相當(dāng)于C語(yǔ)言中的EXPORT可以被外部文件所引用

向量表如下
...........................省略部分.................................






這里呢,就是我們的中斷向量表了,我們可以發(fā)現(xiàn),它是從棧區(qū)中開(kāi)始加載的,從棧頂開(kāi)始,
__Vectors 代表向量起始地址
__Vectors_End 代表向量結(jié)束地址
DCD:分配一個(gè)或者多個(gè)以字為單位的內(nèi)存,以四字節(jié)對(duì)齊,并要求初始化這些內(nèi)存。在向量表中,DCD 分配了一堆內(nèi)存,并且以 ESR 的入口地址初始化它們

Reset_Handler     
NMI_Handler      
HardFault_Handler
MemManage_Handler
BusFault_Handler  
UsageFault_Handler
這些都是地址,我們的知道,函數(shù)名就是函數(shù)的地址,所以我們的中斷服務(wù)函數(shù)必須使用這些作為函數(shù)名,否則無(wú)法正確進(jìn)入中斷服務(wù)函數(shù)。
__Vectors_Size  EQU  __Vectors_End - __Vectors
通過(guò)這句話我們知道結(jié)束地址-起始地址,自然就是向量表的大小了。


好的,個(gè)位小哥哥小姐姐,今天的課就上到這里了,剩下的部分我們下回分解。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:20672 發(fā)表于 2019-11-5 11:19 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表