面對這樣乙個新東西,先去官網看看,或者看看ide的幫助,基本上你想要的東西都有了,baidu來的都不全面,這是一種學習方法。
這個鏈結是我在官網上找到的關於分散載入檔案的資料。講的比較詳細了。這裡通過乙個例子記錄下我學習的過程,通過分散載入檔案把**從flash裡拷貝到ram裡執行, 基於lpc1788。
先貼下我的sct檔案:
lr_irom1 0x00000000
0x00002000
rw_iram1 0x20000000
0x00004000
}lr_irom2 0x00002000
0x0007e000
er_iram1 +0
}
這裡有兩個載入域(load region)lr_irom1和lr_irom2,lr_irom1是初始化程式,拷貝**等,從rom的位址0開始,lr_rom2是應用程式,從rom的0x2000開始。+ro表示唯讀,**或者唯讀資料,一般用來表示**,+rw表示可讀可寫的資料,+zi表示初始化為0的資料。大括號裡面的為執行域(execution region),乙個載入域可以包含幾個執行域,lr_rom2裡面有兩個執行域,vector和er_iram1,我用vector來表示中斷向量區域,er_iram1來表示應用程式區,+0表示緊接著vector排放,empty表示空的,這裡空出0xe4的大小,用來放中斷向量,.any表示除了上面用到的**之外的**,官網上有專門解釋.any的一節。
下面用一張圖來表示這個程式的載入域和執行域:
其實載入域的empty這塊區域是不用空出來的,主要是執行域要空出來,用來拷貝中斷向量,看個人喜好了,我覺得空出來方便引用這塊區域的執行域位址。
這樣框架就比較清楚了,拷貝的程式清單如下:
extern
unsigned
char image$$vector$$base;
extern
unsigned
char image$$vector$$length;
extern
unsigned
char load$$er_iram1$$base;
extern
unsigned
char image$$er_iram1$$base;
extern
unsigned
char image$$er_iram1$$length;
void copycode2ram ()
count = (unsigned
int)&image$$er_iram1$$length;
pdes = (unsigned
char*)&image$$er_iram1$$base;
psrc = (unsigned
char*)(&load$$er_iram1$$base + 0xe4);
while (count--)
}
其中拷貝中斷向量的時候要指定中斷向量的偏移位址。load$$er_iram1$$base
表示執行域er_iram1
的載入位址;image$$er_iram1$$base
表示執行域er_iram1
的執行位址;image$$er_iram1$$length
表示執行域er_iram1
的實際長度,vector區域因為是empty,所以實際長度是0,而中斷向量的長度是固定的,所以程式裡就寫了個常數。 關於分散載入檔案
分散載入 scatlerloading 即工程裡的.scf檔案。在scatterfile中可以為每乙個 或資料區在裝載和執行時指定不同的儲存區域位址,scatlertoading的儲存區塊可以分成二種型別 裝載區 當系統啟動或載入時應用程式的存放區。執行區 系統啟動後,應用程式進行執行和資料訪問的儲...
ARM分散載入檔案
一 原理 arm的聯結器提供了一種分散載入機制,在連線時可以根據分散載入檔案 scf檔案 中指定的儲存器分配方案,將可執行映象檔案分成指定的分割槽並定位於指定的儲存器實體地址。這樣,當嵌入式系統在復位或重新上電時,在對cpu相應暫存器進行初始化後,首先執行rom儲存器的bootloader 根據連線...
ARM分散載入檔案
可以將 放入不同的儲存空間。了解分散載入檔案之前,首先需要了解code ro data rw data zi data。define num 0x2000 ro data char const flage 5 ro data char str str rw data char a zi data 下...