RX220の開発環境をMac(Linux)で整える

マイクロマウス界隈で急激に人気を伸ばしているRXマイコンについてです。NTF東日本支部でぼちぼち話題になっているようなので取り上げようかと。
これはルネサス社が手がける、RXアーキテクチャを利用した32bitマイコンで、各種機能が充実しているものになります。

RX といえばメジャーなもので RX631 がありますが、WMMC で「RX220ワンチャン」という声が上がったので、今回の記事ではこれを取り上げます。この間までサークルの皆がコードジェネレーターでプログラムを書いて評価する中、僕はシコシコとレジスタを弄って設定をしていきました。

このマイコンの特徴を挙げるとすると、多分こんな感じだと思います。結構高橋さんのサイトを参考にさせていただきました。

メリット:

  • 位相計数(エンコーダ)モード付き
  • かつてマイクロマウスで流行っていた SH7125 よりもクロック周波数は劣るが、アーキテクチャの改良により処理はより高速に
  • 高速な A/D 変換
  • DMA により高速処理
  • 豊富な8bitタイマ、MTU
  • 多くのシリアルインターフェイスに対応
    • USART, I2C, SPI
  • コンパレータが2ch内蔵
  • (当然ながら)日本語資料あり
  • GCC からでもプログラムをビルド可能。

デメリット(IDE含め):

  • ピンやペリフェラル設定が複雑で分かりづらい
    • コードジェネレーターが出る始末。
  • CS+というIDEのタグジャンプ機能が貧弱で使いづらい。
    • 一方 Eclipse ベースの e2studio は結構いい感じ。
    • RX用Cコンパイラ「CCRX」のエラーを吐く基準がよくわからない。パース時にOKでもリンク時に怒られる、ということもあった。
  • IDE が Windows のみしか対応していない。

まずマイコンを選ぶ時に考えるべきはデメリットなのですが、まぁアレですね。Windows 限定の IDE で機能がやや貧弱な所が痛いですね。クロックはどうせどっかのマイコンボードを買えば解決するでしょう。例えばこれ↓とか。

電子部品,通販,販売,半導体,IC,マイコン,電子工作RX220マイコンボード秋月電子通商 電子部品の通販・販売

以下はこのボード(マイコンの型番はR5F52206)を用いることにします。

意地でもIDEはMacで!!!!!!!!!!

これまで僕は Windows 上でコーディングしてきたのですが、やっぱり Mac で開発したいですよね。Linux で開発したいですよね。したいですよね。

というわけで、色々と試行錯誤しながらも(半年くらい)、なんとか Mac 上で コンパイルから書き込みまで出来るようにしたのでとりあえずご紹介しますね。Linux の方は玄人だと思うので、察してやっていただければと思います。
とは言っても実際の所完全ではありません。環境構築のために Windows が必要となってしまうのですが、そこはご了承を。んで、不完全なところをあげると…

  • printf 系の関数で浮動小数点型の出力ができない。無理やりやろうとするとプログラムがフリーズする。
  • ライブラリ(.aファイル)の構築が(ライセンス的に & 気分的に)若干グレー。
  • GUI ツールがない(個人的にどうでもいいので特にデメリットにはならない)
  • 書き込みツールは他の方のプログラムの改変。よくわからないけどまあ書き込めてるしいいっか状態。
  • コードサイズが膨らむ。誰かこの辺詳しい人教えて。多分 .d ファイル関係が解決の糸口だと思うのですが…

ということですね。最後のコードサイズは、RX220にはROMがた〜〜〜〜〜っぷりあるので関係ないですよね。各種ペリフェラルを試した mot ファイルのサイズを見てみましたが、大体 9kB。まあそれ程でもないや。

$ rx-elf-size RX220_GCC.mot
   text    data     bss     dec     hex filename
      0    9280       0    9280    2440 RX220_GCC.mot

gcc とかバイナリとか詳しい人、このサイズ問題・%f使えない問題について是非教えてください。

作り方

gcc 周辺環境のビルドをします。コンパイラをコンパイルする、ということで(個人的にこのフレーズ大好きなのですが)結構電力と時間を食います。すべて終わるのに-j4したとしても大体30分〜1時間を見ておいたほうが良いと思いますね。
基本的にはこのリポジトリにあるとおりにしてもらえば良いです。バージョンは説明通りに合わせて導入しましょう。0.01でも違うと正常にビルドできない場合があります。

また、注意点として、gccのビルドが終わったらパスを通しておいてください。具体的には

$ PATH=/usr/local/rx-elf/bin:$PATH

としておけばいいと思います。更に、単に make しているのでは遅いので、make -j4 とすることをおすすめします。これは4つの処理を並列に行うという意味で、コア数(スレッド数?)によっては高速化が期待できます。この数字は必要以上に大きくしても処理が詰まるだけですので、ご自身の環境に合わせて設定してください。
make -j とすればフルバーストモードということで、エクストリーム並列処理をするのですが、僕がそれやったら PC がフリーズしたのでメチャクチャお勧めしません。

標準ライブラリをWindowsから拝借・プロジェクトの作成

ここで妥協です。Windowsを使います。お持ちのOSに e2studio をインストールして、GCC-RX-ELF を入れます。そこで使用するライブラリすべてにチェック。そしてからビルドします。
これによって HardwareDebug フォルダに libなんとか.a というファイルが出てきますが、これを拝借します。

Makefile を書き換えて…といきたいのですが、説明がしにくいので完成済みのプロジェクトテンプレートを配布します。RX220_Project
一応使い方ですが、src ディレクトリに c ファイル等を入れればビルド対象になります。HardwareDebug ディレクトリで make すればビルドが行われ、mot ファイルが作成されます。make flash で後述するツールを用いて UART 書き込みがされます。make clean でビルドによりできたファイルがクリーンされます。

書き込みツールの準備

作り方で示したリポジトリ内にある、rx_prog と言うものを使います。しかしこれはデフォルトで RX200 に対応していないので、無理矢理感がありますが使えるように改造をしていきます。cd rxprog として、このディレクトリ内で操作します。以下、僕のPC内にある実験ノートのコピペなので若干口調が違いますがご了承を。

==== コピペ開始 ===

RX220 用のプロトコル規定ファイルを作成

まずは通信コマンドが同一の RX63T のファイルをコピー。

$ cp rx63t_protocol.hpp rx220_protocol.hpp

続いてこの RX220 用のファイルで、わかりやすいように「RX63T」とある部分(ファイル先頭付近3箇所)を全て「RX220」とする。クラス名を変えることも忘れないように。

シェル芸はこちら。

$ sed -i 's/63[tT]/220/g' rx220_protocol.hpp

447行目付近の sum_ に関する条件分岐をコメントアウトする。元のソースコードではエラーとなるが、これを握り潰すことで書き込みができるようになる。

            // if(sum_(tmp, total - 1) != tmp[total - 1]) {
            //  std::cout << "Fuck " << std::endl; // error
            //  return false;
            // }

rx_prog.hpp に記述を追加

先程作成し編集した RX220 用のプロトコルファイルをインクルードする。以下を追加する。

#include "rx220_protocol.hpp"

30行目、using ステートメントを以下のように変更する。

        using protocol_type = boost::variant<rx63t::protocol, rx24t::protocol, rx64m::protocol, rx220::protocol>;

また、143行目付近の start 関数内の条件分岐を以下のようにする。

            if(rx.cpu_type_ == "RX63T") {
                protocol_ = rx63t::protocol();
            } else if(rx.cpu_type_ == "RX24T") {
                protocol_ = rx24t::protocol();
            } else if(rx.cpu_type_ == "RX64M") {
                protocol_ = rx64m::protocol();
            } else if(rx.cpu_type_ == "RX220") { // この2行を追加
                protocol_ = rx220::protocol();
            } else {
                std::cerr << "CPU type missmatch: '" << rx.cpu_type_ << "'" << std::endl;
                return false;
            }

main.cpp の追記

420行目付近、"RX63T" の条件分岐が終わった直後に以下を追加。

        if(rx.cpu_type_ == "RX220") {
            rx.master_ = 3200;  // 32.00MHz
            rx.sys_div_ = 1;    // x1 (32MHz)
            rx.ext_div_ = 1;    // x1 (32MHz)
        }

rx_prog.conf の追記

実際の動作には関係ないが、このファイルの末尾に以下を追加しておくと良いかもしれない。メリットは --device-list オプションで RX220 の顔が見られて少しにやけられるくらいか。

R5F52206 {
    group = "RX220"
    rom = 256K
    ram = 16K
    data = 8K
    comment = "; RX220 Flash:256K DataFlash:8K RAM:16K"
    rom-area  = FFC00000,00FFFFFF
    data-area = 00100000,00101FFF
    ram-area  = 00000000,00003FFF
}

書き込み

書き込み時の結線および RX220 の概要は福井大からくり工房による RX220のススメ – からくり工房I.Sys wiki を参考にすると良い。

以下の変更を施した後はこのコマンドで書き込める。

$ ~/RX/rxprog/rx_prog -d RX220 -s 19200 --port=/dev/tty.usbserial-AI0454E0 -w path_to_mot_file --verbose

-d ではデバイス名を指定、-s は通信ボーレート、-w は書き込みコマンドである。不要な表示を出したくないという場合は --verbose を消してしまえば良い。

==== コピペ終了 ===

以上のようにファイルを弄ったら、あとは make をすればいいです。そして出来た rx_prog はパスの通った場所にコピーしてください。これでひとまず準備完了ですね。

実際書き込みは上の配布プロジェクトで単に make flash すればいいだけなのでそこら辺簡単です。なお Makefile 中にある tty.usbserial-* の部分は接続されている環境に合わせて変えてください。確認方法は FT232RL をPCに繋いで

$ ls /dev/tty.usb*

とでもすれば出て来ると思います。

コートジェネレーター(PDG)の対応について

既にPDGで作られたプロジェクトをどうするか?についてですが、検証をしていないため今のところ動作未確認とします。おそらくですがソースファイルの場所を Makefile 中の OBJS に追加、及び INCLUDES に PDG 用のヘッダファイルのパスを追加すれば良いんじゃないでしょうか。確認が取れ次第、また今度記事にしたいと思いますよ。

はぁ、そろそろマウスに手を付けなきゃなぁ(遅)