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

  Cコンパイラの移植


平成26年4月10日

はじめに

 業務での使用を前提にする以上、市販製品が購入できるなら購入することを強く薦めています。特に組み込みに対応したCコンパイラが入手できるなら、あえて移植する手間をかけるのは極めて非効率です。しかし、組み込み向けを謳ったフリーのコンパイラには二の足を踏んでしまいます。フリーのコンパイラはどうしてもバグのリスクや性能面で見劣りします。この辺りはCPUメーカーがCコンパイラを用意するようになった最近のCPUとは事情が異なります。

 Z80やi8086のような汎用CPUをコアにしたマイコン用のCコンパイラでは多くが特定のOS向けに初期設定されており組み込みに使用するためには部分的な移植作業が必要です。この作業は当時はそれなりに難易度が高く、自力で出来る人は限られていたと記憶しています。C言語はミニコンから生まれた言語です。CPUの規模からいえば格下のマイコン技術者が高額なミニコンに触れる機会を与えられるとすれば、それはある程度の企業規模の組織か先見性のあった大学の先生との出会いが前提になります。その当時、マイコンにC言語を移植するのは決して楽ではなかった。今ならCコンパイラが前提にしているアセンブラやリンカの構成に関する前提情報を得ることはそれほど大変ではないのですが、当時はその情報を得ることすら大変だったと思います。それらの断片的な情報を頼りにコンパイラの移植に成功するだけの成果を挙げた人は無条件に賞賛に値します。

 先のモニタプログラムの移植にはGAIO社製のCコンパイラを使用しました。Cコンパイラとしては比較的癖の少ない良いコンパイラだと思います。これさえあれば良いという考えもありです。ただ、この辺りが年食っている世代の疑い深さで、もう一つ他の選択肢を持ちたいのです。まあ、無ければしようが無いですが。で、調べてみました。

 調べてみるとここからCP/M向けに多くのCコンパイラが入手できます。大半が30年程前のものですので現在のC言語仕様には合わないでしょうが、小規模な組み込み装置向けなら十分実用になります。むしろ余計な機能が無い分コンパクトなオブジェクトを出力してくれる可能性があります。なお、CP/MはDOS環境でエミュレーション可能で、今でも十分に実用可能です。
 これらの中から一つだけを選んで実際に組み込み向けに移植してみます。やってみて仕様からくる制限によって実用に耐えないなら最後まで移植しないで、その時点で中断します。当然ターゲットCPUはZ80(8080含む)です。

  コンパイラの選択
 多数のコンパイラが並んでいますが、基本的には今のC言語仕様に近いものを優先します。候補として考えたのはHiTech C 3.09 とSmall C/Plus with floats and structs/unions の二つです。他のコンパイラはかなり古く実数や構造体の使用に制限があるようです。最終的にはHiTech C 3.09を選びました。理由はHiTech社のCコンパイラは当時から高い評価を受けていたこと、Small C/PlusはZ80の未定義命令を使った実装をしていると書かれているため、避けることにしました。大抵は動くと思いますが、思わぬ所で転ぶ要因になりかねない。

  初期評価
 実際にHiTech C 3.09をダウンロードして簡単なコンパイルを通してみました。やはり今時のCコンパイラとは相違点が見られます。重要な相違点はvolatileおよびconstキーワードが使えない点でしょう。構造体は使えます。多分C89仕様以前のコンパイラです。ROM化に関しては付属のマニュアルを見る限りできるようですが、このマニュアルは本体のCコンパイラよりもずっと後の製品向けに書かれたものらしく、どこまで信用していいかは疑問です。

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