6.5.2. リセット時のハンドラのインストール

アプリケーションがプログラムの実行開始をデバッガまたはデバッグモニタに依存していない場合には、アセンブリ言語のリセット(または起動)コードからベクタテーブルを直接ロードできます。

ROM がメモリ内の 0x0 に配置されている場合は、コードの開始部分に各ベクタの分岐ステートメントを記述できます。FIQ ハンドラが 0x1C から直接実行される場合は、この中に FIQ ハンドラを含めることも可能です(割り込みハンドラ参照)。

Example 6.2 は、アドレス 0 にある ROM にベクタが配置されている場合に、これらのベクタをセットアップするコードを示しています。ロード命令の代わりに分岐ステートメントを使用できます。

Example 6.2. 

Vector_Init_Block
                LDR    pc, Reset_Addr
                LDR    pc, Undefined_Addr
                LDR    pc, SVC_Addr
                LDR    pc, Prefetch_Addr
                LDR    pc, Abort_Addr
                NOP                     ;Reserved vector
                LDR    pc, IRQ_Addr
                LDR    pc, FIQ_Addr

Reset_Addr      DCD    Start_Boot
Undefined_Addr  DCD    Undefined_Handler
SVC_Addr        DCD    SVC_Handler
Prefetch_Addr   DCD    Prefetch_Handler
Abort_Addr      DCD    Abort_Handler
                DCD    0                ;Reserved vector
IRQ_Addr        DCD    IRQ_Handler
FIQ_Addr        DCD    FIQ_Handler

リセット時には 0x0 に ROM が配置されるように設定する必要があります。リセットコードを記述して、RAM を 0x0 にリマップできます。このリマップを行う前に、リセットコードで ROM 内の領域からベクタ(および必要に応じて FIQ ハンドラ)をコピーし、RAM に配置する必要があります。

この場合は、リセットベクタコードを位置非依存にできるよう、LDR pc 命令を使用してリセットハンドラのアドレスを指定する必要があります。

Example 6.2 では、Example 6.3 に示すベクタが RAM 内のベクタテーブルにコピーされます。

Example 6.3. 

    MOV        r8, #0
    ADR        r9, Vector_Init_Block
    LDMIA      r9!,{r0-r7}           ;Copy the vectors (8 words)
    STMIA      r8!,{r0-r7}
    LDMIA      r9!,{r0-r7}           ;Copy the DCD'ed addresses
    STMIA      r8!,{r0-r7}           ;(8 words again)

別の方法としては、スキャッタローディングメカニズムを使用して、ベクタテーブルのロード/実行アドレスを定義することもできます。この場合は、C ライブラリによってベクタテーブルがコピーされます(「Chapter 2 組み込みソフトウェアの開発」参照)。

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