<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM初始化程序分析

ARM初始化程序分析

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò ) 收藏
1個(gè)多月前看完周立功的ARM基礎與ARM基礎實(shí)驗教程二,然后專(zhuān)研了一段時(shí)間TI的TMS320C5402,弄不懂,迫于師傅要求要出另一產(chǎn)品的壓力,現在重新又來(lái)看ARM基礎實(shí)驗二,今天下午在A(yíng)DS下做了下Startup.s的實(shí)驗,終于把第一次沒(méi)懂的弄明白了。。。唉。。又收獲啊。。。。

源代碼與分析注釋如下:

本文引用地址:http://dyxdggzs.com/article/201611/316974.htm

;初始化C程序運行環(huán)境,然后進(jìn)入C程序代碼

IMPORT |Image$$RO$$Limit|

IMPORT |Image$$RW$$Base|

IMPORT |Image$$ZI$$Base|

IMPORT |Image$$ZI$$Limit|

IMPORT Main ;聲明C程序中的Main函數

AREA Start,CODE,READONLY

ENTRY

CODE32

RESET LDR SP,=0x40003F00

LDR R0,=|Image$$RO$$Limit| ;RO段結束地址加1 ,表示RO區末地址后面的地址,

;即RW數據源的起始地址,應該是RW的加載地址

LDR R1,=|Image$$RW$$Base| ;RW區在RAM里的執行區起始地址,也就是編譯器選項

;RW_Base指定的地址,應該是RW運行地址

LDR R3,=|Image$$ZI$$Base|;ZI區在RAM里面的起始地址

CMP R0,R1

BEQ LOOP1 ;R0與R1相等就跳轉

LOOP0 CMP R1,R3 ;R1小于R3

LDRCC R2,[R0],#4

STRCC R2,[R1],#4

BCC LOOP0

; COPY ROM TORAM

LOOP1 LDR R1,=|Image$$ZI$$Limit|

MOV R2,#0

LOOP2 CMP R3,R1

STRCC R2,[R3],#4 ;

BCC LOOP2 ;R3小于0,跳轉到LOOP2

; ZI清零

B Main

END

;一個(gè)arm由RO,RW,ZI三個(gè)段組成 其中RO為代碼段,RW是已經(jīng)初始化的全局變量,ZI是未初始化的全局變量(對于GNU工具 對應的概念是TEXT ,DATA,BSS)bootloader

;bootloader要將RW段復制到ram中并將ZI段清零 編譯器使用下列段來(lái)記錄各段的起始和結束地址

; |Image$$RO$$Base| ; RO段起始地址 2

; |Image$$RO$$Limit| ; RO段結束地址加1 ,表示RO區末地址后面的地址,即RW數據源的起始地址

; |Image$$RW$$Base| ; RW段起始地址

; |Image$$RW$$Limit| ; RW段結束地址加1

; |Image$$ZI$$Base| ; ZI段起始地址

; |Image$$ZI$$Limit| ; ZI段結束地址加1

;IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)

;IMPORT |Image$$RW$$Base| ; Base of RAM to initialise

;IMPORT |Image$$ZI$$Base| ; Base and limit of area

;IMPORT |Image$$ZI$$Limit| ; to zero initialise

;IMPORT Main ; The main entry of mon program

;大總結!!!!!!!!!!!!!映像一開(kāi)始總是存儲在ROM/Flash里面的,其RO部分既可以在ROM/Flash里面執行,也可以轉移到速度更快的RAM中執行;而RW和ZI這兩部分是必須轉移到可寫(xiě)的RAM里去。所謂應用程序執行環(huán)境的初始化,就是完成必要的從ROM到RAM的數據傳輸和內容清零。

;r0是RW區的load address

;r1是RW區的execution address

;當兩者相等時(shí)就不用拷貝

;不相等時(shí),程序先把ROM里|Image$$RO$$Limt|開(kāi)始的RW初始數據拷貝到RAM里面|Image$$RW$$Base|開(kāi)始的地址,當RAM這邊的目標地址到達|Image$$ZI$$Base|后就表示RW區的結束和ZI區的開(kāi)始,接下去就對這片ZI區進(jìn)行清零操作,直到遇到結束地址|Image$$ZI$$Limit|

這個(gè)啟動(dòng)程序,是為下面C語(yǔ)言程序做準備的,其實(shí)這個(gè)程序很有意義,為以后自己寫(xiě)C程序建立了環(huán)境

#define uint8 unsigned char

#define uint32 unsigned int

#define N 100

uint32 sum;

//計算1加到N N是大于0的數

void Main(void)

{

uint32 i;

sum=0;

for(i=0;i

{

sum+=i;

}

while(1);

}

非常感謝網(wǎng)上的朋友寫(xiě)的日志,看了你們的日志我才慢慢弄懂是啟動(dòng)是怎么會(huì )事情



關(guān)鍵詞: ARM初始化程

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>