新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM分散加載文件

        ARM分散加載文件

        作者: 時間:2016-11-09 來源:網絡 收藏
        (一)原理

        ARM的連接器提供了一種分散加載機制,在連接時可以根據分散加載文件(.scf文件)中指定的存儲器分配方案,將可執行鏡像文件分成指定的分區并定位于指定的存儲器物理地址。這樣,當嵌入式系統在復位或重新上電時,在對CPU相應寄存器進行初始化后,首先執行ROM存儲器的Bootloader代碼,根據連接時的存儲器分配方案,將相應代碼和數據由加載地址拷貝到運行地址,這樣,定位在RAM存儲器的代碼和數據就在RAM存儲器中運行,而不再從ROM存儲器中取數據或取指令,從而大大提高了CPU的運行速率和效率。

        本文引用地址:http://www.104case.com/article/201611/317889.htm

        (二)結構

        Scatlertoading的存儲區塊可以分成二種類型:

        裝載區:當系統啟動或加載時應用程序的存放區。
        執行區:系統啟動后,應用程序進行執行和數據訪問的存儲器區域,系統在實時運行時可以有一個或多個執行塊。

        (三)分散加載時連接器生成的預定義符號

        在編譯連接時如果指定了分散加載文件(.scf文件),在連接后會自動生成如下變量:


        (四)具體例子說明

        ;ROM_LOAD為加載區的名稱,其后面的0x00000000表示加載區的起始地址(存放程序代碼的起始地址)
        ROM_LOAD 0x0
        {
        ;ROM_EXEC描述了執行區的地址,放在第一塊位置定義
        ROM_EXEC 0x00000000
        {
        ;從起始地址開始放置向量表(即Startup.o(vectors, +First),其中Startup.o為Startup.s的目標文件)

        ;+First表示Vector段放在最前面

        ;AREAvectors, CODE, READONLY
        Startup.o (vectors, +First)
        ;接著放置其它代碼(即* (+RO)),* 是通配符,類似WINDOW下搜索用的通配符
        * (+RO)
        }
        ;變量區IRAM的起始地址為0x40000000
        IRAM 0x40000000
        {
        ;放置Startup.o (MyStacks)
        Startup.o (MyStacks)
        }
        ;+0表示接著上一段,UNINIT表示不初始化
        STACKS_BOTTOM +0 UNINIT
        {
        ;放置AREA StackBottom, DATA, NOINIT
        Startup.o (StackBottom)
        }
        ;接著從0x40004000開始,放置AREAStacks, DATA, NOINIT,UNINIT表示不初始化
        STACKS 0x40004000 UNINIT
        {
        Startup.o (Stacks)
        }
        ;外部RAM從0x80000000開始為變量區

        ;如果片外RAM起始地址不為0x8000 0000,則需要修改mem_.scf文件
        ERAM 0x80000000
        {
        * (+RW,+ZI)
        }
        ;+0表示接著上一段,UNINIT表示不初始化
        HEAP +0 UNINIT
        {
        ;放置堆底,AREA Heap, DATA, NOINIT
        Startup.o (Heap)
        }
        ;接著在外部0x80080000放置堆頂

        ;這個地址是片外RAM 的結束地址,根據實際情況修改
        HEAP_BOTTOM 0x80080000 UNINIT
        {
        Startup.o (HeapTop)
        }
        }

        以上分散文件的可引用的段名

        |Image$$ROM_LOAD $$Limit|

        |Image$$ROM_EXEC $$Limit|

        。。。。。。。。。。。。。。。。

        ;重定向__user_initial_stackheap 函數

        ;分配新的bottom_of_heap地址等,R0-R3是函數必須的返回值,返回bottom_of_heap的值

        ;通過分散加載描述文件,重定向其位置,bottom_of_heap等已經在Startup.s中定義為DATA類型

        __user_initial_stackheap
        LDR r0,=bottom_of_heap
        ; LDR r1,=StackUsr
        LDR r2,=top_of_heap
        LDR r3,=bottom_of_Stacks
        MOV pc,lr



        關鍵詞: ARM分散加載文

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 资阳市| 德兴市| 渭源县| 黎平县| 富民县| 云阳县| 武宣县| 凤城市| 独山县| 旅游| 天峨县| 江城| 怀柔区| 永年县| 大安市| 香河县| 乐陵市| 团风县| 嘉祥县| 卢湾区| 林甸县| 文化| 长寿区| 凭祥市| 海宁市| 罗源县| 论坛| 岑巩县| 正蓝旗| 安宁市| 交城县| 梓潼县| 江阴市| 蒙山县| 夏河县| 台安县| 临沭县| 梓潼县| 陕西省| 渭源县| 航空|