3.C言語コンパイル手順


2001/02/21 【ソフトウエア編TOPに戻る】

C言語を使って作ったプログラムをAKI-H8/3048F CPUボードに書き込み、動作させるまでの手順を簡単にご紹介します。開発環境は、1.AKI-H8ソフトウエアの開発環境のページを参照して下さい。

ここでは以下の内容についてご紹介しています。

3−1.スタートアップオブジェクトを作る

3−2.メモ帳(notepad.exe)でC言語プログラムを書く

3−3.書いたプログラムを保存する

3−4.保存したプログラムをコンパイルする

3−5.AKI-H8/3048に書き込む

3−6.AKI-H8/3048Fボードを動かしてみる

なお、ここでは、2.AKI-H8アセンブル手順でご紹介している作業が必要となりますので、そちらを参考にしながら読み進めて下さい。

少し面倒な内容になるかもしれませんが、ここさえ突破してしまえば、後は自由にプログラムを作り、マイコンを動かすことが出来るようになります。少し我慢してお付き合いください。


3−1.スタートアップオブジェクトを作る

何のこと?という感じですが、割込みベクタテーブル、メモリ上のプロブラムの開始位置、スタックポインタなどを設定するもので、アセンブラ言語で作ります。これを、これから作るC言語のプログラムとリンクさせて、実行プログラムが出来上がります。ここでは、おまじない程度に考えておいて下さい。本当はC言語だけで、この辺も含めたプログラムが作れるらしいのですが、良く分からないのでこの方法を採用しています。

先ず、メモ帳で以下のプログラムを書きます。ここをクリックしてダウンロードしてもらってもかまいません。なお、プログラム中で各行の以降はコメント文なので、とりあえず書かなくてもOKです。

 

;STARTUP ROUTINE H8/300H
;PROGRAM NAME STARTUP.MAR
      .cpu 300ha:20            ;H8/300H advanced 1Mbyte MODE
      .import _main            ;外部関数mainを定義
;
      .section vect,data,locate=h'00000   ;セクション宣言
;
;割り込みベクタテーブル
      .data.l init             ;reset時のジャンプ先の指定
;
      .org h'00100             ;メモリ00100番地に移動
init: mov.l #h'fff10,er7       ;スタックポインタの設定
      ldc #0,ccr               ;CLEAR INTERRUPT MASK,NOT USE UI BIT
      jmp @_main               ;C言語のmain関数へのジャンプ
;
      .end

このプログラムをSTARTUP.MARという名称で保存します。そして、ASMフォルダにコピーしてA38H STARTUPを実行し、STARTUP.OBJファイルを作成しておきます。

このスタートアップオブジェクトは、割込み処理を行なったり、グローバル変数を使ったりしない、基本的なプログラムを作る間は、共通に使用できるファイルです。

【先頭に戻る】


3−2.メモ帳(notepad.exe)でC言語プログラムを書く

いよいよC言語でプログラムを書きます。これもメモ帳を使って、以下のプログラムを書いてみます。これも、ここをクリックしてダウンロードしてもらってもかまいません。なお、プログラム中で/**/で挟まれた部分はコメントなので、とりあえず書かなくてもOKです。

 

/* C TEST PROGRAM BY RIKIYA 2001.02.18 */
/* for AKI-H8/3048F CPU BOARD          */
/* PROGRAM NAME LEDTEST1.C             */
/***************************************/

/*メインプログラム************************/
main(){

char *p5ddr = (char *)0xFFFC8; /* port5 ddr */
char *p5dr  = (char *)0xFFFCA; /* port5 dr  */
char *p5pcr = (char *)0xFFFDB; /* port5 pcr */

*p5ddr = 0xff;  /* port5を全て出力に設定     */
*p5pcr = 0x00;  /* port5のプルアップ抵抗なし */

     while(1){
          *p5dr = 0x01;
          wait();
          *p5dr = 0x02;
          wait();
     } 
}

/*時間稼ぎ関数*************************/
wait(){
int i;

     for (i=0;i<0xffff;i++){
          /*なにもしない*/
     }
return;
}

このプログラムは、2.AKI-H8アセンブル手順で試しに作ったアセンブル言語のプログラムと、全く同じ動きをします。あとで、両方を比べてみてください。プログラムの内容については、別のページで説明することにします。

【先頭に戻る】


3−3.書いたプログラムを保存する

ソースプログラムは、拡張子を.Cで保存します。

ところで、TekuRobo工作室では以下のようなディレクトリ構造(フォルダ)の開発環境にしています。これからの説明は、この環境を前提としていますので、皆さんの環境に合わせて読み替えて下さい。この例では、あらかじめdata,h8c,c_sourceという各フォルダを、以下のような関係で作っておく必要があります。(フォルダ名やファイル名には、全角文字や8文字を超える名前は避けた方が良いようです。予期せぬエラーが出ることがあります。)

 

E: ┐

    DATA┐

      H8C┐ ←このフォルダに、CD-ROMの内容をまるまるコピー

                 C_SOURCE┐ ←このフォルダに作ったC言語プログラムを保存

                                     LEDTEST1┐ ←プログラム名と同じフォルダを作る

                                                   LEDTEST1.C ←作ったプログラムソース

 

つまり、E:\DATA\H8C\C_SOURCEというフォルダの中に、プログラム名称と同じフォルダを作っておき、そこにメモ帳で書いたC言語のプログラムを保存しておきます。

 

Cコンパイラ関連のプログラムや、ライブラリファイルなどは、E:\DATA\H8Cのフォルダに入れておきます。

今回は、ledtest1というプログラム名で保存したいので、c_sourceフォルダの中に、ledtest1というフォルダを作っておきます。

メモ帳のファイル(F)→名前を付けて保存(A)を実行し、今作ったledtest1というフォルダの中に、ledtest1.cというファイル名称で保存します。通常はあらかじめ*.txtと記入されているので、拡張子を.Cとする保存ファイル名を入力します。ここでは、ledtest1.cと入力して保存ボタンを押します。

【先頭に戻る】


3−4.保存したプログラムをコンパイルする

コンパイルとは、メモ帳で書いたC言語によるプログラムを、CPUが理解できるオブジェクトファイルに変換することを言います。更にここでは、先ほど作っておいたスタートアップオブジェクトとリンクさせ、また、ROMに書き込める形式に変換することまでを含めて「コンパイル」と呼ぶことにしておきます。

 

-1.準備

AKI-H8マイコンCコンパイラのCD-ROMの内容を、先ほど作ったE:\DATA\H8Cというフォルダに丸ごとコピーします。あと、アセンブラで使用したリンカL38H.EXEと、フォーマットコンバータC38H.EXEも、合わせてコピーしておきます。このH8Cというフォルダが、コンパイルの作業場所となります。

また、3-1.項で作ったSTARTUP.OBJファイルも、このE:\DATA\H8Cフォルダにコピーしておきます。

次に、以下のファイルをメモ帳で書き、GO.BATのファイル名称でH8Cフォルダに保存します。ここをクリックしてダウンロードしてもらってもかまいません。

 

e:
cd e:\data\h8c\
del err.txt
cc38h.exe -cpu=300ha -include=e:\data\h8c e:\data\h8c\c_source\%1\%1.c >err.txt
type err.txt
l38h startup,%1 -output=%1 -library=e:\data\h8c\c38hab -start=P(200) >%1.lst
c38h %1 >>%1.lst
copy %1.* e:\data\h8c\c_source\%1
del %1.*

このGO.BATファイルはバッチファイルと呼ばれ、書き込んだMS-DOSのコマンドを自動的に処理してくれるものです。

ここでは、cc38h でC言語のソースファイルをコンパイルし、l38hstartup.objファイルとリンクさせ、c38h でROMに書き込めるフォーマットに変換するまでを、一気に処理しています。

最後に、コンパイル作業で作られたファイル類一式を、プログラム名称と同じフォルダにコピーした後、H8Cフォルダ内に残った不要なファイル類を削除します。

DOSプロンプト窓から GO LEDTEST1 などと、GOの後にソースファイル名を入力してenterキーを押すと実行されますが、%1と書かれている部分は、このソースファイル名として認識される部分です。

 

-2.DOSプロンプト窓を開く

DOSプロンプト窓を開き、H8Cフォルダに移動させておきます。

そして、下図のように、go の後に続き、コンパイルしたいファイル名称を入力してENTERキーを押します。

DOS窓画面1

すると、以下のような処理が一気に行なわれます。

DOS窓画面2

これは、go.batファイルに記載した処理を、順に実行した結果となります。

ここで、もしプログラムに誤りがあった場合は、type err.txt のコマンドの後にエラーメッセージが表示されます。その場合は、エラーメッセージに従って修正してから、再度コンパイルを実行します。type err.txtの後にエラーメッセージが無く、最後に「4個のファイルをコピーしました。」まで無事終了すれば、コンパイル作業は成功です。

■参考までに、以下にプログラムにエラーがあって、コンパイルに失敗した時の例をご紹介します。

DOS画面3

type err.txtの後に、エラーがあるソールファイル名(ledtest1.c)と、エラーがある行番号(29)と、エラー情報が記載されています。

エラーのため、正常に.obj、.abs、.motの各ファイルが作成されなかったため、「1個のファイルをコピーしました。」になっています。

ちなみに、なにがエラーかというと、時間稼ぎ関数の以下の部分で、i=0i<0xffffの間をセミコロンにしなければならないところを、コロンにしてしまったために起こったエラーでした。

    for (i=0i<0xffff;i++){ ←コロンをセミコロンに直せばOK
          /*なにもしない*/
     }

エラーメッセージ中にエラー個所の行番号が表示されるため、デバッグ作業の大きな手がかりとなります。しかし、メモ帳(notepad.exe)には行番号が表示されないため、ちょっと使いずらいのです。MIFESなどのテキストエディタでは、行番号が表示されます。

【先頭に戻る】


3−5.AKI-H8/3048に書き込む

これは、2.AKI-H8アセンブル手順の2−4.AKI-H8/3048に書き込むの説明を参照して下さい。ここでは、プログラム名と同じフォルダに保存されたMOTファイルを指定して、書き込みを行ないます。

【先頭に戻る】


3−6.AKI-H8/3048Fボードを動かしてみる

これも、2.AKI-H8アセンブル手順の2−5.AKI-H8/3048Fボードを動かしてみるの説明の注意点を守り、動かしてみて下さい。全く同じ動作を行なうはずです。ちゃんと動きますか?

【先頭に戻る】


いろいろと面倒な手順を踏んできましたが、一度環境を整えてしまえば後は簡単にソフトウエア開発を行なうことができます。このページを読んでて途中でイヤになった方もいるかもしれませんが、もう一度思い直して、実際にやってみて下さい。思ったよりも簡単に出来るはずです。

 

【ソフトウエア編TOPに戻る】


更新 2001/06/27  追記「H8Cフォルダに、L38H.EXEとC38H.EXEをコピーする」


【表紙に戻る】