新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > KEIL下分散加載文件的使用

KEIL下分散加載文件的使用

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
對(duì)于分散加載的概念,在《ARM體系結(jié)構(gòu)與編程》書(shū)中第11章有明確介紹。
分散加載文件(即scatter file 后綴為.scf)是一個(gè)文本文件,通過(guò)編寫(xiě)一個(gè)分散加載文件來(lái)指定
ARM連接器在生成映像文件時(shí)如何分配RO,RW,ZI等數(shù)據(jù)的存放地址。如果不用SCATTER文件指定,那么
ARM連接器會(huì)按照默認(rèn)的方式來(lái)生成映像文件,一般情況下我們是不需要使用分散加載文件的。
但在某些場(chǎng)合,我們希望把某些數(shù)據(jù)放在指定的地址處,那么這時(shí)候SCATTER文件就發(fā)揮了非常大的作用
而且SCATTER文件用起來(lái)非常簡(jiǎn)單好用。
舉個(gè)例子:比如像LPC2378芯片具有多個(gè)不連續(xù)的SRAM,通用的RAM是32KB,可是32KB不夠用,我想把
某個(gè).C中的RW數(shù)據(jù)放在USB的SRAM中,那么就可以通過(guò)SCATTER文件來(lái)完成這個(gè)功能。
下面是就這個(gè)例子作的說(shuō)明:
這是一個(gè)標(biāo)準(zhǔn)的常用的分散加載文件,現(xiàn)在加注釋于后,方便以后查閱:
;******************************************************************************
;
; SCATTER LOADING DESCRIPTION
; ARM
; KEILs uVision3
; (RealView Microprocessor Developer Kit)
;
; Filename : LPC2378_Flash.scat
;******************************************************************************
LR_IROM1 0x00000000 0x00080000 ;; 第一個(gè)加載域,名字為L(zhǎng)R_IROM1,起始
{                  ;;地址為0x0,大小為0x80000
ER_IROM1 0x00000000 0x00080000 ;;加載域中的運(yùn)行時(shí)域,名字為ER_IROM1
{ ;; 起始地址為0x0,大小為0x80000
vectors.o (VECT, +First) ;;將vectors.c編譯后生成的文件vectors.o中的代碼
init.o (INIT) ;;以及init.o中的代碼
* (+RO) ;;以及所有編譯生成的RO屬性的代碼全部存放在
} ;;運(yùn)行時(shí)域ER_IROM1指定的地址范圍內(nèi),存放方式:順序存放
RW_IRAM1 0x40000000 0x0000e800  ;;這是第二個(gè)運(yùn)行時(shí)域,功能同上
{ ;;其中 *是代表具有()里面指定的屬性的全部數(shù)據(jù)
*(+RW,+ZI) ;;與*功能相似的有.ANY,后面說(shuō)明
} ;; The following declarations select the "two region model" ;
;; A default __user_initial_stackheap() will be used ;
ARM_LIB_HEAP 0x40007000 EMPTY 0x00000100 {} ;;指定堆棧地址
ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00 {}
}
下面是針對(duì)LPC2378的USB SRAM作數(shù)據(jù)RAM使用的配置:
;******************************************************************************
;
; SCATTER LOADING DESCRIPTION
; ARM
; KEILs uVision3
; (RealView Microprocessor Developer Kit)
;
; Filename : LPC2378_Flash.scat
;******************************************************************************
LR_IROM1 0x00000000 0x00080000 ;; 第一個(gè)加載域,名字為L(zhǎng)R_IROM1,起始
{                  ;;地址為0x0,大小為0x80000
ER_IROM1 0x00000000 0x00080000 ;;加載域中的運(yùn)行時(shí)域,名字為ER_IROM1
{ ;; 起始地址為0x0,大小為0x80000
vectors.o (VECT, +First)
init.o (INIT)
* (+RO)
}
RW_IRAM1 0x40000000 0x0000e800
{
.ANY(+RW,+ZI)     ;; 此處.ANY替換原來(lái)的*,是因?yàn)橄旅娴囊粋€(gè)執(zhí)行域?qū)χ付ǖ哪K中的RW,ZI數(shù)據(jù)指定了存放地址
;;用.ANY就可以把已經(jīng)被指定的具有RW,ZI屬性的數(shù)據(jù)排除
} ;; The following declarations select the "two region model" ;
WEBRPGRADE 0x7fd00000 0x1fff
{
webupgrade.o(+RW,+ZI) ;;webupgrade.o文件中所有變量都存在USB SRAM中
}
;; A default __user_initial_stackheap() will be used ;
ARM_LIB_HEAP 0x40007000 EMPTY 0x00000100 {}
ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00 {}
}


關(guān)鍵詞: KEIL加載文

評(píng)論


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

關(guān)閉