種別 | 先頭番地 | サイズ |
---|---|---|
vectors(r) | 0x00000000 | 1kB |
rom(rx) | 0x00000400 | 255kB |
data(rwx) | 0x03FFC000 | 4kB |
stack(rw) | 0x03FFD000 | 8kB |
3rdステップ 静的変数の読み書き
作成日 | : | 2011/10/31 |
---|---|---|
最終更新日 | : | 2020/07/05 |
3rdステップ 静的変数の読み書き
作成日 | : | 2011/10/31 |
---|---|---|
最終更新日 | : | 2020/07/05 |
概要
本ステップでは静的変数の書き換えが可能になるようにしました。
静的変数を書き換え可能にする
2ndステップまでのソースコードでは静的変数がROM上に割り当てられるため値の書き換えができません。 本ステップではリンカスクリプトを修正し静的変数をRAM上に割り当てるようにします[1]。
μPD70F3716GCのメモリ構成
μPD70F3716GCは256kBのFlashROMと24KBのSRAMを持っています。 また、FlashROM上に割り込み/例外処理用のハンドラアドレス、 即ちH8/3069Fの内蔵FlashROMに割り当てられているアドレスの範囲は0x00000000番地から0x0003FFFF番地、 内蔵SRAMに割り当てられているアドレスの範囲は0x03FF9000番地から0x03FFEFFF番地に割り当てられています。 なお、0x03FFF000番地から0x03FFFFFFF番地の4kBは内蔵周辺機器用に割り当てられておりプログラム領域として使用することはできません[2]。
メモリマップ
今回、メモリマップとしては以下のように定義しました。必要に応じて改訂していきます。
ソースコードの修正
[今回の成果物]
[今回追加するファイル]
- なし
[今回修正するファイル]
- main.c
- ld.scr
- startup.s
main.c
書籍のままなので省略します。
ld.scr
前項で肝の部分は解説しているため省略します。
startup.s
μPD70F3716GCのスタックを指定するレジスタはr3なのでr3に_stackシンボルを指定するようにします。 今回、ここで嵌りました。
Langurは最初以下のように指定していました。
mov _stack, r3
このように指定すると、コンパイル時に以下のようなエラーが生じます。
startup.s: Assembler messages: startup.s:6: Error: unresolved expression that must be resolved
上記のエラーメッセージについてWeb上で調べても有力な情報はなかなか得られませんでした。 この問題の解は、山際伸一氏が著されたV850対応クロス開発環境の構築とその使い方[3]にありました。
V850のmov命令の第1オペランドは5bitか32bitの即値である必要があるようです。 即値を明示的に指定するためにhiloマクロを使用します。 なお、movhi命令などのように16bitの即値を指定する場合にはhi, loマクロを使用します。
そのため、以下のように命令を書き換えました。
mov hilo(_stack), r3
また、今回前述の問題の解決策を探るためにgasのコードも調査していました。 その際、r3ではなくspと指定できることが判ったためspに置き換えました。
mov hilo(_stack), sp
確認方法
1stステップと同様の方法で確認できます。
結果
問題ないことを確認しました。