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]

メモリマップ

今回、メモリマップとしては以下のように定義しました。必要に応じて改訂していきます。

表1. メモリマップ
種別先頭番地サイズ
vectors(r) 0x000000001kB
rom(rx)0x00000400255kB
data(rwx)0x03FFC0004kB
stack(rw)0x03FFD0008kB

ソースコードの修正

[今回の成果物]

[今回追加するファイル]

  • なし

[今回修正するファイル]

  • main.c
  • ld.scr
  • startup.s

main.c

書籍のままなので省略します。

ld.scr

前項で肝の部分は解説しているため省略します。

startup.s

μPD70F3716GCのスタックを指定するレジスタはr3なのでr3に_stackシンボルを指定するようにします。 今回、ここで嵌りました。

Langurは最初以下のように指定していました。

ソース1. 誤った_stackの指定
mov     _stack, r3

このように指定すると、コンパイル時に以下のようなエラーが生じます。

コマンド1. エラーメッセージ
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マクロを使用します。

そのため、以下のように命令を書き換えました。

ソース2. 正しい_stackの指定
mov     hilo(_stack), r3

また、今回前述の問題の解決策を探るためにgasのコードも調査していました。 その際、r3ではなくspと指定できることが判ったためspに置き換えました。

ソース3. r3のエイリアス
mov     hilo(_stack), sp

確認方法

1stステップと同様の方法で確認できます。

結果

問題ないことを確認しました。

参考文献

  1. 坂井弘亮, 12ステップで作る組込みOS自作入門, カットシステム, 2010
  2. NEC Electronics Corporation, ユーザーズマニュアル V850ES/JG2 32ビット・シングルチップ・マイクロコントローラ ハードウェア編, NEC Electronics Corporation, 2005
  3. 山際伸一, V850対応クロス開発環境の構築とその使い方, インタ-フェ-ス, vol. 33, no. 12, pp. 81-99, Dec. 2007