久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

QQ登錄

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

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

MDK STM32 Mian函數(shù)運(yùn)行前的分析

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:391224 發(fā)表于 2019-2-1 12:02 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
一、 啟動(dòng)文件的介紹

在 MDK 的啟動(dòng)文件 startup_stm32f10x_md_vl 中,該文件分別定義了棧段、 堆段、存放中斷向量表的數(shù)據(jù)段、還有一個(gè)代碼段
大小為 0x400 的棧段定義如圖 1-1:

圖 1-1

大小為 0x200 的堆段如圖 1-2:

圖 1-2

由其定義屬性可知,棧和堆都未初始化,該過(guò)程由后面的_user_initial_stackheap
來(lái)完成。
存放中斷向量的數(shù)據(jù)段,如圖 1-3 所示:

圖 1-3
10 個(gè)系統(tǒng)異常過(guò)程段和在同一地址的外部中斷過(guò)程段,下面我們就詳細(xì)介紹 上電復(fù)位的代碼段,如圖 1-4 所示:

二、Reset_Handler 段分析

1. _systeminit 函數(shù)分析
STM32 上電啟動(dòng),首先從 0x0000 0000 處初始化 sp 的值,然后從 0x0000 0004
處取得復(fù)位中斷處理的地址 0x0800 1F6D,程序跳轉(zhuǎn)

圖 2-1

但是 Reset_Handler 的地址為 0x0800 1F6C,這是因?yàn)?Cortex-M3 使用的是 thumb-2
指令集,其最低位必須為 1;如果為 0,則會(huì)出現(xiàn)異常,如圖 2-1 所示。 查看反匯編窗口,如圖 2-2 所示:

圖 2-2

可以知道先取得 SystemInit 函數(shù)的地址,該地址是多少,我們可以跳轉(zhuǎn)到
0x08001F94 看看,如下所示,該地址保存了值為 0x0800045D 的數(shù),如圖 2-3:

圖 2-3

然后我們跳轉(zhuǎn)到 0x0800045D,發(fā)現(xiàn)該處正是我們需要的 SystemInit 函數(shù)入口地 址,如圖 2-4:

圖 2-4

該函數(shù)首先保存跳轉(zhuǎn)前的有關(guān)狀態(tài),然后根據(jù)使用的芯片,進(jìn)行相應(yīng)的初始化操 作,函數(shù)最后重新映射了中斷向量的存放地址,如圖 2-5:


查看反匯編窗口,如圖 2-6:

圖 2-6



根據(jù)分析可知,該段代碼是把 0x0800 0000 存放到地址為 0xE000 ED08 處, 查找 Cortex_M3 手冊(cè)如圖 2-7 所示,該地址是向量表偏移寄存器,也就是說(shuō),這 條語(yǔ)句把中斷向量表重新映射到地址為 0x0800 0000。



2. _main 函數(shù)分析
圖 2-7



進(jìn)行完相應(yīng)的初始化,函數(shù)跳轉(zhuǎn)到_main 函數(shù),_main 函數(shù)的入口地址從
0x08001F98 取得,通過(guò)查找,發(fā)現(xiàn)_main 函數(shù)的地址為 0x08000121,跳轉(zhuǎn)到
0x0800120,證明此處就是我們要找的_main 函數(shù)入口,如圖 2-8

圖 2-8

_main 函數(shù)到底進(jìn)行了哪些操作呢,下面我們就一一逐步分析過(guò)去。
? _scatterload 函數(shù)分析

首先是一條跳轉(zhuǎn)指令,跳轉(zhuǎn)到_scatterload 函數(shù),該函數(shù)的第一條指令是把地 址 0x08000154 賦值給 r0(但是此處 PC+4 取得值應(yīng)該是0x0800012C,為什么會(huì) 是 0x08000154 呢?根據(jù) ARMv7-M Architecture Reference Manual,ADR 的二進(jìn) 制碼,相差 0x28),第二條指令是分別把 0x08000154、0x08000158 存放的 0x0000
1ECC、0x0000 1EEC 給 r10、r11,如圖 2-9。經(jīng)過(guò)該函數(shù)的第三、第四條指令, 我們可以得到r10=0x08002020,r11=0x08002040,r7=0x0800201F,


圖 2-9
查看.map 文件,知道 0x08002020 稱為 Region$$Table$$Base,0x08002040 稱為
Region$$Table$$Limit。
? _scatterload_null 函數(shù)分析

如圖 2-10 所示,程序繼續(xù)執(zhí)行到_scatterload_null 函數(shù),首先比較 r10、r11 是否相等,如果不等則跳轉(zhuǎn)到 0x0800013E。很明顯不等,程序跳轉(zhuǎn),第一條指 令是把 0x08000137f 賦值給 lr,其實(shí)就是保存_scatterload_null 的入口地址;第二 條指令是把 r10=0x08002020 為起始,0x08002030 為終止的地址內(nèi)容分別賦值給 r0-r3,最后我們得到 r0=0x08002040, r1=0x20000000, r2=0x00000034, r3=0x0800
015C,r10=0x08002030;第三條指令是判斷 r3 是否為 1,很明顯不為 1,IT 指令 等效于 if-then 模式,最后幾條指令可以得到 r3=0x0800015D,程序跳轉(zhuǎn)




? MAP 文件分析
圖 2-10




0x0800 015D 地址是函數(shù)_scatterload_copy 的入口,該函數(shù)到底 copy 了什么 值呢?在此之前我們先要熟悉一下.map 文件
.map 文件是值包括了映像文件信息圖和其它信息的一個(gè)映射文件,該文件包 含了:
(1) 從映像文件中刪除的輸入段中未使用段的統(tǒng)計(jì)信息,對(duì)應(yīng)參數(shù)-remove; (2) 域符號(hào)映射和全局、局部符號(hào)及生成符號(hào)映射統(tǒng)計(jì)信息,對(duì)應(yīng)參數(shù)
-symbol;
(3) 映射文件的信息圖,對(duì)應(yīng)參數(shù)-map,該信息中包含映像文件中的每個(gè)加載 域、運(yùn)行域和輸入段的大小和地址,如 2-11 圖、2-12 圖所示:

圖 2-11



圖 2-12

(4) 映像文件的每個(gè)輸入文件或庫(kù)的RO、RW、ZI 等統(tǒng)計(jì)信息,對(duì)應(yīng)參數(shù)-info sizes,示例如圖 2-13:

圖 2-13

(5) 文件對(duì)象類和庫(kù)總的 RO、RW、ZI等下大小,對(duì)應(yīng)參數(shù)-info totals,示例 如圖 2-14:

圖 2-14

由此,根據(jù).map 文件我們得到 RW=0x34, ZI=0x0644, Code+RO=0x2040, RW+ZI=0x0698

現(xiàn)在我們回到_scatterload_copy 中,看看到底 copy 了什么,其代碼如圖 2-15
所示:

圖 2-15


? _scatterload_copy 函數(shù)分析

經(jīng)過(guò)_scatter_null 函數(shù)我們得到 r2=0x00000034,這正是需要初始化全局變量 的大小,由此我們猜測(cè) copy 的值是全局變量。
第一條指令是得 r2=0x0000 0024,然后判斷標(biāo)志位 C 是否為 1,如果是 1,則 執(zhí)行下面兩條語(yǔ)句:
LDM              r0! , (r3-r6);
STM              r1! , (r3-r6);
r0=0x0800 2040, r1=0x2000 0000,而 0x20000000 正好是 SRAM 的起始地址,所以 上面兩條語(yǔ)句是把以 0x8002040 為起始的地址復(fù)制到以0x2000 0000 為起始的地 址,該循環(huán)類似我們的 for(r0=0x0800 2040, r1=0x2000 0000;r2=r2-0x10;r2>0), 直到 r2 為負(fù)數(shù)
LSLS              r2,r2,#29
ITT              CS              如果 r2 除以 16 是 8 的整數(shù),則復(fù)制該 8 字節(jié)
LDM              r0!,{r4-r5} STM              r1!,{r4-r5}


ITT              MI
LDR              r4,[r0,#0x00] STR                            r4,[r1,#0x00]
如果 r2 除以 16 是 4 的整數(shù),則復(fù)制 4 或者 12 字節(jié)


這樣_scatterload_copy 完成了需要初始化全局變量 RW 的裝載過(guò)程,最后函 數(shù)返回到_scatterload_null。
? _scatterload_zeroinit 函數(shù)分析

然后判斷 r10 是否與 r11 相等,很明顯不等,r3=0x0800 0178,函數(shù)跳轉(zhuǎn),進(jìn)入 到_scatterload_zeroinit 函數(shù),此時(shí)
r0=0x0800 2074,r1=0x20000034, r2=0x0000 0664
_scatterload_zeroinit 函數(shù)代碼如圖 2-16:

圖 2-16
通過(guò)_scatterload_copy 我們可以猜測(cè)_scatterload_zeroinit 是一個(gè)清零過(guò)程,但 是對(duì)什么需要清零呢?當(dāng)然是 ZI 段,由 r2=0x00000664 這正是 ZI 的大小,所以 該過(guò)程是以 0x20000034 為起始地址,大小為 r2=0x00000664 的清零過(guò)程,具體 分析和_scatterload_copy 類似,不再重復(fù)。


程序最后返回到_scatterload,接著跳轉(zhuǎn)到_rt_entry,如圖 2-17




2. _rt_entry 函數(shù)分析
圖 2-17



_rt_entry  的第一條指令又是一條跳轉(zhuǎn)指令,程序再次跳轉(zhuǎn)到
_user_setup_stackheap,如圖 2-18

圖 2-18

_user_setup_stackheap 函數(shù)的第一條指令是保存函數(shù)的返回地址,此處為
什么沒(méi)有用 PUSH ?因?yàn)榇藭r(shí)堆棧還沒(méi)有初始化好。第二條指令是跳轉(zhuǎn)到
_user_libspace 進(jìn)行一些微庫(kù)的初始化工作,后面的幾條語(yǔ)句是建立一個(gè)大小為
90 字節(jié)的臨時(shí)棧,然后程序跳轉(zhuǎn)到_user_inital_stackheap 進(jìn)行用戶棧的初始化, 這也就是啟動(dòng)文件 startup_stm32f10x_md_vl 中初始化堆棧段的那些語(yǔ)句,如圖
2-19

圖 2-19


經(jīng) 過(guò) 該 函 數(shù) 處 理 得 : r0=0x2000              0098,r1=0x2000              0698,r2=0x2000
0298,r3=0x2000 0298。最后用戶棧頂被設(shè)置成 0x2000 0698,完成了堆棧的初始 化工作,程序返回到 rt_entry_main


三、 總結(jié)

最終函數(shù)終于跳轉(zhuǎn)到我們的 main 函數(shù)執(zhí)行我們寫的代碼。 總結(jié)啟動(dòng)文件的整個(gè)過(guò)程,分為如下:
(1) 系統(tǒng)初始化,包括對(duì)中斷向量表的重新映射;
(2) 加載 RW 段;
(3) ZI 段清零;
(4) 初始化用戶堆棧;
(5) 初始化微庫(kù)(具體干什么我也不知道,屏蔽此處函數(shù)好像也能正常運(yùn)行);
(6) 調(diào)用 main 函數(shù)。

MDK main函數(shù)運(yùn)行前的分析.pdf

177.99 KB, 下載次數(shù): 15, 下載積分: 黑幣 -5

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品欧美一区二区 | 国产精品久久久久久久久免费相片 | 日本在线视频一区二区 | 草草影院ccyy | 国产精品一区二区三 | 成人三级网址 | 91天堂网| 日韩在线一区二区三区 | 成人免费视频一区二区 | 日韩一二区 | 日韩三区| 黄网在线观看 | 欧美成人自拍 | 日韩免费视频一区二区 | 午夜精品久久 | 国产精品久久久久久久岛一牛影视 | 精产国产伦理一二三区 | 请别相信他免费喜剧电影在线观看 | 亚洲综合婷婷 | 色成人免费网站 | 情侣酒店偷拍一区二区在线播放 | 在线看av的网址 | 欧美一级做性受免费大片免费 | av在线免费网 | 日本一区二区三区在线观看 | 欧美黑人国产人伦爽爽爽 | 日韩欧美在线观看视频 | 手机av网| 北条麻妃av一区二区三区 | 午夜精品| 成人毛片视频在线播放 | 日一区二区三区 | 精品久久久久一区二区国产 | 免费国产视频在线观看 | 一区二区三区不卡视频 | 在线视频 欧美日韩 | 国产成人福利在线 | 99精品久久久久久中文字幕 | 91在线看| 精品国产乱码久久久久久a丨 | 国产精品国产成人国产三级 |