スパイス  組み込み制御装置の受注製作

Hitech-Cコンパイラを組み込み用に移植する
平成26年4月19日

プログラムの雛形(続き)
 HItech Cを使ったz80組み込み装置向けプログラムの雛形についての説明を続けます。
元々はCPM OS向けに設定されていたHItech Cを組み込み装置で使用する場合に変更が必要になるのは、Cプログラムに制御が渡る直前に行われるスタートアップ時の処理とOSに依存するライブラリ関数です。ライブラリ関数については問題になる関数を使用しないことで対応できます。問題はスタートアップ時の処理です。スタートアッププログラムについては、雛形の説明が終わった後で書いていきます。
 前回の説明でmakefikeの共通部分と変更部分の説明を行いました。次は、デバッグ用と製品用の動作を決める部分の説明を行います。まず、両者の違いは何かということから入ります。両者の違いを箇条書きにすると下記になります。  もう少し詳しく説明すると、スタートアッププログラムはデバッグ用には全てのプログラムをRAM上で動作させるのに対して製品用ではROM化を行います。ハードウェアの条件が異なるので処理内容も違うものになります。
 コンパイル時の最適化は、デバッグ用では最適化を禁止してあります。これによってコンパイラが出力するアセンブラリストにはCプログラムがコメントとして残ります。動作の検証が終わるまではこの状態の方がデバッグがはかどります。製品用では最適化を有効にしてプログラムのサイズを小さくします。反面、上記のCソースがコメントとして残らないのでデバッグは手間取ります。
 HEXファイルの名前はデバッグ用と製品用を同じ名前で出力すると取り違えて混乱することがあるため、製品用にはファイル名の終わりに”_r”(リリース版のつもり)を追加してあります。つまり、プロジェクトの名前が”test”の場合、デバッグ用HEXファイルは”test.hex”, 製品用は”test_r.hex”となります。ここで注意が必要なのは、ファイル名には8.3形式の縛りがあるため、今の仕様ではプロジェクト名(ソースファイル名の一つ)は6文字までに制限されます。

 デバッグ用のmakefileを以下に示します。
(平26年4月27日 雛形の仕様変更により記述内容を変更しました)
#共通部分の取り込み
include ..\makedef_1

#下の段ではRAMの開始番地を固定できるがその分RAMに無駄が出る
LFLAGS = -M$*.map -Ptext=$(D_ROM),data,bss,stack=$(D_STACK)
#LFLAGS = -M$*.map -Ptext=$(D_ROM),data=$(D_RAM),bss,stack=$(D_STACK)


$(PROJECT).hex: $(PROJECT).bin
    $(OBJHEX) $< $@
    @copy $@ .. >NUL

$(PROJECT).bin: start.obj $(OBJS)
    $(LINK) $(LFLAGS) -o$@ $^ A:LIBC.LIB

.c.obj:
    @if not exist $(CPMF). (mkdir $(CPMF).)
    @coc.exe $< $(CPMF)\$(<F)
    $(CC) $(D_CFLAGS) -C F:$(<F)
#   $(CC) $(D_CFLAGS) -S F:$(<F)


#アセンブラに-jオプションを追加すると、JP命令の一部をJR命令に置き換える。
#この機能は特にstart.asでのジャンプテーブルの命令バイト数を変更してしまう
#ので不都合な時がある。このため個別にアセンブル条件を明示しておく。
start.obj :start.as
    $(AS)  -o$@ E:$(<F)


#共通部分の取り込み
#
include ..\makedef_2
 まず、通常のコンパイル作業と異なる部分を先に説明します。通常はCソースから直接objファイルを作りますが、今回はCプログラムのコメント変換処理(”//”を”.* */”に置き換える)が先に入ります。この処理部分を太字で示してあります。ソースディレクトリ下にtmpディレクトリが存在しなければこれを新規に作成し、coc.exeというコメント形式を変換するプログラムによってCソースを変更します。coc.exeの引数は最初が入力ファイル名、次が出力ファイル名です。ここでも変数を使っているので分かり難いですが、変換すると下記になります。ワークディレクトリtmp下に元のCソースファイルと同じ名前で変換後のファイルを出力します。ちなみに先頭の"@"はmakeの機能でコマンド行表示出力を禁止します。
   @coc.exe <入力ファイル名> ..\tmp\<出力ファイル名>
 コンパイルは上記の変換後のCソースに対して行う必要があるため、コンパイルの指示部には”F:”(CPM側からみたワークディレクトリ)が追加されています。

 もう一つ注意すべきは、メモリ配置に関して二通りの選択肢を残してあります。”LFLAGS = ....”の記述部分です。デバッグ時にRAMの開始アドレスを固定したい場合は、下段が有効になるように上段の始めにコメントマーク"#"を追加し、下段のそれを削除します。今の設定では少ないRAM領域が無駄にならないようにプログラムのすぐ後に配置するようになっているので、プログラムの長さが変わる度にRAMの開始アドレスも変わります。

 次は製品用のmakefileです。
#共通部分の取り込み
include ..\makedef_1

LFLAGS = -M$(R_PROJECT).map -Ptext=$(R_ROM),data=$(R_RAM)/,bss,stack=$(R_STACK)

$(R_PROJECT).hex: $(R_PROJECT).bin
    $(OBJHEX) $< $@
    @copy $@ .. >NUL

$(R_PROJECT).bin:   start_r.obj $(OBJS)
    $(LINK) $(LFLAGS) -o$@ $^ A:LIBC.LIB

.c.obj:
    @if not exist $(CPMF). (mkdir $(CPMF).)
    @coc.exe $< $(CPMF)\$(<F)
    $(CC) $(R_CFLAGS) -C F:$(<F)
#   $(CC) $(R_CFLAGS) -S F:$(<F)


#アセンブラに-jオプションを追加すると、JP命令の一部をJR命令に置き換える。
#この機能は特にstart.asでのジャンプテーブルの命令バイト数を変更してしまう
#ので不都合な時がある。このため個別にアセンブル条件を明示しておく。
start_r.obj :start_r.as
    $(AS)  -o$@ E:$(<F)

#共通部分の取り込み
include ..\makedef_2
 デバッグ用との差異はスタートアップファイル名が”start”から”start_r”に変わっています。
最終出力であるHEXファイルにも”_r”が追加され、コンパイル行では最適化を要求する”-O”オプションが追加されています。

 ビルド方法
ビルド方法は/debugまたは/releaseディレクトリに移動して
  make
と入力します。
リンク段階でエラーとなった場合には、
  make clean
と入力して中間ファイルを削除した後から再度コンパイルしてください(コンパイル段階でのエラーでは必要ありません)。

タイトル先頭へ 前へ 次へ タイトル末尾へ