生活随笔
收集整理的這篇文章主要介紹了
简单的启动代码 IMPORT |Image$$RO$$Limit|
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡單的啟動代碼
| IMPORT |Image$$RO$$Limit| ?IMPORT |Image$$RW$$Base| ?IMPORT |Image$$ZI$$Base| ?IMPORT |Image$$ZI$$Limit|
?IMPORT Main ; 聲明C程序中的Main()函數
?AREA Start,CODE,READONLY ;聲明代碼段Start ?ENTRY ; 標識程序入口 ?CODE32 ; 聲明32位ARM指令 ???????????? ?Reset LDR SP,=0x40003F00 ?? ; 初始化C程序的運行環境 ?LDR R0,=|Image$$RO$$Limit| ?LDR R1,=|Image$$RW$$Base| ?LDR R3,=|Image$$ZI$$Base| ????????? ?CMP R0,R1 ?BEQ LOOP1 LOOP0 CMP R1,R3 ?????????LDRCC R2,[R0],#4 ?????????STRCC R2,[R1],#4 ?????????BCC LOOP0 LOOP1 LDR R1,=|Image$$ZI$$Limit| ???????MOV R2,#0 LOOP2 CMP R3,R1 ???????STRCC R2,[R3],#4 ???????BCC LOOP2 ???????B Main ; 跳轉到C程序代碼Main()函數 ????????END | |Image$$RO$$Base|? 表示RO輸出段運行時起始地址,也可以說是程序代碼存放的起始地址,由-ro-base這個參數指定; |Image$$RO$$Limit| 表示RO輸出段運行時存儲區域界限,其值可通過|Image$$RO$$Base|+Code sizes+RO Data sizes+4計算得出; 是編譯器內部產生的變量,也就是只讀屬性的程序段的最后一個字句的地址, |Image$$RW$$Base| 表示RW輸出段運行時起始地址,記得是運行時的地址,而不一定是加載時的存放地址,因為RW輸出段在加載時可能是在ROM中并緊跟著RO輸出段存放的,當程序運行時才移動到RAM起始地址為|Image$$RW$$Base|的區域,由-rw-base這個參數指定;未指定的話,默認緊跟RO輸出段,那么|Image$$RW$$Base|=|Image$$RO$$Limit|; |Image$$RW$$Limit| 表示RW輸出段運行時存儲區域界限,其值可通過|Image$$RW$$Base|+RW Data sizes+4計算得出; |Image$$ZI$$Base| 表示ZI輸出段運行時起始地址,它是運行時在RAM中生成的,緊跟著RW輸出段存放,其值和|Image$$RW$$Limit|一樣; |Image$$ZI$$Limit| 表示ZI輸出段運行時存儲區域界限,其值可通過|Image$$ZI$$Base|+ZI Data sizes+4計算得出。 一個程序包括只讀的代碼段和可讀寫的數據段。在ARM的集成開發環境中,只讀的代碼段和常量被稱作RO段(ReadOnly);可讀寫的全局變量和靜態變量被稱作RW段(ReadWrite);RW段中要被初始化為零的變量被稱為ZI段(ZeroInit)。對于嵌入式系統而言,程序映象都是存儲在Flash存儲器等一些非易失性器件中的,而在運行時,程序中的RW段必須重新裝載到可讀寫的RAM中。這就涉及到程序的加載時域和運行時域。簡單來說,程序的加載時域就是指程序燒入Flash中的狀態,運行時域是指程序執行時的狀態。對于比較簡單的情況,可以在ADS集成開發環境的ARM LINKER選項中指定RO BASE和RW BASE,告知連接器RO和RW的連接基地址。對于復雜情況,如RO段被分成幾部分并映射到存儲空間的多個地方時,需要創建一個稱為“分布裝載描述文件”的文本文件,通知連接器把程序的某一部分連接在存儲器的某個地址空間。需要指出的是,分布裝載描述文件中的定義要按照系統重定向后的存儲器分布情況進行。在引導程序完成初始化的任務后,應該把主程序轉移到RAM中去運行,以加快系統的運行速度。 | | |
總結
以上是生活随笔為你收集整理的简单的启动代码 IMPORT |Image$$RO$$Limit|的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。