Keil µVision4 + GCC (3) LPC2300 (3) Interrupt Vectors are in RAM2012年10月16日 19時01分32秒

Copy Exception Vectors to Internal RAM
さて、気になっていた RAM 上に Vectors をコピーして動かすという件だ。ソースをながめると RAM_INTVEC 、 REMAP 、 RAM_MODE を定義すれば目的は達せられるようだ。コンパイルしてみる。

LPC2300.s(865): error: undefined symbol Vectors used as an immediate value

なるほどラベルが無い。 Vectors をベクターの先頭に追加する。再びコンパイル。

LPC2300.s(865): error: symbol .cs3.interrupt_vector is in a different section

セクションが異なるとアクセスできないのか?
                ADR     R8, Vectors を
                LDR     R8, =Vectors に変更する

コンパイルは通るが動かない。シミュレータで見ると main に入った途端せっかく書いたベクターがクリアされてしまう。RAM の先頭 0x40 バイトを空けなくてはならないのだ。 .space を入れてみる。
                .section ".cs3.region-head.ram","wx"
                .globl  _RAM_INTVEC_
                .type   _RAM_INTVEC_, %object
_RAM_INTVEC_:   .space  0x40
                .size   _RAM_INTVEC_, . - _RAM_INTVEC_
やはり main に入った途端ベクターがクリアされてしまう。これは却下。

今度はエリアを強制的に空ける。リンカースクリプトの変更だ。
ram (rwx) : ORIGIN = 0x40000040, LENGTH = 64K-0x40

シミュレータではうまく動く。基板に書き込んでみても動く。しかし、実際に RAM 上のベクターテーブルで動いているのかどうかは確認のしようが無い。では、これで何ができるんだというと RAM 上にあるので書き換えができる。或いは FLASH 上に Monitor をおいて RAM でプログラムを実行できる。といった所だろうか。

環境:CQ-FRK-NXP-ARM
    + Keil MDK-ARM V4.53
    + GCC Sourcery CodeBench Lite 2012.03-56
    + KPIT Cummins GNU-Archive Editor v1.1
    + KPIT Cummins GNU-Map Viewer v1.0

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
このブログのタイトルは?(syslab と記入してください)

コメント:

トラックバック

このエントリのトラックバックURL: http://syslab.asablo.jp/blog/2012/10/16/6604351/tb