新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > KEIL下分散加載文件的使用

        KEIL下分散加載文件的使用

        作者: 時間:2016-11-28 來源:網絡 收藏
        對于分散加載的概念,在《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
        ; KEILs 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
        ; KEILs 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 {}
        }


        關鍵詞: KEIL加載文

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宾川县| 汉中市| 宿迁市| 肥西县| 炎陵县| 英德市| 承德县| 台中县| 东莞市| 榕江县| 洱源县| 清远市| 五大连池市| 江都市| 图木舒克市| 儋州市| 徐州市| 阳东县| 察隅县| 海门市| 延津县| 江源县| 会昌县| 宝兴县| 海兴县| 太仆寺旗| 雷州市| 聂拉木县| 卓资县| 太谷县| 安庆市| 枝江市| 双峰县| 含山县| 太湖县| 河西区| 孟村| 桂东县| 抚顺市| 昂仁县| 昆山市|