KEIL下分散加載文件的使用(zt)


KEIL下分散加載文件的使用
 

對於分散加載的概念,在《ARM體系結構與編程》書中第11章有明確介紹。

分散加載文件(即scatter file 后綴為.scf)是一個文本文件,通過編寫一個分散加載文件來指定
ARM連接器在生成映像文件時如何分配RO,RW,ZI等數據的存放地址。如果不用SCATTER文件指定,那么
ARM連接器會按照默認的方式來生成映像文件,一般情況下我們是不需要使用分散加載文件的。

但在某些場合,我們希望把某些數據放在指定的地址處,那么這時候SCATTER文件就發揮了非常大的作用
而且SCATTER文件用起來非常簡單好用。

舉個例子:比如像LPC2378芯片具有多個不連續的SRAM,通用的RAM是32KB,可是32KB不夠用,我想把
某個.C中的RW數據放在USB的SRAM中,那么就可以通過SCATTER文件來完成這個功能。
下面是就這個例子作的說明:


這是一個標准的常用的分散加載文件,現在加注釋於后,方便以后查閱:
;******************************************************************************
;
;                         SCATTER LOADING DESCRIPTION
;                                    ARM
;                             KEIL's uVision3 
;                   (RealView Microprocessor Developer Kit)
;
; Filename      : LPC2378_Flash.scat
;******************************************************************************

LR_IROM1 0x00000000 0x00080000    ;; 第一個加載域,名字為LR_IROM1,起始
{                  ;;地址為0x0,大小為0x80000
    ER_IROM1 0x00000000 0x00080000 ;;加載域中的運行時域,名字為ER_IROM1
    {          ;; 起始地址為0x0,大小為0x80000
        vectors.o (VECT, +First)    ;;將vectors.c編譯后生成的文件vectors.o中的代碼
        init.o (INIT)               ;;以及init.o中的代碼    
        * (+RO)                     ;;以及所有編譯生成的RO屬性的代碼全部存放在
    }                               ;;運行時域ER_IROM1指定的地址范圍內,存放方式:順序存放

    RW_IRAM1 0x40000000 0x0000e800  ;;這是第二個運行時域,功能同上
    {                                   ;;其中 *是代表具有()里面指定的屬性的全部數據
        *(+RW,+ZI)                  ;;與*功能相似的有.ANY,后面說明
    }                                                           ;; 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   {}
}


下面是針對LPC2378的USB SRAM作數據RAM使用的配置:

;******************************************************************************
;
;                         SCATTER LOADING DESCRIPTION
;                                    ARM
;                             KEIL's uVision3 
;                   (RealView Microprocessor Developer Kit)
;
; Filename      : LPC2378_Flash.scat
;******************************************************************************

LR_IROM1 0x00000000 0x00080000    ;; 第一個加載域,名字為LR_IROM1,起始
{                  ;;地址為0x0,大小為0x80000
    ER_IROM1 0x00000000 0x00080000 ;;加載域中的運行時域,名字為ER_IROM1
    {          ;; 起始地址為0x0,大小為0x80000
        vectors.o (VECT, +First)    
        init.o (INIT)
        * (+RO)
    }

    RW_IRAM1 0x40000000 0x0000e800
    {
        .ANY(+RW,+ZI)     ;; 此處.ANY替換原來的*,是因為下面的一個執行域對指定的模塊中的RW,ZI數據指定了存放地址
                                ;;用.ANY就可以把已經被指定的具有RW,ZI屬性的數據排除
    }                                                           ;; 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   {}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM