LinuxでのH8用Cコンパイラについて

はじめまして。ausiteと申します。
H8マイコンのC言語プログラムについて質問させていただきます。

ヴイストン社のビュートローバーH8というキットを利用した、H8/36064のC言語開発環境をLinux(Ubuntu16.04LTS)に構築しようとしています。

gcc-h8300-hmsをインストールして、コンパイラの動作確認として、ヴイストンHPで配布されている「モータ駆動」サンプル
www.vstone.co.jp/.../download.html
をコンパイルしようとしたところ、syntax errorが出てしまいました。
まずはsyntax error時の鉄則として全角スペースやカッコの過不足等を探しましたが見つからず。

syntax errorということはコードの書き方に問題があるように思います。
restprg.cはリセットベクタ処理のプログラムのように思えるのですが、コンパイル時に何かオプション等が必要なのでしょうか。

なお、WindowsでHEWを使って同じサンプルのビルドを試みたところ、エラーは出ませんでした。

メーカーに問い合わせたところ、Linuxはサポート外とのことでした。
どなたかご教授願えませんでしょうか?

//実行コマンド
$ h8300-hms-gcc -mn -mh -nostdlib -I./include main.c resetprg.c vs-wrc003lv.c

//出力
main.c: In function `main':
main.c:24: warning: return type of 'main' is not `int'
resetprg.c:7: error: syntax error before '=' token
resetprg.c: In function `__entry':
resetprg.c:11: error: syntax error before "__entry"
vs-wrc003lv.c: In function `getPAD':
vs-wrc003lv.c:586: warning: comparison is always true due to limited range of data type

//resetprg.c
#include <machine.h>
#include <_h_c_lib.h>
#include "vs-wrc003lv.h"
#include "stacksct.h"

extern void main(void);
__entry(vect=0) void PowerON_Reset(void); /*7行目*/

#pragma section ResetPRG

__entry(vect=0) void PowerON_Reset(void) /*11行目*/
{
set_imask_ccr((UBYTE)1);
_INITSCT();


set_imask_ccr((UBYTE)0);

main();

sleep();
while(1);
}

  • わわいです
    ルネサスの純正CコンパイラとGCCでは一部pragmaなどのオプションの記述が違います
    > main.c:24: warning: return type of 'main' is not `int'
    main関数の戻り値がintでない、という警告です
    これは、
    int main(void)
    { ... }
    と定義してやればいいです

    その他のエラーは、
    __entry(vect=0)
    という記述がGCCでは認められていないがためのエラーです
    また、
    #pragma section ResetPRG
    という記述も、GCCでは無視されます(ワーニングが出る)

    ということで、それぞれGCCではどう書くか、というのを調べる必要がありますね
  • わわい様

    丁寧なご回答ありがとうございます。
    やはりコンパイラが違えば記述法も違うのですね。
    GCCマニュアルを読んで調べてみようと思います。
  • 先ずこれから何かを動かそうという段階であれば素直にWindows上でHEWを使われることをお勧めします。相談内容からマイコンでの組み込みにお詳しい方ではないように思われますが、異なるコンパイラ間の移植はそれなりの知識と労力を要する作業であり、ビルドが通ったとしても安全に動くとも限らず問題の切り分けも簡単なものではありません。
  • fujita nozomu様

    ご回答・ご指摘ありがとうございます。
    お察しの通り、組み込みは経験が浅く、難航しています。
    既に運用されているLinuxサーバにコンパイル機能を追加することが目的ですので、最終的にそちらに移行できるよう、まずHEWを使って学ぶことにします。
  • わわいです
    GCCでスタートアップコードをCだけで組もうと思ったらなかなか難易度が高いです
    #スタックポインタを設定できるような関数を用意しないといけない

    Windows上で、e2studioを走らせれば、プロジェクトの新規作成時にそこらへんのスタートアップコードを含むサンプルコードを自動生成してくれるので、それを流用してはどうでしょう
  • わわい様

    ご回答ありがとうございます。
    e2studioをインストールしようとしたのですが、H8には対応していないようです。
    GCC Toolchainsがあるもの(RL78等)なら良いのでしょうか?
  • わわいです
    ああ、そうでした。H8はHEWしかサポートしてませんね
    んじゃこのテはダメですね
    KPITにもH8のものはないし、これはなかなかハードル高いですね。
  • ausiteさん、こんにちは。NoMaYと申します。わわいさんも、こんにちは。

    fujitaさんの、コンパイラ間の移植を余り安易に考えない方がよい、というアドバイスに私も同意しているので、リプライしようか迷っていたのですが、HEWはgcc-renesas.comで配布されているGNUH8コンパイラが扱えますので、学習手段としては、e2 studioよりはHEWの方が良いと思います。

  • わわいです
    ああ、KPITの旧製品のなかにあるんですな<H8

    https://gcc-renesas.com/ja/

    このツールチェインを入れてHEWで新規プロジェクトの作成したら、スタートアップコードも含め、iodefine.hも生成されますね
    main関数に至るイニシャルや割り込みベクタの定義周りも一緒に生成されますんで、これだけでもGCCで使う上で参考になると思います
  • NoMaY様 わわい様

    お返事ありがとうございます。
    ツールチェインを入れてHEWで新規プロジェクトを作成したところ、スタートアップコードがアセンブラで生成されました。
    こちらを参考にしてみます。