2.5.3. ROM/RAM のリマップ

ユーザは、最初に実行される命令のアドレス 0x0000 にどのようなメモリを配置するのかを検討する必要があります。

Note

このセクションでは、ARM コアによる命令フェッチが 0x0000 で開始されることが想定されています。このアドレスは、ARM コアベースシステムの標準です。ただし、一部の ARM コアでは、命令フェッチを 0xFFFF0000 から開始するように設定できます。

起動時にはアドレス 0x0000 に有効な命令が存在している必要があるため、リセット時に不揮発性メモリが 0x0000 に配置されるようにする必要があります。

1 つの方法としては、ROM を 0x0000 に配置することができます。ただし、この設定にはいくつかの欠点があります。一般的に、ROM へのアクセス速度は RAM よりも遅いため、例外ハンドラへ分岐する際に過度のパフォーマンスペナルティが発生する場合には、システムで問題が発生することがあります。また、ROM にベクタテーブルを配置すると、実行時にそのベクタテーブルを変更できなくなります。

Figure 2.13 は、別の方法を示しています。ROM はアドレス 0x10000 に配置されますが、このメモリは、リセット時にメモリコントローラによって 0 にエイリアスされます。リセット後、リセットハンドラ内のコードは ROM の実アドレスに分岐します。その後、メモリコントローラによって、エイリアスされた ROM が削除されるため、RAM がアドレス 0x0000 に配置されます。__main では、ベクタテーブルが 0x0000 にある RAM にコピーされるため、例外を処理することができます。

Figure 2.13. ROM/RAM のリマップ

ROM/RAM のリマップ

Example 2.8 は、ARM アセンブラモジュールで ROM/RAM のリマップを実装する方法を示しています。ここに示されている定数は Integrator プラットフォームに固有のものですが、ROM/RAM のリマップを同様の方法で実装するどのプラットフォームにも同じ方法を使用できます。

Example 2.8. ROM/RAM のリマップ

; --- Integrator CM control reg
CM_ctl_reg     EQU  0x1000000C     ; Address of CM Control Register
Remap_bit      EQU  0x04           ; Bit 2 is remap bit of CM_ctl

    ENTRY

; Code execution starts here on reset
; On reset, an alias of ROM is at 0x0, so jump to 'real' ROM.
        LDR     pc, =Instruct_2

Instruct_2
; Remap by setting Remap bit of the CM_ctl register
        LDR     r1, =CM_ctl_reg
        LDR     r0, [r1]
        ORR     r0, r0, #Remap_bit
        STR     r0, [r1]

; RAM is now at 0x0.
; The exception vectors must be copied from ROM to RAM (in __main)

; Reset_Handler follows on from here

最初の命令は、エイリアスされた ROM から実際の ROM へのジャンプです。この命令を実行できるのは、ラベル Instruct_2 が実際の ROM アドレスに配置されているためです。

このステップの後、Integrator コアモジュールの制御レジスタのリマップビットを反転することによって、ROM のエイリアスが削除されます。

通常、このコードは、システムのリセット直後に実行されます。リマップは、C ライブラリ初期化コードが実行される前に完了する必要があります。

Note

MMU が搭載されているシステムでは、システムの起動時に MMU の設定によってリマップを実装できます。

Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0203GJ
Non-Confidential