新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 地址重映射在ARM系統中的實現

        地址重映射在ARM系統中的實現

        作者: 時間:2013-04-12 來源:網絡 收藏

        ;接著把ZI段搬移到RAM中,并其將初始化為0

        mov r0,#0

        Idr r2,EndOfBSS

        Add r2,r2,r3

        2

        cmp r1,2

        strcc r0,[r1],#4

        bcc%B2

        ⑥地址的重新映射。中的Remap過程其實很簡單,只需重新設置ROMCON0~ROMCON5和DRAMCON0~DRAMCON3。在本系統中只需重新設置ROMCON0和DRAMCON0。

        源代碼:

        ;/*內存控制寄存器重新設置-存儲空間重新映射地址空間*/

        EXPORT RemapMemory

        RemapMemory

        mov r12,r14

        adr r0,RemapMem

        ldmia r0,{r1-r11}

        ldr r0,=ROMCON0 ;ROMCON0為Bank寄存器的起始地址

        stmia r0,{r1-r11}

        bl ExceptionTalbeInit ;中斷向量表重新初始化

        mov pc,r12

        RemapMem

        DCD 11040060 ;/*ROMCON0 0x1000000~0x1100000*/

        DCD 10000398 ;/*DRACON0 0x0~0x1000000*/

        ⑦進入C代碼空間,開始主程序的運行。此時代碼應該運行于RAM中。


        上面的步驟可以根據實際需要進行適當的添加或刪節。值得注意的是:匯編生成的代碼應該是與位置無關的代碼,即代碼在運行期間可以被映射到不同的地址空間,其中的跳轉指令都是基于PC寄存器的相對跳轉指令。基于PC的標號是位于目標指令前或者程序中數據定義偽操作前的標號,這種符號在匯編時將被處理成PC值加上或減去一個數字常量。

        3 的處理

        在Remap的啟動代碼中,需要特別注意的是的處理。在中,的入口地址是固定的,按表1次序排列。

        表1

        異常類型工作模式正常地址
        復位管理0x00000000
        未定義指令未定義0x00000004
        軟件中斷(SWI)管理0x00000008
        預取中止中止0x0000000
        數據中止中止0x00000010
        預留-0x00000014
        IRQ(中斷)IRQ0x00000018
        FIQ(快速中斷)FIQ0x0000001

        地址重新映射之后,入口地址被映射到RAM中,中斷處理代碼也被搬移到RAM地址空是。此時,中斷響應和中斷處理的速度都將大大加快,這將有利于提高整個系統的實時性。異常中斷向量表的設計結構如圖3所示。

        下面是各部分的源代碼(以IRQ異常中斷為例)。

        異常向量表的定義:(系統初始化時,將異常處理代碼入口地址寫入異常中的向量表)

        _RAM_END_ADDR EQU 0x01000000 ;重映射后RAM的終止地址

        MAP (_RAM_END_ADDR-0x100)

        SYS_RST_VECTOR # 4

        UDF_INS_VECTOR # 4

        SWI_SVC_VECTOR # 4

        INS_ABT_VECTOR # 4

        DAT_ABT_VECTOR # 4

        RESERVED_VECTOR # 4

        IRQ_SVC_VECTOR # 4

        FIQ_SVC_VECTOR # 4

        異常初始化代碼:

        b IRQ_SVC_HANDLER ;0x18

        IRQ_SVC_HANDLER

        SUB sp,sp,#4 ;滿遞減堆棧

        STMFD sp!,{r0}

        LDR r0,=IRQ_SVC_VECTOR ;讀取中斷向量,

        ;IRQ_SVC_VECTOR=SystemrqHandle

        LDR r0,[r0]

        STR r0,[sp,#4]

        LDMFD sp!,{r0,pc};跳轉到異常中斷處理代碼入口

        異常處理入口代碼:

        SystemIrqHandler

        IMPORT ISR_IrqHandler

        STMFD sp!,{r0-r12,lr}

        BL ISR_IrqHandler ;跳轉到C代碼中異常中斷處理程序ISR_IrqHandler

        LDMFD sp!,{r0-r12,lr}

        SUBS pc,lr,#4

        在如上的結構中,不管系統是否進行了地址的重映射,異常中斷向量都可以在運行時動態改變,大大提高了中斷處理中的靈活性。中斷向量可以在運行時指向不同的異常處理代碼入口。

        結語

        面對實時性要求越來越高的各種應用,不管應用中有沒有嵌入式操作系統,Remap都已經成為啟動代碼中必不可少的一部分。Remap的實現對于操作系統的移植也有重要的意義。Remap決定了系統啟動的效率,并對整個系統的實時性和穩定性產生很大影響。因而,對Remap過程的理解和設計,對于那些嵌入式系統的開發人員來說是非常重要的,它從一開始就決定了整個開發過程的最終成敗。


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 中宁县| 芒康县| 阿拉尔市| 错那县| 平安县| 汉川市| 河曲县| 繁昌县| 岐山县| 锡林浩特市| 杭州市| 永定县| 和政县| 大同县| 东光县| 轮台县| 大竹县| 南川市| 威海市| 柳河县| 西青区| 井研县| 恩施市| 右玉县| 千阳县| 辽阳县| 同仁县| 土默特左旗| 秦安县| 岳西县| 老河口市| 白山市| 惠州市| 青龙| 吕梁市| 汝阳县| 荔浦县| 那曲县| 仁怀市| 崇阳县| 中山市|