AKI-H8/3048のCクロスコンパイラ環境でのはじめてのプログラミング
CCVer2対応簡単コマンド利用版
Copyright(C)18Jun2003
Copyright(C) 5June2002
coskx
TNCT
1.はじめに
この文書は,Windows2000パソコンにAKI-H8/3048のC言語クロスコンパイル環境での,コンパイル作業のための方法を記述しています。あらかじめ指導者あるいはパソコン管理者が構築したC言語クロスコンパイラ環境で,C言語によるH8プログラミングを学ぼうとする方がプログラミングを行ない,AKI-H8/3048でプログラムが動作するまでを解説します。C言語のプログラミングについては別の文書で学んでください。基本的に「トランジスタ技術2002年3月号付録CDROM」より入手したCCVer2の環境で作業します。
テンプレートフォルダなどのダウンロード
DownLoad |
LCD対応版(NEW)のダウンロード
DownLoad |
本文書で記述してある作業の特徴
Cプログラムソースファイルが出来上がったら,ドラッグアンドドロップを1回行なうだけです。他に何もすることはありません。簡単コマンドを用いるので,作業が効率的です。
前提
(1)「トランジスタ技術2002年3月号付録CDROM」より入手した,アセンブラ,Cコンパイラ関係ファイルおよびインクルードファイル,ライブラリファイルはすべて「C:\Program
Files\h8V2」( 「参考5」参照
)に入っているものとします。
(2)スタートアップルーチン「start3048.OBJ」も適当なフォルダ(
「参考5」参照
)に入っているものとします。
(3)コンパイル用コマンドは「各作業ファイル」に入っているものとします。
(4)転送ソフト「n-h8w.exe」を利用します。
h8w.exeはシェアウェアですが10kバイトまではライセンスキー不要で書き込める転送ソフトです。
h8w.exeは,ライセンス登録作業を行なうと,標準でn-h8w.exeに名前が変わり,10kバイトの制限が外れます。この文書では名前が変わった場合の記述をしておりますが,ライセンス取得前の「h8w.exe」でも作業することが出来ます。その場合はh8_3048.cmd中の次の個所を変更してください。
なお,この書き込みソフトは(本校)情報工学科の前任助教授の前田先生が作成したものです。前田先生には大変お世話になっております。前田先生は別の名前をつけて使うように勧めていますが,作者に敬意をはらいまして,あえて標準のままにしておきした。
変更前 rem フラッシュメモリ書き込みに使用するプログラムを指定します。
set downloader=n-h8w.exe変更後 rem フラッシュメモリ書き込みに使用するプログラムを指定します。
set downloader=h8w.exe
「h8w.exe」の取得はhttp://www.vector.co.jp/soft/win95/prog/se232247.htmlになります。
注意
2.プログラムの作成から実行まで
シングルボードマイコンAKI-H8/3048内で動作するプログラムはパソコン上で開発され、シングルボードマイコンAKI-H8/3048にフラッシュメモリ書き込みされます。パソコンで開発されるソースプログラムはC言語で記述され、クロスコンパイラにより、オブジェクトプログラムに変換され、最後はフラッシュメモリ書き込み形式(XXXX.MOT)になります。
シングルボードマイコンAKI-H8/3048を動作させるまでの大きな流れは以下のようになります。
(1)パソコン上で作業用のフォルダの用意
(2)パソコン上でCソースプログラムの作成
(3) パソコン上でフラッシュメモリ書き込み形式ファイル(実行プログラム)の作成(クロスコンパイル、コード変換)
(4)パソコン上の転送ソフトによる,フラッシュメモリ書き込み形式ファイル(実行プログラム)のAKI-H8/3048への書き込み操作
これら四つの作業によりシングルボードマイコン内で動作させることが出来ます。
3.テンプレートフォルダの実行
(1)図3.1に示すテンプレートフォルダでの実行の様子を確かめてみよう。テンプレートフォルダなどのダウンロードは ここ です。
図3.1 小坂のテンプレートフォルダ
(2)テンプレートフォルダがダウンロードできたら,解凍し,「xxxxxx.c」の内容をエディタで確かめてみてください。
プログラムは,AKI-H8/3048マザーボード上のLEDを点滅させるものです。プログラムの内容には深入りしないことにしましょう。
リスト プログラムソースファイル"xxxxxx.c"
/* マザーボード上のLEDの1秒ごとのON-OFFを行う */
#include <3048f.h>
void msecwait(int msec)
/*msec間なにもしない時間稼ぎ関数*/
{
int i,j;
for (i=0;i<msec;i++) {
for (j=0;j<2646;j++); /*2646は実測によって求めた値*/
}
}
main()
{
/*P5の下位2ビットを出力に設定*/
/* P5のDDRの下位2ビットに1を与えるとこの設定になる*/
/*DDRとはDataDirectionRegister(データ方向設定レジスタ)*/
P5.DDR = 0x3; /*0x3 = 00000011(二進数)*/
while(1) {/*これは無限ループ*/
/*LED0をONにする P5のDRの第0ビットを1にする*/
/*DRとはDataRegister(データレジスタ)*/
P5.DR.BIT.B0=1;
/*LED1をOFFにする P5のDRの第1ビットを0にする*/
P5.DR.BIT.B1=0;
msecwait(1000);/*1000msecの間なにもしない*/
/*LED0をOFFにする P5のDRの第0ビットを0にする*/
P5.DR.BIT.B0=0;
/*LED1をONにする P5のDRの第1ビットを1にする*/
P5.DR.BIT.B1=1;
msecwait(1000);
}
}
(3)この後の作業は次のようになります。
ただし,図3.1のテンプレートフォルダは「デスクトップ」あるいは「マイドキュメント」の中にあるとします。
表3.1 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作から実行までの手順
パソコン側 |
マイコンH8側 | |||
(1) | <1>AKI-H8/3048のマザーボード上の電源スイッチをOFFにします。 <2>AKI-H8/3048のマザーボード上の状態選択スイッチをライト(Write)モードにします。ライトモードとはマイコンH8/3048がパソコンからプログラムコードを受け取り,フラッシュメモリに書き込むモードのことです。 <3>AKI-H8/3048のマザーボード上の電源スイッチをONにします。 | |||
(2) |
ソースファイル(xxxxxx.c)のアイコンを「h8_3048.cmd」のアイコン上にドラッグアンドドロップします。
|
|||
(3) |
<1>転送が終了したら、AKI-H8/3048のマザーボード上の電源スイッチをOFFにします。 |
(4)ここまでの作業が順調に出来ていたら,AKI-H8/3048マザーボード上の2つのLEDが点滅して動作が確認できるはずです。
4.新規プログラムの開発手順
4.1 パソコン上で作業用のフォルダの用意
作業準備は作業用フォルダを適当な場所に作る作業です。
作業用のフォルダを用意します。ここではled00という名前のフォルダを使用することにします。
その中には以下のファイルを用意しておきます。
(1)h8_3048.cmd
(2)h8_3048.h 小坂作成
(3)h8_3048.sub
リンカスクリプト
これ以外に
(4)to_H8.ht
ハイパーターミナル設定ファイル
(RS232C設定が終わっているもの 38400baud, Async, 8bit , NoParity,
stop1)
が入っていると便利です。
これ以降の作業はすべてこのフォルダ内で行われます。
(テンプレートフォルダの複製を作ってフォルダ名をled00としてもよいでしょう)
4.2 プログラムの作成
Windowsマシン上のエディタ上で、C言語で記述されているソースプログラムを作成します。
例えばled00.cを作るという仮定で以下の説明にはいります。リストにあるファイルを作成してください。
このリストをコピー&ペーストするとよいでしょう。
リスト プログラムソースファイル"led00.c"
/* マザーボード上のLEDの1秒ごとのON-OFFを行う */
#include <3048f.h>
void msecwait(int msec)
/*msec間なにもしない時間稼ぎ関数*/
{
int i,j;
for (i=0;i<msec;i++) {
for (j=0;j<2646;j++); /*2646は実測によって求めた値*/
}
}
main()
{
/*P5の下位2ビットを出力に設定*/
/* P5のDDRの下位2ビットに1を与えるとこの設定になる*/
/*DDRとはDataDirectionRegister(データ方向設定レジスタ)*/
P5.DDR = 0x3; /*0x3 = 00000011(二進数)*/
while(1) {/*これは無限ループ*/
/*LED0をONにする P5のDRの第0ビットを1にする*/
/*DRとはDataRegister(データレジスタ)*/
P5.DR.BIT.B0=1;
/*LED1をOFFにする P5のDRの第1ビットを0にする*/
P5.DR.BIT.B1=0;
msecwait(1000);/*1000msecの間なにもしない*/
/*LED0をOFFにする P5のDRの第0ビットを0にする*/
P5.DR.BIT.B0=0;
/*LED1をONにする P5のDRの第1ビットを1にする*/
P5.DR.BIT.B1=1;
msecwait(1000);
}
}
ここまでの作業でフォルダled00の中には
(1)h8_3048.cmd
(2)h8_3048.h
(3)h8_3048.sub
(4)to_H8.ht ハイパーターミナル設定ファイル
(5)led00.c
ができているはずです。
4.3 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作
Cプログラムソースファイル「led00.c」が出来ましたら,次の手順で実行してください。
表4.1 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作から実行までの手順
パソコン側 |
マイコンH8側 | |||
(1) | もしハイパーターミナルなどCOMポートを使用しているソフトがパソコン上で動作している時はそれらのソフトを中止します。 | |||
(2) | <1>AKI-H8/3048のマザーボード上の電源スイッチをOFFにします。 <2>AKI-H8/3048のマザーボード上の状態選択スイッチをライト(Write)モードにします。ライトモードとはマイコンH8/3048がパソコンからプログラムコードを受け取り,フラッシュメモリに書き込むモードのことです。 <3>AKI-H8/3048のマザーボード上の電源スイッチをONにします。 (注意:H8/3048は,電源スイッチONの瞬間に,状態選択スイッチの状態を検査しますので,必ず<1><2><3>の手順が必要です) | |||
(3) |
出来上がったソースファイル(led00.c)のアイコンを「h8_3048.cmd」のアイコン上にドラッグアンドドロップします。
|
|||
(4) | <1>転送が終了したら、AKI-H8/3048のマザーボード上の電源スイッチをOFFにします。 <2>AKI-H8/3048のマザーボード上の状態選択スイッチをラン(Run)モードにします。 | |||
(5) | 必要ならパソコン側で「to_H8.ht」をダブルクリックしてターミナルアプリケーション「ハイパーターミナル」を立ち上げます。 | |||
(6) | AKI-H8/3048のマザーボード上の電源スイッチをONにすると転送したプログラムが作動します。 |
注意(1) ネットワーク上のフォルダを利用する場合はネットワークドライブを割り当ててから実行する。ただし,動作が遅いので勧めません。自分のHD上で作業しましょう。
注意(2) もしマルチソースファイルでのプログラミングの時は必要なソースファイルすべてを同時にドラッグアンドドロップしてください。5個まで対応しています。
このWebページの最後の参考リスト1にh8_3048.cmdのソースを示します。自分の環境に合うように設定を変えても結構です。
ここまでの作業でフォルダled00の中には
(1)h8_3048.cmd
(2)h8_3048.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) 23Jan2004 coskx
Copyright(c) 28Jun2002 coskx
H8S,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 7 2225 (E) UNDECLARED NAME: "i"
led01.C 7 2220 (E) MODIFIABLE LVALUE REQUIRED
led01.C 7 2225 (E) UNDECLARED NAME: "j"
led01.C 7 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) 23Jan2004 coskx
Copyright(c) 28Jun2002 coskx
H8S,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.
H8S,H8/300 SERIES CROSS ASSEMBLER Ver. 2.0A Evaluation software
Copyright (C) Hitachi, Ltd. 1994,1998
Copyright (C) HITACHI MICROCOMPUTER SYSTEM LTD. 1994,1998
Licensed Material of Hitachi, Ltd.
*****TOTAL ERRORS 0
*****TOTAL WARNINGS 0
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.
: ROM (D,X)
: START P,C,D(100),X,B(0FEF10)
: EXIT
** 105 UNDEFINED EXTERNAL SYMBOL(led02._wait)LINKAGE EDITOR COMPLETED
*** error *** リンクエラーです。
Pushing any key leads the exit.
失敗例3 AKI-H8/3048のフラッシュメモリ書き込み受け入れ態勢が完全でない時
(AKI-H8/3048の電源が入っていない時)
(ライタモードになっていない時)
h8w: synchronizing.....
no response from cpu board
Pushing any key leads the exit.
失敗例4 「ハイパーターミナル」などのシリアルポートを
利用しているソフトが動いていてフラッシュメモリ書き込みソフトが
シリアルポート(COMポート)を取得できない時
comm open failed
Pushing any key leads the exit.
4.4 プログラムの実行
「led00.MOT」がマイコンにフラッシュメモリ書き込みされて,実行します。正常に作業が終えていれば,マザーボード上の2つのLEDが点滅します。
参考1 h8_3048.cmdの内容
h8_3048.cmdの内容を参考リスト1に示します。
参考リスト1 motファイル作成用のコマンドファイル「h8_3048.cmd」
@echo off
echo Compile, link and convert command for H8 C-programing with V2 ver1.00
echo Copyright(c) 23Jan2004 coskx
echo Copyright(c) 28Jun2002 coskx TNCT
rem H8Cコンパイラver2のセットに対応しています。
rem Cのソースファイルおよびobjファイルは最大で5個までドラッグ&ドロップに対応
rem 複数ファイルのドロップの場合は次のことに気をつけること
rem 選択されているファイルのうちフォルダ表示で最も上の列(この列に複数のファイルがある場合は左端)
rem にあるファイル名でフラッシュメモリ書き込み形式ファイルの名前が決まる。そのためmain()を持つファイルをその
rem 位置に置くと良い。
rem MOTファイルをドラッグ&ドロップするとすぐフラッシュメモリ書き込みが始まる。
rem *************** カスタマイズ領域 begin *******************
rem コンパイル作業に必要なパスの追加を行います。
set mypath=%HOMEDRIVE%\Program Files\h8v2\bin
rem スタートアップルーチンを記述します。
set startuproutine=%HOMEDRIVE%\Progra~1\h8v2\lib\start3048.obj
rem H8のライブラリを指定します。
set h8library=%HOMEDRIVE%\Progra~1\h8v2\lib\c38ha.lib
rem フラッシュメモリ書き込みに使用するプログラムを指定します。
set downloader=%HOMEDRIVE%\Progra~1\h8v2\WRITER\maeda\n-h8w.exe
rem フラッシュメモリ書き込み直前にポーズしてそのままフラッシュメモリ書き込みするかどうか問い合わせします
rem YES:問い合わせる NO:問い合わせない
set downloadready=NO
rem 正常にフラッシュメモリ書き込みが終了した場合はそのまま終了する
rem YES:そのまま終了する NO:そのまま終了せず停止
set downloadquit=NO
rem *************** カスタマイズ領域 end *******************
rem ----------------------------------------------------------------------------
rem カレントドライブ・カレントディレクトリへ移動
%~d1
cd %~p1
rem コンパイラのパスの設定
path=%path%;%mypath%
set h8inc=%HOMEDRIVE%\Progra~1\h8v2\include
set h8lib=%HOMEDRIVE%\Progra~1\h8v2\lib
rem もしMOTファイルがドラッグ&ドロップされたら,フラッシュメモリ書き込みだけ行なう
if %~x1==.mot goto DOWNLOAD
if %~x1==.MOT goto DOWNLOAD
rem 誤ったファイルがドロップされたか,単なるダブルクリックで起動した場合は何もしない
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=300ha -include=%h8inc% -OUTCODE=SJIS -CODE=ASMCODE %%p
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.src del %%p.lst
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if not exist %%p.src goto COMPILE_ERROR
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c asm38 %%p
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.c if exist %%p.src del %%p.src
:LINK
rem リンク 〜.absの作成
lnk %startuproutine% %~n1 %~n2 %~n3 %~n4 %~n5 -subcommand=h8_3048.sub -LIB=%h8library% -O=%~n1 -P=%~n1 >q9j2h5c4k6b1.txt
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c 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.abs
rem 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
: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.txt」を一時的に自動生成し,使用後消去します
参考2 「c:\Program Files\h8v2」の内容
Cコンパイラのあるフォルダは「c:\Program Files\h8v2」である。
フォルダ名,ファイルの配置が異なる場合は「h8_3048.cmd」中の設定を直してください。
参考3 「start3048.obj」の利用の利点
(1)初期化されたグローバル変数,および関数内の初期化されたstatic変数はRAM領域で使えるようにします。const修飾子を持つ初期化されたグローバル変数,およびconst修飾子を持つ関数内の初期化されたstatic変数はROM領域に割り当てられるようにします。(「5.変数について補足」参照)
参考4 「h8_3048.h」の利用の利点
(1)マザーボード上のスイッチ・LEDの制御関数をインクルードファイルで提供します。
(2)プログラムをフラッシュメモリ書き込みに用いた通信回線とWindowsマシンのハイパーターミナルを用いた表示環境を提供し,printf()に似た整数変数出力ルーチン,整数入力ルーチンをインクルードファイルで提供します。
(3)タイマ割り込み設定ルーチンでサポートします。
参考5 フォルダ「C:\Program Files\h8v2」の構成
<BIN>
CH38 EXE :Cコンパイラ本体
C38CGN EXE :CC38H.EXEが使用するコプログラム
C38ASM EXE :CC38H.EXEが使用するコプログラム
C38FRNT EXE :CC38H.EXEが使用するコプログラム
C38MID EXE :CC38H.EXEが使用するコプログラム
C38PEP EXE :CC38H.EXEが使用するコプログラム
ASM38 EXE :クロスアセンブラ
LNK EXE :リンカー
CNVS EXE :コンバータ
OPT38 EXE :オプティマイザー
OPTLNK38 EXE :リンカー
<Lib>
C38HN LIB :ライブラリ3048Hノーマルモード用
C38HA LIB :ライブラリ3048Hアドバンスモード用 サイズ最適化
C38HAS LIB :ライブラリ3048Hアドバンスモード用 スピード最適化
C38REG LIB :ライブラリ3048Hノーマルモード用
C8S26A LIB :ライブラリ3048Hアドバンスモード用
start3048I.OBJ :タイマ割り込みサービス付スタートアップルーチン
start3048.OBJ :スタートアップルーチン
<Include>
CTYPE H :ヘッダーファイル
ERRNO H :ヘッダーファイル
FLOAT H :ヘッダーファイル
LIMITS H :ヘッダーファイル
MATH H :ヘッダーファイル
MACHINE H :ヘッダーファイル
NO_FLOAT H :ヘッダーファイル
SETJMP H :ヘッダーファイル
STDARG H :ヘッダーファイル
STDDEF H :ヘッダーファイル
STDIO H :ヘッダーファイル
STDLIB H :ヘッダーファイル
ASSERT H :ヘッダーファイル
3048F H :ヘッダーファイル(I/Oアクセス)
<Writer>
ここに使用するフラッシュメモリ書き込み用Writerソフトをおく