4.GCC Developer Lite版への移植


2002/11/14 【ソフトウエア編TOPに戻る】

TekuRobo工作室のソフトウエア編では、H8のC言語開発を秋月電子通商純正(?)のCコンパイラを使って行っています。なので、それに対応したC言語のソースファイルを作り、その解説をさせて頂いています。しかし、多くの場合はベストテクノロジー製GCC Developer Lite版(以下GDL)を使った環境で開発作業を行っている方々が多く、TekuRobo工作室でご紹介しているソースファイルが、そのまんま使えないということが起きています。

実はこのようなお話はTekuRobo工作室を開設した当初から寄せられていましたが、その当時はGDLがベストテクノロジーのホームページからダウンロードできる環境がなく、書籍の付録や有料頒布によってしか入手できなかったこともあり、その互換性に関する検証をずっと棚上げしていたという状況でした。

しかし、最近ベストテクノロジーのホームページから簡単に入手できる環境が整い、力弥自身がようやく重い腰を上げて試し始めたということもあり、このへんで秋月のCコンパイラ環境からGDL環境へのソースファイルの移植方法について簡単に取りまとめて見たいと思います。

多くのパワーユーザーの方々にとっては周知の事実だとは思いますが、これから新たに取り組もうとしている方々にとっては参考になるのではないかと思います。TekuRobo工作室のプログラム例をGDL環境で試してみたい方は、是非ご覧下さい。


4−1.GCC Developer Lite版の利点

 

GDL環境には、秋月純正環境にはない使いやすさが色々あります。勝手にまとめると、大体以下のようなことになるかと思います。

項 目 秋月コンパイラ環境 GDL環境
コーディング テキストエディタを別途そろえる必要がある。 統合環境になっておりエディタ機能も付属している。予約語の色分け機能付き
スタートアップ スタートアップファイルをアセンブラで記述して、割り込みベクタや割り込みで使用する変数のメモリ確保を行う。 割り込みベクタなどはあらかじめ定義済みなので、特にスタートアップファイルについて意識する必要はない。
コンパイル DOS窓上で動作するコンパイラ、リンカ、フォーマット変換の各ツールを自作のBATファイルで自動化。 統合環境でツールバーのボタンをクリックするだけでMOTファイルが作られる。
書き込み 専用のF-ZTATフラッシュ書き込みツールを起動して書き込む。 統合環境でツールバーのボタンをクリックするだけで、書き込みの準備が完了し、すぐ書き込める。
デバッグ 秋月のモニターデバッガが必要。サイズは大きくないので、増設RAMがなくても動作する。ただしユーザープログラムの大きさは制限される。 増設RAMを搭載していれば、付属のRAM書き込みツールの利用でユーザープログラムをRAMに搭載してデバッグできる。
全 体 個別のツールを寄せ集めて、自分で環境を整える必要がある。特に開発に不便はないが、割り込みの時にスタートアップファイルの作成が面倒。 統合環境が整備されており、非常に使い易い。割り込みプログラムもスイスイ書ける。ただし逆に順序立てたマイコンの動作が勉強できない(?)

この他に、GDLでは同じ統合環境でSH2H8Tinyなど、複数のマイコンの開発環境を共有できたり、パソコン上でのエミュレーション機能が付いていたり、何かと便利です。何より無料ですし。

初めてCコンパイラの環境を整備したいとお考えの方は、多分迷わずGDLにしたほうが得策でしょう。

【先頭に戻る】


4−2.GCC Developer Lite版の入手方法

 

GDLベストテクノロジーのホームページからダウンロードできます。

ボケボケ画面ですみません。ベストテクノロジーのホームページに行ったら、先ずダウンロードページに行くために、「1.ここクリック」で示しているボタンを押します。次に、右側の窓をスクロールして行き、「開発ツール」 GCC Developer Lite の項目を表示させます。あとは、「2.ダウンロード」で示している部分をクリックすればダウンロードできます。

2002年11現在の最新版は以下の通りです。

GCC Developer Litr Ver.1.4.7.14 GDLFull1.4.7.14.EXE(51.2Mb)

 

【先頭に戻る】


4−3.秋月コンパイラ環境からGDL環境への移植方法

 

では、秋月コンパイラ環境で作成したC言語のソースファイルを、GDL環境でコンパイルできるソースに変更する方法をご紹介します。ただし、ここにご紹介する方法は、全ての場合に対応できる保証はありません。あらかじめご了承ください。

 

ここでは、ソースプログラムを以下の2パターンに分けてお話しましょう。

 ■1.割り込み処理が無いプログラム

 ■2.割り込み処理が有るプログラム

です。

【先頭に戻る】


■1.割り込み処理が無いプログラム

 

割り込み処理が無いプログラムの場合、秋月コンパイラ用に書かれたソースに記載されているプリプロセッサの#include<3048f.h>を、#include<3048.h>に変更して下さい。

 

#include <3048f.h>  f を削除→ #include<3048.h>

 

これだけで正常にコンパイルができます。また、スタートアップオブジェクトstartup.marは必要ありません。

H8/3048FのレジスタやI/Oのアドレスが定義されているヘッダファイル名が、秋月コンパイラGDLで異なっているため、それに対応させるための変更です。両方のヘッダファイルの中身を細かく比較はしていませんが、どうやら互換性があるみたいです。(ただし、全く一緒かどうかの確認はしていませんので、ご注意ください

この変更だけで、H8の「基礎実験のお話」でご紹介している割り込みの無いプログラムについては、全て動作を確認しています。

以下は101.PIOでLEDを光らせる(3048F.Hを使う)からの参考例です。このプログラムはGDLでコンパイルが可能です。

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

#include <3048.h>        /* 3048f.h から 3048.h に変更する */

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

P5.DDR = 0xff;           /* port5を全て出力に設定     */
P5.PCR.BYTE = 0x00;      /* port5のプルアップ抵抗なし */

     while(1){
          P5.DR.BYTE = 0x01;
          wait();
          P5.DR.BYTE = 0x02; 
          wait();
     } 
}

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

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

【先頭に戻る】


■2.割り込み処理が有るプログラム

 

割り込み処理があるプログラムの場合は、もうちょっとだけ修正が必要です。

 

【2−1.インクルードファイル名の変更】

 

割り込み処理が有るプログラムの場合も、先ずは前項と同様に

#include <3048f.h>  f を削除→ #include<3048.h>

の変更を行います。

 

【2−2.割り込み関数の定義 #pragma interrupt( )の削除】

 

#pragma interrupt(intimia1) → これを削除

など、割り込み発生時に実行される関数名を定義しているプリプロセッサ部分を削除します。なお、割り込み発生要因により、( )の中の関数名は変わります。

 

【2−3.グローバル変数 extern int の型宣言からextern を削除】

 

extern int → extern を削除 → int

main関数と割り込み関数の間で変数を共有する場合、グローバル変数宣言として extern intextern char などの型宣言を行っていますが、extern の記述を削除します。

 

【2−4.割り込み関数名は、決められた名前にする】

 

秋月コンパイラの場合、スタートアップオブジェクト内に自分の好きな割り込み関数名を定義できましたが、GDLでは全ての割り込み関数名があらかじめ定義されているため、決められた関数名にあわせる必要があります。逆に言えば、決まりを守れば面倒なスタートアップオブジェクトの編集がいらないということになります。

例えば、ITU1のGRAコンペアマッチによる割り込みが発生した場合など、TekuRoboでは割り込み関数名を「intimia1」としていますが、GDLでは「int_imia1」に決められています。

各割り込み要因に対応する割り込み関数名については、GDLの取り扱い説明書の最後の方に一覧で記載されているので、参照してみて下さい。

 

【2−5.割り込み許可のおまじないをする】

 

EI;

最後に、main関数内の一番最初に、EI; と書き入れて、割り込み許可のためのおまじないをします。

これは割り込み許可を行うためのマクロだそうです。細かな仕組みについては、勉強不足で説明できませんが...

 

以上の変更を行い、H8の「基礎実験のお話」でご紹介している割り込み処理が有るプログラムについては、全て動作を確認しています。もちろん、スタートアップオブジェクトは必要ありません。

以下は105.タイマー割込みで効率的な制御からの参考例です。このプログラムはGDLでコンパイルが可能です。

/**************************************************/
/* 割込みによるタイマー例       RIKIYA 2000/03/25 */
/*                                     tmtest22.c */
/* H8-3048/F                                      */
/* ポート5のLEDを割込み処理で1秒おきに点滅      */
/* させ、同時にポート2のディップスイッチの状態   */
/* を、ポート1の8bitのLEDに表示させる            */
/* ディップスイッチを切り替えてから、8bitのLED    */
/* に状態が表示されるタイミングに注目             */
/**************************************************/

#include <3048.h>            /* 3048f.h から 3048.h に変更する */

/* #pragma interrupt(intimia1)    この宣言はいらない  */
int cnt;                     /*グローバル変数 extern の記述を削除 */
int mode;                    /*グローバル変数 extern の記述を削除 */


/* メイン関数************************************************/
void main(void){

EI;                          /* 割り込み許可のおまじないを追加 */
     P1.DDR = 0xff;          /* port1出力に設定 表示LED       */
     P2.DDR = 0x00;          /* port2入力に設定 DIPSW         */
     P2.PCR.BYTE = 0xff;     /* port2プルアップon              */
     P5.DDR = 0xff;          /* port5出力に設定 表示LED        */
     P5.PCR.BYTE = 0x00;     /* port5プルアップoff             */

     ITU1.TCR.BYTE = 0x23;   /* GRAコンペアマッチ clock 1/8          */
     ITU1.GRA = 0x4e20;      /* GRAを4e20に設定 約10ms         */
     ITU1.TIER.BYTE = 0xF9;  /* ITU1のGRAによるコンペアマッチ割込みを許可*/
     ITU.TSTR.BIT.STR1 = 0;  /* カウント停止状態                   */
     ITU.TSTR.BIT.STR1 = 1;  /* ITU1 TCNTカウント開始              */

     cnt = 0;                /* 割込み発生の回数を0にセット       */
     mode =1;                /* 2bitLEDの表示のさせ方を1にセット */

     while(1){
          P1.DR.BYTE = P2.DR.BYTE; /* DIPSWを8bitLEDに表示     */
     }
}

/*割り込み処理*********************************************/
void int_imia1(void){     /* 関数名を intimia1 から int_imia1に変更 */

     cnt++;                             /* cntの数を1つ増やす */

     if(cnt == 100){                    /*100(1秒)なら2bitLEDの表示を変化させる*/
          cnt = 0;                      /*カウンタを0に戻す   */
          switch(mode){
               case 1:mode = 0x02;      /*表示が01なら10にする*/
                        break;
               case 2:mode = 0x01;      /*表示が10なら01にする*/
                        break;
               default:mode = 0x01;     /*それ以外なら01にする*/
          }
          P5.DR.BYTE = mode;            /*2bitLEDを変化させる */
     }
     ITU1.TSR.BIT.IMFA = 0;             /* 割込み検知フラグを戻して再開 */
}

【先頭に戻る】


しつこいようですが、以上の約束ごとで全ての場合に対応できるかどうかは、保証できません。しかし、今のところ正常に動作しています。ちょっと心配なのが、まだ使っていないレジスタ名や、プリプロセッサ部分についてです。レジスタ名については、H8のハードウエアマニュアルに記載されてる名称に基づいているため、共通化が図られているようです。

今後開発を進めていくと、もしかしたら完全に互換が取りきれない部分が出るかもしれませんので、覚悟の上でお使い下さい。

この他に移植のための変更点などがありましたら是非お教えください。不勉強ですみません...m(_ _)m 

 

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


【表紙に戻る】