4)初始化用戶程序的執(zhí)行環(huán)境
之前在44B0里的啟動(dòng)代碼里還有包括把ROM里的程序拷貝到RAM中并跳轉(zhuǎn)到RAM運(yùn)行程序,也就是把加載狀態(tài)下的程序按照編譯連接時(shí)的設(shè)置重新排布成運(yùn)行時(shí)的程序狀態(tài),以達(dá)到符號(hào)能夠正確連接的目的,這里是涉及到了所謂的映像文件,但是2410這里沒有這一段,即程序的加載態(tài)就是它的運(yùn)行態(tài),所以要求燒寫程序時(shí)必須要把它燒寫在設(shè)置的RO地址上,否則程序?qū)⒉荒苷_執(zhí)行。下面這段程序?qū)崿F(xiàn)RW數(shù)據(jù)初始化,只是把數(shù)據(jù)段復(fù)制到高地址,如果沒有設(shè)置RW的話這段代碼也不會(huì)執(zhí)行。
;Copy and paste RW data/zero initialized data
ldr r0, =|Image$$RO$$Limit| ; Get pointer to ROM data
ldr r1, =|Image$$RW$$Base| ; and RAM copy
ldr r3, =|Image$$ZI$$Base|
;Zero init base => top of initialised data
cmp r0, r1 ; Check that they are different
beq %F2
1
cmp r1, r3
ldrcc r2, [r0], #4
strcc r2, [r1], #4
bcc %B1
2
ldr r1, =|Image$$ZI$$Limit|
mov r2, #0
3
cmp r3, r1 ; Zero init
strcc r2, [r3], #4
bcc %B3
b %F1(B1)的意思是在臨近的地址標(biāo)號(hào)跳轉(zhuǎn),F(xiàn)是向后尋找,B是向前尋找。
5)說說映象文件
用ADS編譯產(chǎn)生的映像文件有.axf、.bin、.hex等等格式,就拿要直接燒進(jìn)Flash里的.bin文件來說,在其他書上看到有這么句話“映像文件一般由域組成,域由最多三個(gè)輸出段(RO,RW,ZI)組成,輸出段又由輸入段組成。”
對(duì)于這段話,前兩句是比較好理解的,域就是整個(gè)映像文件,對(duì)于大部分程序來說就只有一個(gè)域,也就是燒進(jìn)Flash里的那部分東東,稱作加載域;輸出段就是用AREA定義的RO,Rw,一般就這兩個(gè),拿前面的bootloader來說,整體框架是這樣的:
AREA Init,CODE,READONLY ;<--RO段
ENTRY
Entry ;<--CODE部分