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

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

プログラムの雛形
 HItech Cを使ったz80組み込み装置向けプログラムの雛形をダウンロードできるようにしておきます。
Hitech-C_Sample.zip  ダウンロード(平26年4月28日資料改変)

ここでは、この雛形を使って独自のプログラムをコンパイルするために必要な情報を書いていきます。まず、コンパイラのインストールや環境設定を正しく行ってください(動作環境の準備参照)。次にCPMでのドライブの割り当てとDOSでのディレクトリの対応を意識する必要があります(CPM.EXE for Win32参照)。
上記の雛形ではcpm-project/testディレクトリに全てのソースファイルがあります。cpm-project/testディレクトリがE:ドライブ、cpm-project/test/tmpディレクトリがF:ドライブになります。実際の設定では相対パスを使います。ユーザ定義のインクルードファイルはcpm-project/inc(ディレクトリ名は実情に合わせて変更します)の一箇所に集められています。これをG:ドライブに割り当てます。もし、他にもインクルードファイルを参照するディレクトリがあれば、H:ドライブ以下順番にドライブ名を割り当てます。
(平26年4月19日追記)
言葉だけではわかり難いので図にしてみました。


(追記ここまで)
 プログラムのコンパイルはmakeによって行います。make自体の説明は非常に複雑なので別のHPなどから基本的な動作を学習してください。ここではmakeの基本的な動作は分かっているとして書いていきます。実際のコンパイル作業は/testディレクトリ下の/debug、/releaseディレクトリで行います。makefileは(共通部分および変更頻度の高いパラメータ)とそれ以外に分かれており、共通部分は/testディレクトリにあるmakedef_1とmakedef_2です。makedefのリストを下記に示します。
(平26年4月28日 雛形の仕様変更により記述内容を変更しました)
makedef_1のリスト

#   デバッグ用プロジェクト名の設定(文字数制限に注意)
#
PROJECT = test

#   製品用プロジェクト名の設定(文字数制限に注意)
#
R_PROJECT = $(PROJECT)_r


#   オブジェクトの登録
#       注意:CPMのコマンドラインは120文字程度までらしくファイルは数個以内
#           に収めないとリンク時にコマンド行に収まらずエラーを起こす。
#           (大抵は最後に指定したライブラリファイル名が欠損する)
#
OBJS = $(PROJECT).obj misc.obj 

#   MAKEの設定
#
.SUFFIXES:  .h .c .obj .as .lib .hex .bin

LIBR    = cpm -h libr
AS  = cpm -h zas
CC  = cpm -h c
LINK    = cpm -h link
OBJHEX  = cpm -h objtohex

#   メモリ配置の設定
#
#デバッグ用ROM/RAM開始アドレスとSPの初期値
D_ROM = 8000h
D_RAM = b000h
D_STACK = fdffh
#製品化用ROM/RAM開始アドレス(R_ROMはジャンプアドレスである66h以降の値とする)
R_ROM = 80h
R_RAM = 8000h
R_STACK = ffffh

#   DOSのディレクトリをCPMのドライブに割り当てる
#   (相対指定の場合は/debugディレクトリに入った位置を基準)
#   C:,D:はCPM.exeの自動割り当て機能があるので空けておく。
#   E:にソースファイル用(/debug, /releaseの親ディレクトリ)
#   F:にCソースのコメント変換後のワーク用(/tmp)
#   G:以降はインクルードファイル用
#
export CPME = ..
export CPMF = ..\tmp
export CPMG = ..\..\inc


#   各コマンドへのオプション
#
IDIR = -Ig:

#   コンパイル条件は製品化の時には最適化をかける
#
D_CFLAGS = -x $(IDIR)
R_CFLAGS = $(D_CFLAGS) -O
AFLAGS = 

#   デフォルトのコンパイル条件
#
vpath %.as ..
vpath %.c  ..
vpath %.h $(CPMG)

.as.obj:
    $(AS) $(AFLAGS) -o$@ E:$(<F)

.bin.hex:
    $(OBJHEX) $< $@




makedef_2のリスト

#   コンパイル以外の処理を記述する
#
.PHONY : clean
clean:
    del  *.c 2>NUL
    del  *.obj 2>NUL
    del  *.as 2>NUL
    del  *.hex 2>NUL
    del  *.bin 2>NUL
    del  *.map 2>NUL
    @del  /Q $(CPMF)\*.* 2>NUL


 ユーザプログラムの変更によって影響を受ける部分を斜太字で示してあります。プロジェクト名および製品基板におけるROM/RAMおよびSPのアドレスとユーザ定義のインクルードディレクトリの設定です。インクルードディレクトリの設定はexportによる宣言とIDIR変数によるパラメータ設定が一致している必要があります。上記の例では”export CPMG = ..\..\inc”によってGドライブに..\..\incディレクトリが割り当てられ、”IDIR = -Ig:”によってインクルードディレクトリとしてGドライブが指定されています。これでGドライブを読みに行くと”..\..\inc”ディレクトリを見ることが出来ます。
 取り合えずコンパイルが通れば良いなら、以下は無視してください。
少しだけmakeとコンパイル手順の説明を書いておきます。
このコンパイルではソースファイルと作業ディレクトリを別にして行います。こうする理由は製品用とデバッグ用でコンパイル条件が異なるため、これらの条件の違いによる混乱を避けるためです。コンパイル作業は/test/debugおよび/test/releaseディレクトリで行います。この位置からはソースディレクトリである/testは親ディレクトリになります。従ってソースディレクトリの設定は相対パス表現で”CPME=..”となります。同様にワークディレクトリの設定も”CPMF=..\tmp”となります。
 ワークディレクトリからソースディレクトリにあるプログラムを探す方法としてはvpathを使った方法があります。vpathはカレントのディレクトリに必要なファイルが無い時に指定された拡張子に限って、指定のディレクトリを探してくれます。ワークディレクトリにはソースファイルは一切置かれて無いので無条件に指定(ソース)ディレクトリを探してくれます。
 もう一つ注意が必要な記述があります。アセンブラからobjを出力するときのコマンドですが、下記のようになっています。
  $(AS) $(AFLAGS) -o$@ E:$(<F)
変数を使っているので分かり難いのですが、変数を定義どおりに翻訳すると次のようになります。
  cpm -h zas -o<出力ファイル名> E:<入力ファイル名>
入力ファイルの前に”E:”が指定されています。これはソースファイルをCPM側から見るとEドライブに割り当てられているため、このような記述になります。コマンド行の中で”cpm -h”まではDOS側のみが認識しますが、それ以降はCPM側でも認識できる必要があるのでCPMの記述ルールに従います。他でも同じようにCPMが認識するコマンドラインではCPM側から見たドライブ指定を行う必要があります。

   ファイル名とファイル数の制限について
 プロジェクト名は現在のmakefile仕様では6文字以内に制限されます。
また、リンク時のコマンドライン行の長さの制限(120文字程度のようです)から、あまり多くのファイルを使うことが出来ません。3〜4個程度に抑える必要があります。
雛形に追加したAddTstプロジェクトでは、この制限によってそのままではコンパイルできません。Mapファイルの名前を短く変更することで何とかコンパイルが出来ます。変更後のmakefileをmakefile.tmpとしてあります。

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