新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM的嵌入式系統(tǒng)程序開發(fā)要點(diǎn)

        基于ARM的嵌入式系統(tǒng)程序開發(fā)要點(diǎn)

        作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏


        下面是一段實(shí)現(xiàn)上述步驟的例程:
        -------------------------------------------------------------------------------------------------------
        ENTRY
        ;啟動時,從 0 開始,設(shè)法跳轉(zhuǎn)到“真”的ROM 地址(0x10000 開始的空間里)
        LDR pc, =start
        ;insert vector table here

        Start ;Begin of Reset_Handler
        ; 進(jìn)行 remap設(shè)置
        LDR r1, =Ctrl_reg ;假定控制 remap的寄存器
        LDR r0, [r1]
        ORR r0, r0, #Remap_bit ;假定對控制寄存器進(jìn)行 remap設(shè)置
        STR r0, [r1]
        ;接下去可以進(jìn)行從 ROM 到 RAM 的代碼和數(shù)據(jù)拷貝
        -------------------------------------------------------------------------------------------------------
        除此之外,還有另外一種常見的remap方式,如下圖:


        圖-6 存儲器重映射舉例 2

        原來 RAM 和 ROM 各有自己的地址, 進(jìn)行重映射以后 RAM 和 ROM 的地址都發(fā)生了變化,這種情況下,可以采用以下的方案:
        (1) 上電后,從 0 地址的 ROM 開始往下執(zhí)行。
        (2) 根據(jù)映射前的地址,對 RAM 進(jìn)行必要的代碼和數(shù)據(jù)拷貝。
        (3) 拷貝完成后,進(jìn)行 remap操作。
        (4) 因?yàn)?RAM 在 remap 前準(zhǔn)備好了內(nèi)容,使得 PC 指針能繼續(xù)在 RAM 里取到正確的指令。

        不同的系統(tǒng)可能會有多種靈活的 remap方案,根據(jù)上面提到的兩個例子,可以總結(jié)出最根本的考慮是: 要使程序指針在 remap以后能繼續(xù)往下得到正確的指令。

        5. 根據(jù)目標(biāo)存儲器系統(tǒng)分散加載映像(scatterloading)

        Scatterloading 文件是 ARM 的工具鏈里面的一個特性,作為程序編譯過程中給連接器使用的一個參數(shù),用來指定最終生成的目標(biāo)映像文件運(yùn)行時的分布狀態(tài)。如果用戶程序映像只是如圖7 所示的最簡狀態(tài),所有的可執(zhí)行代碼都集合放置在一起,那么可以不使用 Scatterloading 文件,直接用連接器的命令行選項(xiàng)就能夠完成設(shè)置:
        RO = 0x00000:表示映像的第一條指令開始地址;
        RW = 0x10000:表示變量區(qū)的起始地址,變量區(qū)一定要位于 RAM 區(qū)。


        圖-7 簡單的映像分布舉例

        但是一個復(fù)雜的系統(tǒng)可能會把映像分割成幾個部分。如圖 8,系統(tǒng)中存在多種類型的存儲器,不能的代碼部分根據(jù)執(zhí)行性能優(yōu)化的考慮分布與不同的地方。


        圖-8 復(fù)雜的映像分布舉例

        這時候不能通過簡單的 RO、RW 參數(shù)來完成實(shí)現(xiàn)上述配置,就要用到scatterloading 文件了。在 scatterloading文件里,可以給編譯出來的各個目標(biāo)模塊指定運(yùn)行地址,下面的例子是針對圖8 的。


        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 弥渡县| 循化| 乐山市| 南部县| 洛川县| 津南区| 巴东县| 海晏县| 乌兰察布市| 保定市| 苍山县| 罗田县| 海阳市| 湘乡市| 灵宝市| 蒙阴县| 金山区| 托克托县| 文化| 三原县| 菏泽市| 上虞市| 安西县| 兰考县| 麻阳| 西峡县| 朝阳区| 义马市| 台东市| 万年县| 北碚区| 体育| 铅山县| 清镇市| 保亭| 临海市| 永泰县| 武穴市| 沈丘县| 利川市| 英山县|