R8C 用コンパイラの構築 gcc-4.9.3

Windows の開発環境で、MSYS2 がメインになってから、
長い間、最新の gcc で m32c(R8C)のコンパイラの構築に失敗していた。
コンパイラの構築には時間がかかる為、オプションの影響などもあまり正確に認識していな
かった。
休みに入ったので、コンパイラと格闘してみた結果、
gcc-5.2.0 で、m32c 用 gcc の構築に成功したので、「要点」を書いておこうと思う。
gcc-5.2.0 の構築は出来たものの、バイナリーを作成してデバイスに書き込んでも、正常に動作しなかったので、
とりあえず、動作が確認されているバージョン(gcc-4.8.3、gcc-4.9.3)を使う。

※「gcc-4.7.4」は現状では、MSYS2 のカレントのコンパイラが 4.9 系では、正常にコンパイル
できない~
いつもながら、クロス gcc の構築には、苦労する・・・

Windows、OS-X で試したので、多分再現性は高いと思う。

Windows では、MSYS2 環境で行い、OS-X では、macport で行う。
基本的に、MSYS2 環境の方が、多少ハードルが高いけど、MSYS2 は、ツールのインストール
が pacman で出来るので、以前より簡単となっている。

まず、MSYS2をインストールする。
※詳しいインストールの方法は、ネットで探すと沢山出てくるので、参考にされたい。
※MSYS2には、3つの実行環境があり、今回は、「msys2_shell.bat」環境で行う。
・まず、システムをアップデート

% update-core

完了したら、ターミナルをクローズして、再度ターミナルを開き、残りを更新。

% pacman -Su

次に、ビルドに必要なツール類をインストールする。(MSYS2)

% pacman -S gcc
% pacman -S texinfo
% pacman -S mpc-devel
% pacman -S diffutils
% pacman -S automake

※他にもあるかもしれないので、適宜インストールする。
※もし、何かツールが無くてコンパイルに失敗したら、ビルドディレクトリーを消して、
「configure」からやり直すのが「確実」だと思う。

・ソースコードのアーカイブを取っておく、今回は以下の組み合わせで行った。
※「gcc-4.8.3」を使う場合は、「4.9.3」を「4.8.3」に読み替えて行う。

    binutils-2.25.1.tar.gz
    gcc-4.9.3.tar.gz
    newlib-2.2.0.tar.gz

・binutils-2.25.1 の構築

% cd
% tar xfvz binutils-2.25.1.tar.gz
% cd binutils-2.25.1
% mkdir m32c_build
% cd m32c_build
% ../configure --target=m32c-elf --prefix=/usr/local/m32c-elf --disable-nls
% make
% make install

・「/usr/local/m32c-elf/bin」へPATHを通して、シェルを起動しなおす。

・C コンパイラの構築
※少し古い gcc のソースコードでは、MSYS2 環境を認識する定義が無い為、「automake-1.15」の
設定をコピーする。(その時の最新をコピーすれば良いと思われる、今回は 1.15 を使った)

% cd
% tar xfvz gcc-4.9.3.tar.gz
% cd gcc-4.9.3
% cp /usr/share/automake-1.15/config.guess .
% mkdir m32c_build
% cd m32c_build
% ../configure --prefix=/usr/local/m32c-elf --target=m32c-elf --enable-languages=c --disable-libssp --with-newlib --disable-nls --disable-threads --disable-libgomp --disable-libmudflap --disable-libstdcxx-pch --disable-multilib --disable-bootstrap
% make
% make install

・newlib-2.2.0 の構築

% cd
% tar xfvz newlib-2.2.0.tar.gz
% cd newlib-2.2.0
% mkdir m32c_build
% cd m32c_build
% ../configure --target=m32c-elf --prefix=/usr/local/m32c-elf
% make
% make install

・C++ コンパイラの構築

% cd
% cd gcc-4.9.3
% cd m32c_build
% ../configure --prefix=/usr/local/m32c-elf --target=m32c-elf --enable-languages=c,c++ --disable-libssp --with-newlib --disable-nls --disable-threads --disable-libgomp --disable-libmudflap --disable-libstdcxx-pch --disable-multilib --disable-bootstrap
% make
% make install

エラー無く終了すれば、完了!

r8cprog の構築も MSYS2 で出来るので、これでやっと R8C の開発環境が全て MSYS2 で完結する~

一応、I2C_RTC_test をビルドして、M120 に書き込んでテストしてみた。
※問題なく動作しているようである。

※「configure」で、「m32c」を「rx」に変更すれば、RX マイコン用 gcc が構築出来る。
※ rx マイコン用 gcc の構築では、4.9.3 を使う。(4.8.3 は C コンパイラの構築中エラーで止まる)

参考リンク:
最低限のクロスコンパイラの作り方
MSYS2における正しいパッケージの更新方法

「R8C 用コンパイラの構築 gcc-4.9.3」への14件のフィードバック

  1. ありがとうございました。初心者未満です。ここの情報がなければ夢さえ見れなかった事になります。avr の一番安いのが Attiny13a 50円。でも 1k で可能な世界 それがわかりかねました。アセンブラコードはもっとわかりかねました。もう何がなんだかわからないのですが最終的にはコンパイル成功しました。いやまだ持ってはいないです。R8C/12A R8C/M11A どちらも同じく 100円。うーん決めかねる。手前環境では newlib でつまづきました。自動的に次の手順となる gcc c++ も。
    newlib 以外は ftp://ftp.gnu.org/gnu/ から得れるようです。

    Linux raspberrypi 3.12.24+ typeB ふるいやつ

    gmp-6.1.0
    mpc-1.0.3
    mpfr-3.1.4
    binutils-2.24
    newlib-2.2.0

    ここまでの ../configure すべて newlib と同じ

    gcc-4.7.4

    ../configure すべて同じ

    同じというのはこのページの説明通りということ。binutils をコンパイルした時にゴッソリ作られるが m32c-elf-cc は存在しない。成功後の今も存在していない。実は必要じゃないものが混じるのかも知れないが、もうわかりません。実際には sudo make install としなくてもいい場所を指定しました。それもややこしさの元凶部分だったのかも知れません。env PATH=/???/m32c-elf/bin:$PATH 何度も何度もやる羽目に。

    R8C-master

    サンプル集の方 git から頂きました。同じくその手のサンプル存在がなければ確実に不可能だと思います。ありがとうございました。ああ日本語だ、、、たすかった。ありがとうございます。

    R8C-master/FIRST_sample/Makefile

    grep -n c++14 Makefile

    手前環境では その c++14 を c++11 にしたらコンパイル出来ました。それと手前環境ではパスが通っていないので、 m32c-elf-g++ などの記述箇所をすべてフルパスに書き換えました。さて、秋葉原行こうかなあ。このページのおかげです。このサイトの、ですね。 ちょっと以上にうれしかったので、作者様が遠く通り過ぎた後である過去と知りつつも、コメント欄を汚してしまいました。やっぱり 14 ピンがいいかなあ、、でもなあ。雨が降りそうだなあ。ありがとうございました。

    1. お役にたてれば幸いです!

      最近、R8C 関係はメンテナンスされていない為、多少古い情報が混ざって、混乱する
      かもしれません。(サンプルがコンパイルエラーでコンパイルできないなどは連絡を
      下さい)
      開発環境や、解決できない問題があれば、ネットで情報を調べますが、それでも解決
      できない場合は、質問をくれれば、解決するかもしれません。

      Happy Hacking !

      1. 久しぶりに秋葉原に来たのですが古くからあった道の角の電気屋さんが神社になっていました。神社? あらてのジョークなのでしょうか。おかげさまで 20 pin の方をこれから手にする運びとなりました。このまま悩んでいたらお店がしまってしまう。ひたすら探したセブンイレブン無料Wifi より、あはは。

  2. しつこくすいません。これで最後です。最初の書き込みへ訂正します。binutils は newlib と同一の configure 指定ではありませんでした。 –disable=nls が混じります。いえ、ページに書いてある通りです。また、申し訳ありませんでした。git ページの方に詳しいコンパイル方法がありました。そっちに書いてありますね。mpc mpfr などすべて。そっちも見ていたはずなのに、、。ええ、ごめんなさい。これからが楽しみです。あれもこれもコンパイルが通るサンプル集なので少しづつ学習する事が出来そうです。何年越しだったろう、マイコンな世界への確かな足掛かりを得るまで。生産終了品ですがこのサイト周辺に資料がばっちり作られた後だから逆に安心のように思えます。おかげさまでやっと曖昧に終止符となりました。書き込むだろうデータが実際どれくらいのサイズになるのか。avr 最安 50円 Attiny13a にしなくてよかった。1K ではわたくしだと可能ではない。動けばいいさと無駄に無断過ぎるコードを平気で書きたいです。真面目に書いてもそうなりますが。通り過ぎたはずの過去ページへの返答に感謝します。

    1. R8Cは16ビットマイコンなので、実質的な領域は64Kしかありません。
      ※バンク切り替え的に他の領域を使える。

      フラッシュは、64K使えますが、通常のコードはその半分の32Kを使え
      ます。
      もう32Kを使うには、

      __attribute__ ((section (".exttext")))

      を使います。
      ※いくつかのサンプルが参考になります。

      あと、コンパイルのオプティマイズでは、「-Os」を使います。
      このオプションは、サイズを優先して、それでも、速度が出るようにコン
      パイルするものです。

  3. ごめんなさい。せっかくのお返事を見逃していました。ひたすら探しに探し情報をかき集めてきました。何だかんだあったのですが、どうやら手前環境でサンプルコードのコンパイルが通るのは、 唯一 ここのだけ のようです。良かったあ、、全部入りみたいなサンプル集で。最後の難関となってしまったのは予想外に 書き込み でした。r8cprog 、、、clang libboost1.6 結局勝てませんでした。raspberry pi で古い環境だからかも知れません。 それ r8cprog がないと書き込めないらしいとなってしまいました。 linux 環境には m16c-flash というものがあります。先にそれを知っていたので書き込みについては問題ないと考えていました。サンプルコードの方がコンパイル出来れば問題ない。ところがそれ、m16c-flash 使えないようです。r8c と言っても色々とあるようで。書き込みについてはひとまず諦め、サンプル集で先にお勉強としていこう。ゆっくりと 少しづつ。ルネサスはいいですね。感激しました。説明が全部ある。みてもチンプンカンプンだけど PDF の情報量がすさまじい。昨日シリアル通信の PDF 発見しました。なんだこれあれば作れるじゃん。昨日はそう思いました。今日ですか? いや僕にはやっぱり無理だから、人んちのパソコンで書き込みすればいいじゃないか、になりました。くどいようですが、サンプル集ほんとにありがたいです。いえ実は C++ わかんないな、、だったんですが、もう唯一コンパイル出来るサンプル集なので、すがりつきます。冷静に考えると別に C++ を熟知している必要はない。だって全部入りのサンプル集だから。実のところ FIRST-sample があれば、しばらくはそれだけで事足りる はず。次のステップで憧れの AD 変換、当面はもうそれで いいのかも知れない。ステッピングモーターを自在に云々したかったんです。パソコンではなく独立駆動出来るマイコンで。オーディオアンプ基板で回していたのですが、その方法に限界を思いました。楽チンな方法で ときめいていたのですが、ほんとにこれでいいのだろうか、、疑念や疑問符が多かったです。音で回すのはステキ。でも自在じゃない。そうだよなあマイコンなら、、で 思いだしたんです。このサイトのあのページ。64k 100円 。ルネサスにして良かったと思います。値段が第一だったけど、資料がすばらしい。あと、ここのコードサンプル集。20pinの IC 、粗悪品のブレッドボードとなると設置が極めて困難。10分後に諦めて 丸ピン IC ソケットを持ち出しました。 あっ、それです。その情報が欲しかったんです。疑問符が消えました。あれっ、データ領域とプログラム領域? まさか、、プログラムの領域は結局 2K ? 違うということで。

    1. RaspberryPi でも r8cprog の構築は可能と思います。

      clang をインストールするのが大変なら、gcc でもコンパイル可能です。

      CP = clang++
      CC = clang
      LK = clang++

      CP = g++
      CC = gcc
      LK = g++

      と書き直して下さい。

      boost は
      https://dl.bintray.com/boostorg/release/1.64.0/source/boost_1_64_0.zip
      から、ダウンロードして展開して下さい。
      ↑のバージョンは「1.64.0」ですが問題無いです。

      構築の方法は、一応GitHubに書かれています。

      r8c の書き込みプログラムは、「R8C/M120AN」に対応している事と、
      最低でも32K書き込めるようなプロファイルが必要なので、自分が
      提供している書き込みプログラム構築に是非挑戦してみて下さい。

  4. ありがとうございます。gcc g++ を最初に試し clang を入れてダメで最後にその版のboostを得て来て負けましたという経緯となります。-std=gnu++14 というのがこちらでも関係していると思い、まっさきに ++11 としました。そうすると惜しい状態になるのです。ただ、エラーを見つめると include map の中の構造体メンバー? とにかくメンバーがない、となっておりコードを見ると、、、恥ずかしながらそこが限界でした。 typedef の行が解釈出来ません。memory_map_ となる前の実体が何かも。std とあるのでやはりライブラリの中なのでしょうか。今回の件で多いに学べまして、c++14 のような指定に対応しているのは gcc 5.1? 以降だと知りました。環境は gcc 4.6 か 4.7 か 4.8 です。そこで gcc 5.4 のソースを得て来ました。その頃合いには力尽きていたので make として眠って目覚めたら error 、、それで敗北を知りました。でも収穫はとても大きいです。今まで make でダメでさようならが基本でしたが、Makefile をのぞくようになりました。わかってはいないのですが適当に数値を変えれば成功する場合があると知れました。再びチャレンジする事になるでしょうが、ひとまず FIRST_sample の世界に目を向ける事にしました。そっちの方をマスターしないと。わずらわしい思いをさせて申し訳ありません。ひとつだけ質問をさせてください。 .mot は既に知っているのでしょうか。自分が何処の番地に書き込まれるのかを。それとも書き込みプログラムである r8cprog が書き込む時点で巧妙に飛び飛び番地に振り分けるのでしょうか。

    1. なるほど、gcc-4.x 系 なのですね・・
      自分の環境(Ubuntu-16.04)は5.4.0です。
      「++11」でもコンパイルは可能です(自分の環境ではエラー無くコンパイル
      できました。)

      http://developer.wonderpla.net/entry/blog/engineer/CPlusPlus_RaspberryPi/
      ↑のリンクの感じだと、違うバージョンのgccが共存していて、
      優先順位を付ける必要があるようです。

      gcc --version

      とすると、バージョンが出ます。

      —–
      「mot」ファイルは、モトローラーSフォーマット形式で、テキストファイルです。
      ※詳しくは、ぐぐってみて下さい。
      中は、リンカーが割り付けた、アドレスとデータの羅列で、先頭8000からと、
      ベクターなどが格納されるFFD8などで、基本飛んでいます。
      アドレスとデータが対応しているので、mot ファイルを理解できる(普通はできる)
      書き込みソフトなら、正しく書き込めると思います。

      ただ、通常、書き込みソフトは、デバイスの品種によって決まるプロファイルを
      持っていて、それに従って、書き込みが出来ない領域には書き込みません。
      多くの場合、プロファイルはテキストファイルなので、編集が可能です。
      他のソフトで書き込む場合、R8C/M120ANのプロファイルを編集する必要
      があると思います。

      r8c_prog.conf では、以下のようになっています。

      R5F2M120 {
      	group = "R8C/M12A"
      	rom = 64k
      	data = 2k
      	ram = 1280
      	comment = "; R5F2M12A"
      	rom-area =	8000,8FFF,
      		9000,9FFF,
      		A000,AFFF,
      		B000,BFFF,
      		C000,CFFF,
      		D000,DFFF,
      		E000,EFFF,
      		F000,FFFF,
      		10000,10FFF,
      		11000,11FFF,
      		12000,12FFF,
      		13000,13FFF,
      		14000,14FFF,
      		15000,15FFF,
      		16000,16FFF,
      		17000,17FFF
      
      	data-area = 3000,33FF,
      	     3400,37FF
      }
      1. それは運が良かったです。得てある gcc のソースコードが 5.4 なんです。環境は 4.6.3 でした。apt-get で得られる限界が 4.8 でした。ならば gcc 5.4 のコンパイルが通ればいい事になる。ビンゴ過ぎる情報ありがとうございました。なるほど .mot なんですね。でもやっぱり書き込みソフト、自分で作れる気がしない。必要な資料は手にしている事になるけれど、、あはは。r8cprog で書き込める日を思うと楽しみです。初めてのマイコンですから。ほんと運が良かった。サンプル集の方はコンパイルが通る。仮にそこでコケていたら いつものように諦めるがだけでした。では、よい夏を。

        1. あ、すいません。教えていただいたリンク先の情報を後で見てしまいました。先にそれを試してダメなら gcc 5.4 のコンパイルとしてみようと思います。お礼状で済ませたかったのですが、結局とんだご迷惑をおかけしてしまったようで。

          1. おかげさまで r8cprog のコンパイル通りました。もちろん g++ gcc の方で。clang の方ではなく。 POST = -O2 -std=gnu++11 です。勝った! 完璧にひとさまのおかげだけど。助かりました。実は途方に暮れていました。

          2. ↓ g++ 4.8.2 。apt-get で得られるやつ。教えていただいたリンク先の優先順位をというのは必須。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください