AKI-H8/3664fのCクロスコンパイラ環境でのプログラミング
自分で割り込みを記述する簡単コマンド利用版
Copyright(C)22May2004
coskx
1.はじめに
この文書は,Windows2000パソコンにAKI-H8/3664fのC言語クロスコンパイル環境での,コンパイル作業のための方法を記述しています。あらかじめ指導者あるいはパソコン管理者が構築したC言語クロスコンパイラ環境(秋月のセットで配布されている日立の評価コンパイラを利用します。)で,C言語によるH8プログラミングを学ぼうとする方がプログラミングを行ない,AKI-H8/3664fでプログラムが動作するまでを解説します。C言語のプログラミングについては別の文書で学んでください。
割り込み処理に必要なことはすべて自分で記述することを前提にした環境の紹介と解説です。
なお,割り込みテーブルの作成にはアセンブリファイルでの記述を推奨します。Cファイル中でインラインアセンブリの記述ができることになっているのですが,コンパイラにおいて,相対ジャンプのオペランドがすべて8bitになるという不具合が生じています。今のところこれが克服できません。
図1.1 AKI-H8/3664f 電源部,LED部は独自仕様 |
本文書で記述してある作業の特徴
Cプログラムソースファイルが出来上がったら,ドラッグアンドドロップを1回行なうだけです。他に何もすることはありません。簡単コマンドを用いるので,作業が効率的です。
前提
(1)秋月から購入したCコンパイラ関係ファイルおよびインクルードファイル,ライブラリファイルはすべて「C:\Program
Files\h8_3664」に入っているものとします。
(2)startup3664Basic.OBJ(ここから取得可能):スタートアップルーチンも「C:\Program
Files\h8_3664」に入っているものとします。
(3)h8_3664Basic.cmd(ここから取得可能):コンパイル用コマンドも「C:\Program
Files\h8_3664」に入っているものとします。
(4)CNVS.EXE:モトローラSファイルへのコンバータは「トランジスタ技術2002年3月号付録CDROM」より入手し,「C:\Program
Files\h8_3664」に入っているものとします。
(5)転送ソフト「h8write.exe」を利用します。これも「C:\Program
Files\h8_3664」に入っているものとします。
転送ソフト「h8write.exe」はみついわゆきお氏のオープンツールです。次の場所から入手できます。
http://mes.sourceforge.jp/h8/writer-j.html
その他にH8WriteTurboあるいはH8Write(Masahiro Ochiai氏)を用いてもよいでしょう。
H8WriteTurboは製品添付版です。H8Writeは次の場所から入手できます。
http://strawberry-linux.com/h8/
注意
2.プログラムの作成から実行まで
シングルボードマイコンAKI-H8/3664f内で動作するプログラムはパソコン上で開発され、シングルボードマイコンAKI-H8/3664fにフラッシュメモリ書き込みされます。パソコンで開発されるソースプログラムはC言語で記述され、クロスコンパイラにより、オブジェクトプログラムに変換され、最後はフラッシュメモリ書き込み形式(XXXX.MOT)になります。
シングルボードマイコンAKI-H8/3664fを動作させるまでの大きな流れは以下のようになります。
(1)パソコン上で作業用のフォルダの用意
(2)パソコン上でCソースプログラムの作成
(3) パソコン上でフラッシュメモリ書き込み形式ファイル(実行プログラム)の作成(クロスコンパイル、コード変換)
(4)パソコン上の転送ソフトによる,フラッシュメモリ書き込み形式ファイル(実行プログラム)のAKI-H8/3664fへの書き込み操作
これら四つの作業によりシングルボードマイコン内で動作させることが出来ます。
3.テンプレートフォルダの実行
(1)図3.1に示すテンプレートフォルダでの実行の様子を確かめてみよう。
テンプレートフォルダのダウンロードは 「 ここ 」 です。 |
図3.1 小坂のテンプレートフォルダ
(2)テンプレートフォルダがダウンロードできたら,解凍し,「xxxxxx.c」の内容をエディタで確かめてみてください。
プログラムは,AKIH8/3664fマザーボード上のLEDを点滅させるものです。プログラムの内容には深入りしないことにしましょう。
リスト プログラムソースファイル"xxxxxx.c"
#include "3664f.h"
void msecwait(int msec)
/*msec間なにもしない時間稼ぎ関数*/
{
int i,j;
for (i=0;i<msec;i++) {
for (j=0;j<1588;j++); /*1588は実測によって求めた値*/
}
}main()
{
IO.PCR8=0xc0; /*#6,#7を1にセットし,出力に設定*/
while (1) {
IO.PDR8.BYTE=0x80;
msecwait(500);
IO.PDR8.BYTE=0x40;
msecwait(500);
}
}
(3)この後の作業は次のようになります。
ただし,図3.1のテンプレートフォルダは「デスクトップ」あるいは「マイドキュメント」の中にあるとします。
表3.1 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作から実行までの手順
パソコン側 |
マイコンH8側 | |||
(1) | <1>AKI-H8/3664fのマザーボード上の電源スイッチをOFFにします。 <2>AKI-H8/3664fのマザーボード上の状態選択ショートバーをショートし,ライト(Write)モードにします。ライトモードとはマイコンH8/3664fがパソコンからプログラムコードを受け取り,フラッシュメモリに書き込むモードのことです。 <3>AKI-H8/3664fのマザーボード上の電源スイッチをONにします。 | |||
(2) |
ソースファイル(xxxxxx.c)のアイコンを「h8_3664Basic.cmdへのショートカット」のアイコン上にドラッグアンドドロップします。
|
|||
(3) |
<1>転送が終了したら、AKI-H8/3664fのマザーボード上の電源スイッチをOFFにします。 |
(4)ここまでの作業が順調に出来ていたら,AKI-H8/3664fマザーボード上の2つのLEDが点滅して動作が確認できるはずです。
4.新規プログラムの開発手順
4.1 パソコン上で作業用のフォルダの用意
作業準備は作業用フォルダを適当な場所に作る作業です。
作業用のフォルダを用意します。ここではled00という名前のフォルダを使用することにします。
その中には以下のファイルを用意しておきます。
(1)h8_3664Basic.cmdへのショートカット 「C:\Program
Files\h8_3664\h8_3664Basic.cmd」を指すようになっています。
(2)h8_3664.h 小坂作成
これ以外に
(3)to_H8.ht
ハイパーターミナル設定ファイル
(RS232C設定が終わっているもの 38400baud, Async, 8bit , NoParity,
stop1)
が入っていると便利です。
これ以降の作業はすべてこのフォルダ内で行われます。
(テンプレートフォルダの複製を作ってフォルダ名をled00としてもよいでしょう)
4.2 プログラムの作成
Windowsマシン上のエディタ上で、C言語で記述されているソースプログラムを作成します。
例えばled00.cを作るという仮定で以下の説明にはいります。リストにあるファイルを作成してください。
このリストをコピー&ペーストするとよいでしょう。
リスト プログラムソースファイル"led00.c"
#include "H8_3664.h"
void msecwait(int msec)
/*msec間なにもしない時間稼ぎ関数*/
{
int i,j;
for (i=0;i<msec;i++) {
for (j=0;j<1588;j++); /*1588は実測によって求めた値*/
}
}main()
{
initPCR();
initLed();
while (1) {
turnOnLed(0);
turnOffLed(1);
msecwait(500);
turnOnLed(1);
turnOffLed(0);
msecwait(500);
}
}
ここまでの作業でフォルダled00の中には
(1)h8_3664Basic.cmdへのショートカット
(2)h8_3664.h
(3)to_H8.ht ハイパーターミナル設定ファイル
(4)led00.c
ができているはずです。
4.3 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作
Cプログラムソースファイル「led00.c」が出来ましたら,次の手順で実行してください。
表4.1 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作から実行までの手順
パソコン側 |
マイコンH8側 | |||
(1) | もしハイパーターミナルなどCOMポートを使用しているソフトがパソコン上で動作している時はそれらのソフトを中止します。 | |||
(2) | <1>AKI-H8/3664fのマザーボード上の電源スイッチをOFFにします。 <2>AKI-H8/3664fのマザーボード上の状態選択ショートバーをショートし,ライト(Write)モードにします。ライトモードとはマイコンH8/3664fがパソコンからプログラムコードを受け取り,フラッシュメモリに書き込むモードのことです。 <3>AKI-H8/3664fのマザーボード上の電源スイッチをONにします。 (注意:H8は,電源スイッチONの瞬間に,状態選択ショートバーの状態を検査しますので,必ず<1><2><3>の手順が必要です) | |||
(3) |
出来上がったソースファイル(led00.c)のアイコンを「h8_3664Basic.cmdへのショートカット」のアイコン上にドラッグアンドドロップします。
|
|||
(4) | <1>転送が終了したら、AKI-H8/3664fのマザーボード上の電源スイッチをOFFにします。 <2>AKI-H8/3664fのマザーボード上の状態選択ショートバーをオープンし,ラン(Run)モードにします。 | |||
(5) | 必要ならパソコン側で「to_H8.ht」をダブルクリックしてターミナルアプリケーション「ハイパーターミナル」を立ち上げます。 | |||
(6) | AKI-H8/3664fのマザーボード上の電源スイッチをONにすると転送したプログラムが作動します。 |
注意(1) ネットワーク上のフォルダを利用する場合はネットワークドライブを割り当ててから実行する。ただし,動作が遅いので勧めません。自分のHD上で作業しましょう。
注意(2) もしマルチソースファイルでのプログラミングの時は必要なソースファイルすべてを同時にドラッグアンドドロップしてください。5個まで対応しています。
このWebページの最後の参考リスト1にh8_3664Basic.cmdのソースを示します。自分の環境に合うように設定を変えても結構です。
ここまでの作業でフォルダled00の中には
(1)h8_3664Basic.cmdへのショートカット
(2)h8_3664.h
(3)to_H8.ht ハイパーターミナル設定ファイル
(4)led00.c
(5)led00.MOT フラッシュメモリ書き込み形式ファイル(実行プログラム)
(6)lud00.MAP メモリマップファイル(通常は不要)
ができているはずです。
なお「コンパイル−リンク−コンバート−転送」作業における失敗時の画面例を以下に示します。
失敗例1 Cソースプログラムで文法エラーがあった時
(led01.cの7行目に宣言されていない変数iとjがある)
(エラーメッセージでファイル名の次はエラー行番号!)Compile, link and convert command for H8 C-programing with V2 ver1.00
Copyright(c) 28June2002 coskxH8S,H8/300 SERIES C Compiler Ver. 2.0D Evaluation software
Copyright (C) 1994,1996 Hitachi,Ltd.
Licensed Material of Hitachi,Ltd.
Licensed Material of Hitachi Engineering Co.,Ltd.led01.C(17) : 2225 (E) UNDECLARED NAME: "i"
led01.C(17) : 2220 (E) MODIFIABLE LVALUE REQUIRED
led01.C(17) : 2225 (E) UNDECLARED NAME: "j"
led01.C(17) : 2220 (E) MODIFIABLE LVALUE REQUIRED
*** error *** コンパイルエラーがありました。
Pushing any key leads the exit.
失敗例2 リンクエラーがあった時
関数名が見つからない(関数名のミスタイプのことが多い)Compile, link and convert command for H8 C-programing with V2 ver1.00
Copyright(c) 28June2002 coskxH8S,H8/300 SERIES C Compiler Ver. 2.0D Evaluation software
Copyright (C) 1994,1996 Hitachi,Ltd.
Licensed Material of Hitachi,Ltd.
Licensed Material of Hitachi Engineering Co.,Ltd.H SERIES LINKAGE EDITOR Ver. 5.3B Evaluation software
Copyright (C) Hitachi, Ltd.1989,1998
Copyright (C) HITACHI MICROCOMPUTER SYSTEM LTD. 1990,1998
Licensed Material of Hitachi, Ltd.: OUTPUT led01
: PRINT led01
: INPUT led01
: INPUT C:\Progra~1\h8_3664\startup3664Basic.OBJ
: LIB c:\Progra~1\h8_3664\c38HN.LIB
: ROM (D,X)
: START P,C,D(34),X,B(0F780)
: EXIT
** 105 UNDEFINED EXTERNAL SYMBOL(led01._getABS)LINKAGE EDITOR COMPLETED
*** error *** リンクエラーです。
Pushing any key leads the exit.
失敗例3 AKI-H8のフラッシュメモリ書き込み受け入れ態勢が完全でない時
(AKI-H8の電源が入っていない時)
(ライタモードになっていない時)Compile, link and convert command for H8 C-programing with V2 ver1.00
Copyright(c) 28June2002 coskxH8S,H8/300 SERIES C Compiler Ver. 2.0D Evaluation software
Copyright (C) 1994,1996 Hitachi,Ltd.
Licensed Material of Hitachi,Ltd.
Licensed Material of Hitachi Engineering Co.,Ltd.H SERIES LINKAGE EDITOR Ver. 5.3B Evaluation software
Copyright (C) Hitachi, Ltd.1989,1998
Copyright (C) HITACHI MICROCOMPUTER SYSTEM LTD. 1990,1998
Licensed Material of Hitachi, Ltd.: OUTPUT led00
: PRINT led00
: INPUT led00
: INPUT C:\Progra~1\h8_3664\startup3664Basic.OBJ
: LIB c:\Progra~1\h8_3664\c38HN.LIB
: ROM (D,X)
: START P,C,D(34),X,B(0F780)
: EXITLINKAGE EDITOR COMPLETED
H SERIES SYSROF STYPE OBJECT CONVERTER Ver. 1.5B Evaluation software
Copyright (C) Hitachi, Ltd. 1988,1997
Copyright (C) HITACHI MICROCOMPUTER SYSTEM LTD. 1988,1997
Licensed Material of Hitachi, Ltd.
OBJECT CONVERTER COMPLETED
h8w: synchronizing.....
no response from cpu board
Pushing any key leads the exit.
4.4 プログラムの実行
「led00.MOT」がマイコンにフラッシュメモリ書き込みされて,実行します。正常に作業が終えていれば,マザーボード上の2つのLEDが点滅します。
参考1 h8_3664Basic.cmdの内容
H8_3664Basic.cmdの内容を参考リスト1に示します。
参考リスト1 motファイル作成用のコマンドファイル「H8_3664Basic.cmd」
@echo off
echo Compile, link and convert command for H8 C-programing with V2 ver1.00
echo Copyright(c) 28June2002 coskxrem H8Cコンパイラver2のセットに対応しています。
rem Cのソースファイルおよびobjファイルは最大で5個までドラッグ&ドロップに対応
rem 複数ファイルのドロップの場合は次のことに気をつけること
rem 選択されているファイルのうちフォルダ表示で最も上の列(この列に複数のファイルがある場合は左端)
rem にあるファイル名でフラッシュメモリ書き込み形式ファイルの名前が決まる。そのためmain()を持つファイルをその
rem 位置に置くと良い。
rem MOTファイルをドラッグ&ドロップするとすぐフラッシュメモリ書き込みが始まる。rem *************** カスタマイズ領域 begin *******************
rem コンパイル作業に必要なパスの追加を行います。
set mypath=%HOMEDRIVE%\Program Files\h8_3664
rem スタートアップルーチンを記述します。
set startuproutine=%HOMEDRIVE%\Progra~1\h8_3664\startup3664Basic.OBJ
rem H8のライブラリを指定します。
set h8library=%HOMEDRIVE%\Progra~1\h8_3664\c38HN.LIB
rem フラッシュメモリ書き込みに使用するプログラムを指定します。
set downloader=h8write.exe -3664
rem フラッシュメモリ書き込み直前にポーズしてそのままフラッシュメモリ書き込みするかどうか問い合わせします
rem YES:問い合わせる NO:問い合わせない
set downloadready=NO
rem 正常にフラッシュメモリ書き込みが終了した場合はそのまま終了する
rem YES:そのまま終了する NO:そのまま終了せず停止
set downloadquit=YES
rem *************** カスタマイズ領域 end *******************rem ----------------------------------------------------------------------------
rem カレントドライブ・カレントディレクトリへ移動
%~d1
cd %~p1rem コンパイラのパスの設定
path=%path%;%mypath%
set h8inc=%HOMEDRIVE%\Progra~1\h8_3664
set h8lib=%HOMEDRIVE%\Progra~1\h8_3664rem もしMOTファイルがドラッグ&ドロップされたら,フラッシュメモリ書き込みだけ行なう
if %~x1==.mot goto DOWNLOAD
if %~x1==.MOT goto DOWNLOADrem 誤ったファイルがドロップされたか,単なるダブルクリックで起動した場合は何もしない
if exist %~n1.obj goto COMPILE
if not exist %~n1.c goto NO_SOURCE_ERROR:COMPILE
rem ----------------------------------------------------------------------------
rem コンパイル 〜.objの作成 5個のファイル入力に対応
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.obj del %%p.obj
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c ch38 -cpu=300hn -include=%h8inc% -OUTCODE=SJIS %%p
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.obj del %%p.lst
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if not exist %%p.obj goto COMPILE_ERROR
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src asm38 %%p
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src if not exist %%p.obj goto ASSEMBLE_ERROR
:LINK
rem ---------------------------------------=------------------------------------
rem 一時的なサブファイル「q9j2h5c4k6b1.sub」の作成
rem ファイル名「q9j2h5c4k6b1.sub」は他と重複しないための長いでたらめの名前
rem (「>」は新規作成,「>>」は追記)
echo OUTPUT %~n1 >q9j2h5c4k6b1.sub
echo PRINT %~n1 >>q9j2h5c4k6b1.sub
echo INPUT %~n1 %~n2 %~n3 %~n4 %~n5 >>q9j2h5c4k6b1.sub
echo INPUT %startuproutine% >>q9j2h5c4k6b1.sub
echo LIB %h8library% >>q9j2h5c4k6b1.sub
echo ROM (D,X) >>q9j2h5c4k6b1.sub
echo START P,C,D(34),X,B(0F780) >>q9j2h5c4k6b1.sub
echo EXIT >>q9j2h5c4k6b1.subrem (1)一時的なサブファイル「q9j2h5c4k6b1.sub」によるリンク 〜.absの作成
rem (2)一時的なサブファイルの削除
lnk -subcommand=q9j2h5c4k6b1.sub >q9j2h5c4k6b1.txtdel q9j2h5c4k6b1.sub
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.obj del %%p.obj
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src if exist %%p.obj del %%p.obj
type q9j2h5c4k6b1.txt
find "**" q9j2h5c4k6b1.txt >nul
if errorlevel 1 goto CONVERT
del q9j2h5c4k6b1.txt
del %~n1.abs
goto LINK_ERROR:CONVERT
del q9j2h5c4k6b1.txt
rem ----------------------------------------------------------------------------
rem Sフォーマットに変換 〜.motの作成
cnvs %~n1.abs
del %~n1.absrem motファイルの転送
if %downloadready%==NO goto DOWNLOAD
echo Please set AKI-H8 ready and hit any key / push 'Ctrl+C' if you want
pause >nul
:DOWNLOAD
%downloader% %~n1.mot
if %downloadquit%==YES exit
goto TERMINAL:NO_SOURCE_ERROR
echo *** error *** Cのソースファイルが指定されていません。
goto TERMINAL:COMPILE_ERROR
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.obj del %%p.obj
echo *** error *** コンパイルエラーがありました。
goto TERMINAL:ASSEMBLE_ERROR
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.src if exist %%p.obj del %%p.obj
echo *** error *** アセンブルエラーがありました。
goto TERMINAL:LINK_ERROR
echo *** error *** リンクエラーです。
goto TERMINAL:TERMINAL
echo Pushing any key leads the exit.
pause >nul
exit
補足1 フラッシュメモリ書き込み形式ファイル(.MOTファイル)をドラッグ&ドロップすると直ちに転送が始まります
補足2 「〜.c」のみでなく「〜.obj」も同時にドラッグ&ドロップが可能です
補足3 ダウンロードソフトにライセンス取得前の「h8w.exe」を用いる場合はカスタマイズ領域のダウンローダの設定で変更してください
補足4 ファイル「q9j2h5c4k6b1.sub」「q9j2h5c4k6b1.txt」を一時的に自動生成し,使用後消去します
この時生成される「q9j2h5c4k6b1.sub」は次のようになっている
一時的に自動生成される.subファイル例(test.cがh8_3664Basic.cmdにドロップされた時) OUTPUT test
PRINT test
INPUT test
INPUT %HOMEDRIVE%\Progra~1\h8_3664\startup3664Basic.OBJ
LIB %HOMEDRIVE%\Progra~1\h8_3664\c38hn.lib
ROM (D,X)
START P,C,D(34),X,B(0F780)
EXIT
参考2 「c:\Program Files\h8_3664」の内容
秋月で購入したCコンパイラのあるフォルダは「c:\Program Files\h8_3664」であり,内容は次のとおりです。フォルダ名,ファイルの配置が異なる場合は「h8_3664.cmd」中の必要なところを直してください。
秋月から購入時に導入されたファイル
CH38.EXE :Cコンパイラ本体
ASM38.EXE :アセンブラ本体
C38FRNT.EXE :CH38.EXEが使用するコプログラム
C38ASM.EXE :CH38.EXEが使用するコプログラム
C38CGN.EXE :CH38.EXEが使用するコプログラム
C38PEP.EXE :CH38.EXEが使用するコプログラム
C38MID.EXE :CH38.EXEが使用するコプログラム
LNK.EXE :リンカ本体
ASSERT.H :ヘッダーファイル
CTYPE.H :ヘッダーファイル
ERRNO.H :ヘッダーファイル
FLOAT.H :ヘッダーファイル
MATH.H :ヘッダーファイル
STDDEF.H :ヘッダーファイル
INDIRECT.H :ヘッダーファイル
LIMITS.H :ヘッダーファイル
STRING.H :ヘッダーファイル
MACHINE.H :ヘッダーファイル
NO_FLOAT.H :ヘッダーファイル
STDLIB.H :ヘッダーファイル
SETJMP.H :ヘッダーファイル
STDIO.H :ヘッダーファイル
STDARG.H :ヘッダーファイル
3664F.H :ヘッダーファイル
C38HN.LIB :ライブラリ3048Hノーマルモード用
C38HNS.LIB :ライブラリ3048Hノーマルモード用さらに小坂が追加した4つのファイルも加えられています。
CNVS.EXE :モトローラSファイルへのコンバータ トランジスタ技術2002年3月号付録より
H SERIES SYSROF STYPE OBJECT CONVERTER Ver. 1.5B Evaluation software
startup3664Basic.OBJ :スタートアップルーチン 小坂
h8_3664Basic.cmd :コンパイルリンクのスクリプト 小坂
h8write.exe :ファイル転送ソフト みついわゆきお氏
参考3 「startup3664Basic.obj」の利用の利点
初期化されたグローバル変数,および関数内の初期化されたstatic変数はRAM領域で使えるようにします。const修飾子を持つ初期化されたグローバル変数,およびconst修飾子を持つ関数内の初期化されたstatic変数はROM領域に割り当てられるようにします。(「5.変数について補足」参照)
秋月電子通商で販売しているCコンパイラに付属している環境が与えるスタートアップルーチン(resetv.obj)では,このような変数の割り当てができていません。
参考4 「h8_3664.h」の利用の利点
(1)マザーボード上のスイッチ・LEDの制御関数をインクルードファイルで提供します。
(2)プログラムのフラッシュメモリ書き込みに用いた通信回線とWindowsマシンのハイパーターミナルを用いた表示環境を提供し,printf()に似た整数変数出力ルーチン,整数入力ルーチンをインクルードファイルで提供します。
(3)「startup.obj」とで設定されたタイマ割り込みの仕掛けを,タイマ割り込み設定ルーチンでサポートします。