ARM IMPORT Image$$RO$$Limit 的含義
IMPORT |Image$$RO$$Base| ; Base of ROM code
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 MMU_SetAsyncBusMode
IMPORT MMU_SetFastBusMode ;
IMPORT Main ; The main entry of mon program
...........
對于剛學(xué)習(xí)ARM的人來說,如果分析它的啟動代碼,往往不明白下面幾個變量的含義:|Image$$RO$$Limit|、|Image$$RW$$Base|、|Image$$ZI$$Base|。
首先申明我使用的調(diào)試軟件為ADS1.2,當(dāng)我們把程序編寫好以后,就要進(jìn)行編譯和鏈接了,在ADS1.2中選擇MAKE按鈕,會出現(xiàn)一個Errors and Warnings 的對話框,在該欄中顯示編譯和鏈接的結(jié)果,如果沒有錯誤,在文件的最后應(yīng)該能看到Image component sizes,后面緊跟的依次是Code,RO Data ,RW Data ,ZI Data ,Debug 各個項目的字節(jié)數(shù),最后會有他們的一個統(tǒng)計數(shù)據(jù):
Code 163632 ,RO Data 20939 ,RW Data 53 ,ZI Data 17028
Tatal RO size (Code+ RO Data) 184571 (180.25kB)
Tatal RW size(RW Data+ ZI Data) 17081(16.68 kB)
Tatal ROM size(Code+ RO Data+ RW Data) 184624(180.30 kB)
后面的字節(jié)數(shù)是根據(jù)用戶不同的程序而來的,下面就以上面的數(shù)據(jù)為例來介紹那幾個變量的計算。
在ADS的Debug Settings中有一欄是Linker/ARM Linker,在output選項中有一個RO base選項,下面應(yīng)該有一個地址,我這里是0x0c100000(不是每個都一樣的),后面的RW base 地址是0x0c200000,然后在Options選項中有Image entry point ,是一個初始程序的入口地址,我這里是0x0c100000 。
有了上面這些信息我們就可以完全知道這幾個變量是怎么來的了:
|Image$$RO$$Base| = Image entry point = 0x0c100000 ;表示程序代碼存放的起始地址
|Image$$RO$$Limit|=程序代碼起始地址+代碼長度+1=0x0c100000+Tatal RO size+1
= 0x0c100000 + 184571 + 1 = 0x0c100000 +0x2D0FB + 1
= 0x0c12d0fc
|Image$$RW$$Base| = 0x0c200000 ;由RW base 地址指定
|Image$$RW$$Limit| =|Image$$RW$$Base|+ RW Data 53 = 0x0c200000+0x37(4的倍數(shù),0到55,共56個單元)
=0x0c200037
|Image$$ZI$$Base| = |Image$$RW$$Limit| + 1 =0x0c200038
|Image$$ZI$$Limit| = |Image$$ZI$$Base| + ZI Data 17028
=0x0c200038 + 0x4284
=0x0c2042bc
也可以由此計算:
|Image$$ZI$$Limit| = |Image$$RW$$Base| +TatalRWsize(RWData+ZIData) 17081
=0x0c200000+0x42b9+3(要滿足4的倍數(shù))
=0x0c2042bc
ARM啟動代碼學(xué)習(xí)(一)RO和RW還有ZI代表什么?
一般而言,一個程序包括只讀的代碼段和可讀寫的數(shù)據(jù)段。在ARM的集成開發(fā)環(huán)境中,只讀的代碼段和常量被稱作RO段(ReadOnly);可讀寫的全局變量和靜態(tài)變量被稱作RW段(ReadWrite);RW段中要被初始化為零的變量被稱為ZI段(ZeroInit)。對于嵌入式系統(tǒng)而言,程序映象都是存儲在Flash存儲器等一些非易失性器件中的,而在運(yùn)行時,程序中的RW段必須重新裝載到可讀寫的RAM中。這就涉及到程序的加載時域和運(yùn)行時域。簡單來說,程序的加載時域就是指程序燒入Flash中的狀態(tài),運(yùn)行時域是指程序執(zhí)行時的狀態(tài)。對于比較簡單的情況,可以在ADS集成開發(fā)環(huán)境的ARM LINKER選項中指定RO BASE和RW BASE,告知連接器RO和RW的連接基地址。對于復(fù)雜情況,如RO段被分成幾部分并映射到存儲空間的多個地方時,需要創(chuàng)建一個稱為“分布裝載描述文件”的文本文件,通知連接器把程序的某一部分連接在存儲器的某個地址空間。需要指出的是,分布裝載描述文件中的定義要按照系統(tǒng)重定向后的存儲器分布情況進(jìn)行。在引導(dǎo)程序完成初始化的任務(wù)后,應(yīng)該把主程序轉(zhuǎn)移到RAM中去運(yùn)行,以加快系統(tǒng)的運(yùn)行速度。
什么是arm的映像文件,arm映像文件其實(shí)就是可執(zhí)行文件,包括bin或hex兩種格式,可以直接燒到rom里執(zhí)行。在axd調(diào)試過程中,我們調(diào)試的是axf文件,其實(shí)這也是一種映像文件,它只是在bin文件中加了一個文件頭和一些調(diào)試信息。映像文件一般由域組成,域最多由三個輸出段組成(RO,RW,ZI)組成,輸出段又由輸入段組成。所謂域,指的就是整個bin映像文件所處在的區(qū)域,它又分為加載域和運(yùn)行域。加載域就是映像文件被靜態(tài)存放的工作區(qū)域,一般來說flash里的 整個bin文件所在的地址空間就是加載域,當(dāng)然在程序一般都不會放在 flash里執(zhí)行,一般都會搬到sdram里運(yùn)行工作,它們在被搬到sdram里工作所處的地址空間就是運(yùn)行域。我們輸入的代碼,一般有代碼部分和數(shù)據(jù)部分,這就是所謂的輸入段,經(jīng)過編譯后就變成了bin文件中ro段和rw段,還有所謂的zi段,這就是輸出段。對于加載域中的輸出段,一般來說ro段后面緊跟著rw段,rw段后面緊跟著zi段。在運(yùn)行域中這些輸出段并不連續(xù),但rw和zi一定是連著的。zi段和rw段中的數(shù)據(jù)其實(shí)可以是rw屬性。
| Image$$RO$$Base| |Image$$RO$$Limit| |Image$$RW$$Base| |Image$$ZI$$Base| |Image$$ZI$$Limit|這幾個變量是編譯器通知的,我們在 makefile文件中可以看到它們的值。它們指示了在運(yùn)行域中各個輸出段所處的地址空間,| Image$$RO$$Base| 就是ro段在運(yùn)行域中的起始地址,|Image$$RO$$Limit| 是ro段在運(yùn)行域中的截止地址,其它依次類推。我們可以在linker的output中指定,在 simple模式中,ro base對應(yīng)的就是| Image$$RO$$Base|,rw base 對應(yīng)的是|Image$$RW$$Base|,由于rw和zi相連,|Image$$ZI$$Base| 就等于|Image$$RW$$limit|。其它的值都是編譯器自動計算出來的。
下面是2410啟動代碼的搬運(yùn)部分,我給出注釋:
BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|
adr r0, ResetEntry; ResetEntry是復(fù)位運(yùn)行時域的起始地址,在boot nand中一般是0
ldr r2, BaseOfROM;
cmp r0, r2
ldreq r0, TopOfROM;TopOfROM=0x30001de0,代碼段地址的結(jié)束
beq InitRam
ldr r3, TopOfROM
;part 1,通過比較,將ro搬到sdram里,搬到的目的地址從 | Image$$RO$$Base| 開始,到|Image$$RO$$Limit|結(jié)束
0
ldmia r0!, {r4-r7} ;將r0值作為地址處(ResetEntry)連續(xù)的4個32位數(shù)依次轉(zhuǎn)入r4,r5,r6,r7;同時r0增加。
stmia r2!, {r4-r7};將r4,r5,r6,r7的值依次存入|Image$$RO$$Base|地址處;同時r2增加。
cmp r2, r3
bcc %B0;
;part 2,搬rw段到sdram,目的地址從|Image$$RW$$Base| 開始,到|Image$$ZI$$Base|結(jié)束
sub r2, r2, r3;r2=0 ;上面拷貝時每次拷貝4個雙字(32位)大小,但是RO段大小不一定是4的整數(shù)倍,所以可能多拷貝了幾個雙字大小,r2-r3得到多拷貝的個數(shù)
sub r0, r0, r2 ;r0-(r2-r3)可以使r0指向在boot nand中RO的結(jié)束地址
InitRam ;carry rw to baseofBSS
ldr r2, BaseOfBSS ;TopOfROM=0x30001de0,baseofrw
ldr r3, BaseOfZero ;BaseOfZero=0x30001de0
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0
;part 3,將sdram zi初始化為0,地址從|Image$$ZI$$Base|到|Image$$ZI$$Limit|
mov r0, #0;init 0
ldr r3, EndOfBSS;EndOfBSS=30001e40
1
cmp r2, r3
strcc r0, [r2], #4
bcc %B1
至此三個輸出段組成(RO,RW,ZI)拷貝和初始化結(jié)束。
RO段、RW段和ZI段
學(xué)ARM。這些必須要懂:一直以來對于ARM體系中所描述的RO,RW和ZI數(shù)據(jù)存在似是而非的理解,這段時間對其仔細(xì)了解了一番,發(fā)現(xiàn)了一些規(guī)律,理解了一些以前書本上有的但是不理解的東西,我想應(yīng)該有不少人也有和我同樣的困惑,因此將我的一些關(guān)于RO,RW和ZI的理解寫出來,希望能對大家有所幫助。
要了解RO,RW和ZI需要首先了解以下知識:
ARM程序的組成
此處所說的“ARM程序”是指在ARM系統(tǒng)中正在執(zhí)行的程序,而非保存在ROM中的bin映像(image)文件,這一點(diǎn)清注意區(qū)別。
一個ARM程序包含3部分:RO,RW和ZI
RO是程序中的指令和常量
RW是程序中的已初始化變量
ZI是程序中的未初始化的變量
由以上3點(diǎn)說明可以理解為:
RO就是readonly,
RW就是read/write,
ZI就是zero
ARM映像文件的組成
所謂ARM映像文件就是指燒錄到ROM中的bin文件,也成為image文件。以下用Image文件來稱呼它。
Image文件包含了RO和RW數(shù)據(jù)。
之所以Image文件不包含ZI數(shù)據(jù),是因為ZI數(shù)據(jù)都是0,沒必要包含,只要程序運(yùn)行之前將ZI數(shù)據(jù)所在的區(qū)域一律清零即可。包含進(jìn)去反而浪費(fèi)存儲空間。
Q:為什么Image中必須包含RO和RW?
A:因為RO中的指令和常量以及RW中初始化過的變量是不能像ZI那樣“無中生有”的。
ARM程序的執(zhí)行過程
從以上兩點(diǎn)可以知道,燒錄到ROM中的image文件與實(shí)際運(yùn)行時的ARM程序之間并不是完全一樣的。因此就有必要了解ARM程序是如何從ROM中的image到達(dá)實(shí)際運(yùn)行狀態(tài)的。
實(shí)際上,RO中的指令至少應(yīng)該有這樣的功能:
1. 將RW從ROM中搬到RAM中,因為RW是變量,變量不能存在ROM中。
2. 將ZI所在的RAM區(qū)域全部清零,因為ZI區(qū)域并不在Image中,所以需要程序根據(jù)編譯器給出的ZI地址及大小來將相應(yīng)得RAM區(qū)域清零。ZI中也是變量,同理:變量不能存在ROM中
在程序運(yùn)行的最初階段,RO中的指令完成了這兩項工作后C程序才能正常訪問變量。否則只能運(yùn)行不含變量的代碼。
上一篇:s3c2440.jflash項目的配置(使用jlink下載boot到norflash)
下一篇:S3C2440運(yùn)行裸機(jī)小程序需燒錄到NAND Flash
推薦閱讀
史海拾趣
愛浦電子自成立以來,一直致力于模塊電源技術(shù)的研發(fā)與創(chuàng)新。在成立初期,公司便憑借其專業(yè)的研發(fā)團(tuán)隊和先進(jìn)的生產(chǎn)設(shè)備,成功研發(fā)出多款具有競爭力的模塊電源產(chǎn)品。隨著技術(shù)的不斷進(jìn)步,愛浦電子不斷對產(chǎn)品進(jìn)行升級和優(yōu)化,以滿足市場日益增長的需求。公司不僅通過了ISO9001質(zhì)量管理體系認(rèn)證,還成功獲得了CE、RoHS等國際認(rèn)證,進(jìn)一步提升了產(chǎn)品的品質(zhì)和競爭力。
在產(chǎn)品質(zhì)量得到保障的同時,愛浦電子也積極開展市場拓展和品牌建設(shè)工作。公司積極參加國內(nèi)外電子展會和技術(shù)交流活動,與眾多行業(yè)伙伴建立了緊密的合作關(guān)系。此外,愛浦電子還注重品牌形象的塑造,通過統(tǒng)一的對外標(biāo)識和全新的VI企業(yè)形象,提升了公司整體形象。這些努力使得愛浦電子在市場上逐漸樹立起了良好的口碑和品牌形象。
在產(chǎn)品質(zhì)量得到保障的同時,愛浦電子也積極開展市場拓展和品牌建設(shè)工作。公司積極參加國內(nèi)外電子展會和技術(shù)交流活動,與眾多行業(yè)伙伴建立了緊密的合作關(guān)系。此外,愛浦電子還注重品牌形象的塑造,通過統(tǒng)一的對外標(biāo)識和全新的VI企業(yè)形象,提升了公司整體形象。這些努力使得愛浦電子在市場上逐漸樹立起了良好的口碑和品牌形象。
Diodes公司積極實(shí)施全球化戰(zhàn)略,不斷拓展海外市場。公司在以色列、加利福尼亞、得克薩斯和日本等地設(shè)立了制造工廠,形成了覆蓋全球的生產(chǎn)和銷售網(wǎng)絡(luò)。這些工廠不僅為Diodes提供了充足的產(chǎn)能支持,也為公司贏得了更多國際客戶的青睞。同時,Diodes還積極參加國際展會和交流活動,加強(qiáng)與國際同行的合作與交流,不斷提升公司的國際化水平。
人才是企業(yè)發(fā)展的核心競爭力。Cantherm公司深知這一點(diǎn),因此始終重視人才的引進(jìn)和培養(yǎng)。公司不僅提供優(yōu)厚的福利待遇和廣闊的發(fā)展平臺,還積極開展員工培訓(xùn)和技能提升計劃。通過不斷吸引和培養(yǎng)高素質(zhì)人才,Cantherm公司逐漸建立了一支高效、專業(yè)的團(tuán)隊,為公司的持續(xù)發(fā)展提供了有力保障。
請注意,以上故事均為虛構(gòu),旨在展示一個電子行業(yè)中虛構(gòu)公司可能遇到的發(fā)展情況。如有需要,您可以根據(jù)實(shí)際情況進(jìn)行調(diào)整或補(bǔ)充。
隨著環(huán)保意識的日益增強(qiáng),Cantherm公司積極響應(yīng)國家號召,將環(huán)保理念融入產(chǎn)品設(shè)計和生產(chǎn)過程中。公司研發(fā)出一系列環(huán)保型電子產(chǎn)品,采用可降解材料和節(jié)能技術(shù),有效降低了產(chǎn)品對環(huán)境的影響。這一舉措不僅提升了公司的社會形象,還為公司帶來了更多的環(huán)保項目合作機(jī)會。
信號鏈基礎(chǔ)(1):運(yùn)算放大器 歡迎閱讀“信號鏈基礎(chǔ)”一文,這篇連載文章將介紹模擬信號鏈的工作。這些連載文章的主題將包括模擬信號處理以及支持它們所需要的器件。我們歡迎你隨時提出評論,這些評論甚至可能作為將來討論的主題。 運(yùn)算放大器—基本 ...… 查看全部問答∨ |
|
高手請教啊:關(guān)于SDRAM,NOR FLASH,NAND FLASH的擴(kuò)張 最近剛學(xué)習(xí)ARM嵌入式,關(guān)于擴(kuò)展這方面一直有些問題搞不明白: 擴(kuò)張SDRAM,NOR FLASH,NAND FLASH三塊片子,ARM的A1-A(x)地址線分別和這三個片子相連,那么這三個片子對于ARM 來說其地址單元是重復(fù)的,程序運(yùn)行其中的機(jī)理是什么呢?ARM重啟以后的開 ...… 查看全部問答∨ |
將sqlserver2000上的數(shù)據(jù)插入到ce數(shù)據(jù)里 有沒有辦法實(shí)現(xiàn)在PC上安裝sqlce,然后通過程序?qū)qlserver2000上的數(shù)據(jù)插入到ce數(shù)據(jù)里,然后再復(fù)制到設(shè)備上(因為有10W條左右的數(shù)據(jù),在設(shè)備上執(zhí)行這樣的操作時間太長),請大俠們幫忙,最好有詳細(xì)的方案… 查看全部問答∨ |
我用單片機(jī)做實(shí)驗,想外接一個鍵盤和數(shù)碼管,需要用到BC7281來控制,現(xiàn)在出現(xiàn)一點(diǎn)問題 主要涉及三個口線:DAT,KEY,CLK dat 接了一個20k上拉電阻,KEY,CLK,直接接到CPU上,這和手冊是一樣的 現(xiàn)在我DAT腳的電壓為3.5v,key為1.3v,clk為0v 然后我向clk寫 ...… 查看全部問答∨ |
|
最近做實(shí)驗發(fā)現(xiàn) ad7710的 VSS腳接-5伏 進(jìn)行正負(fù)電壓采集時讀出的數(shù)很不穩(wěn)定,會有5毫伏左右的跳動,當(dāng)VSS接地只進(jìn)行正電壓才采集時則沒有此現(xiàn)象 轉(zhuǎn)換結(jié)果很穩(wěn)定,有誰遇到過這個問題的么?該怎么解決… 查看全部問答∨ |
st網(wǎng)站看過了,有一個1。0的庫文件STM32_OTG_LIB,um0721.zip , 但是沒有發(fā)現(xiàn)能直接運(yùn)行在105/107上的例程,我需要找一個虛擬串口或usb_host或Mass_Storage。。 我還發(fā)現(xiàn)一個文件里面有stm3210e_eval 和stm3210b_eval 就是沒有我要找的stm321 ...… 查看全部問答∨ |
前言:板子是周日上午十點(diǎn)半拿到的,本來應(yīng)該早就來論壇告訴soso姐,并表達(dá)我激動的心情的,但是學(xué)校的網(wǎng)絡(luò)服務(wù)器太不給力,從昨天到今天一直都連不上網(wǎng),只能干等著它修好,郁悶~~~ &nbs ...… 查看全部問答∨ |
我是新手 用msp430 timerA想實(shí)現(xiàn)一個捕獲功能 用一根導(dǎo)線將CCI0A和ACLK連接起來 想測量ACLK的頻率 結(jié)果進(jìn)不去中斷 以下是代碼 求大神幫忙 #include uint ccr[100]; void main( ) { WDTCTL = W ...… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 上汽大眾:汽車網(wǎng)絡(luò)安全漏洞防護(hù)
- 恩智浦推出全新電池控制IC系列 助力新能源解決方案發(fā)展
- 全球首條GWh級新型固態(tài)電池生產(chǎn)線樣件下線
- 總投資455億元!三大動力電池項目齊刷進(jìn)度條
- 現(xiàn)代汽車韓國建氫燃料電池廠,2028年投產(chǎn)
- 6月融資一覽:智能汽車芯片、第三代半導(dǎo)體、機(jī)器人成資本焦點(diǎn)
- 艙駕一體“點(diǎn)燃”新戰(zhàn)事
- 汽車智能化2.0引爆「萬億蛋糕」,誰在改寫游戲規(guī)則?
- 2025研華智能系統(tǒng)產(chǎn)業(yè)伙伴峰會成功舉辦
- 意法半導(dǎo)體公布2025年第二季度財報和電話會議時間安排
- 下載MPS AI電源資料包,贏【Keep體脂秤、按摩眼罩、電腦支架】
- 《射頻技術(shù) For Dummies系列》書籍讀后感征集
- 有獎?wù)魑模貉痪€汽車VCU/MCU開發(fā)工程師,分享開發(fā)經(jīng)驗、難題、成長之路等
- 了解PI最新產(chǎn)品,評論、下載搶樓好禮送!
- 合泰ESK32-360 開發(fā)板“拍了拍”你,免費(fèi)測評在等你
- 下載有禮|電路設(shè)計的參考書《ADI 參考電路合集 (第4冊) 》
- 【EE團(tuán)拍賣】\\
- 推陳出“芯“——TI 帶你領(lǐng)略智能手機(jī)黑科技在線直播 預(yù)報名+看直播 好禮讓你嗨翻全場!
- mini2440裸機(jī)試煉之--myled
- mini2440裸機(jī)試煉之--按鍵控制蜂鳴器和LED
- mini2440裸機(jī)試煉之——PWM定時器按鍵更改頻率
- mini2440裸機(jī)試煉之--A/D模擬信號轉(zhuǎn)換
- mini2440裸機(jī)試煉之—RTC鬧鐘中斷,節(jié)拍中斷
- MicroLED到底是什么?解釋一下三星的新電視技術(shù)
- 惠普在PC市場份額再擴(kuò)大,聯(lián)想壓力大
- 中興將推出5G通訊設(shè)備:2019年發(fā)布
- 華為智能手表專利曝光:支持邊框觸控技術(shù)
- 盤點(diǎn)CES 2018展上的黑科技 最后一個想都想不到