Keil µVision4 + GCC (3) LPC2300 (3) Interrupt Vectors are in RAM ― 2012年10月16日 19時01分32秒
さて、気になっていた 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
セクションが異なるとアクセスできないのか?
コンパイルは通るが動かない。シミュレータで見ると main に入った途端せっかく書いたベクターがクリアされてしまう。RAM の先頭 0x40 バイトを空けなくてはならないのだ。 .space を入れてみる。
今度はエリアを強制的に空ける。リンカースクリプトの変更だ。
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
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: http://syslab.asablo.jp/blog/2012/10/16/6604351/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。