背景
私は組み込みマイコンの開発をMacでやっています。
主にSTマイクロ、NXPで、これらの開発環境にはeclipseが使われています。
eclipseが使われる利点は、MacでもWindowsと同じように開発できることです。
長年、ルネサスのマイコンはWindowsでしか開発ができませんでした。
しかし、やっとeclipseを利用したMac版e2studioがリリースされました!
そこで、RL78の開発をMac版e2studioでやろうと意気込んでいたのですが、周辺機能の設定をGUIでやる機能が提供されていません!
私も年齢的には古い人間なので(笑)、そういう設定はマニュアルを調べて、ソースコードで記述するもんだと言いたいところですが、STマイクロやNXPのGUIによる周辺機能の設定を体験すると、もう戻れません...
方針
Windows版e2studioには、GUIによる周辺機能の設定が提供されています。
ただしCC-RLでの開発に限定されます。
そこで、最初の周辺機能の設定はWindows版e2studioに任せるしかありません。
出力されたソースコードをMac版e2studioに持っていくことを考えます。
そこで、方針としては
- Windows版e2studioでCC-RLのC言語プロジェクトを作る
- 周辺機能の設定をGUIでやる
- 周辺機能設定のソースコードを生成する
- Mac版e2studioでLLVMのC言語プロジェクトを作る
- Windows版e2studioのソースコードをMac版e2studioのプロジェクトにコピーする
- LLVM開発に合わせた修正を行う
- メインアプリケーションのプログラム開発をする
という感じになります。
アセンブラにも少しだけ踏み込んで、起動プロセスなども確認してみます。
Windows版e2studioでプロジェクトを作る
新規Cプロジェクト
Renesas CC-RL C/C++ Executable Project
を選びます。
プロジェクト名を決めて、ターゲットデバイスなどの設定に移ります。
今手掛けている開発のマイコンはRL78/G10で、ターゲット・デバイスはR5F10Y16
です。秋月電子で入手できます。
ちなみに、Hardware Debugの構成を生成のポップアップですが、
WindowsではE1も選択肢に現れますが、MacではE2/E2 Liteしかサポートしてません。
次に進んだら、Use 周辺コード生成
にチェックを入れます。
これをチェックすることで、GUIによる周辺機能の設定ができます。
このように、古いルネサスの開発環境で利用していたGUI設定が使えます。
ここで周辺機能の設定をし、C言語のソースコードを生成します。
コードを生成する
ボタンをクリックすると、cg_srcフォルダの中に周辺機能の設定を記述したソースコードが生成されます。
このソースコードを、Mac版e2studioでうまく利用します。
Mac版e2studioでプロジェクトを作る
LLVM for Renesas RL78 C/C++ Executable Project
を選びます。
Windows版e2studioと同じように、プロジェクト名を決めて、ターゲットデバイスなどの設定に移ります。
先ほど記載した通り、デバッガはE2/E2 Liteしか選択肢がありません。
この後、適宜設定をしてプロジェクトを作成します。
基本的には何も変更せず、次々進んでいけばいいです。
このように、最低限のソースコードが作成されます。
割り込み処理の入り口なども用意されていますね。
CC-RLでの起動の流れ
アセンブラgenerate/cstart.asm
の中を見てみます。
76行でhdwinit
をコールしています。
hdwinit
はsrc/cg_src/r_cg_systeminit.c
の中に記述されています。
さらにその中でR_Systeminit()
がコールされ、その中でクロック、I/Oポート、タイマーの設定がされています。
アセンブラにもどり、メモリの0フィルや初期値代入を経て、199行でmain()
をコールしています。
main()ではまずR_MAIN_UserInit()
がコールされ、この中でユーザーが必要とする初期設定をする感じです。
main()で無限ループへ入るまでをシンプルにしたいという意図でしょうね。
LLVMでの起動の流れ
アセンブラstart.S
の中を見てみます。
153行でHardwareSetup
をコールしています。
HardwareSetup
はgenerate/hwinit.c
の中に記述されています。
中身は空っぽです。
main()は空っぽで、無限ループのみ用意されています。
見た感じでは、CC-RLとLLVMの流れは変わりません。
CC-RLのhdwinit
とR_MAIN_UserInit
内でやっている処理をLLVMのHardwareSetup
でやれば良さそうです。
では、移植作業をやってみましょう。
移植作業
CC-RLのcg_srcフォルダをMac版e2studioにコピーする
中身はC言語なので、互換性は問題ありません。
ヘッダの定義に差があるため、また、CC-RLでのmainループも含まれているため、コンパイルするとエラーが出ます。
ヘッダ定義エラーの解消
r_cg_port.cのエラーを見てみます。
PMC0の定義がないためエラーになっています。
これはヘッダ内の定義の違いによって発生しています。
今回は、CC-RLで生成したハードウェア情報を利用するため、レジスタのアドレスマッピングなどはCC-RLのものに置き換えます。
Windows版e2studioのgenerate/iodefine.h
の中身をクリップボードにコピーします。
Mac版e2studioのIntrinsic Functionの定義は念のため残しておき、それ以降をクリップボードのWindows版e2studiogenerate/iodefine.h
で置き換えます。
定義に関するエラーは消え、残るエラーは1つになりました。
main重複の解消
最後の一つのエラーはmainが二つあるためです。
Windows版e2studioからコピーしてきたcg_src/r_cg_main.c
が原因です。
中を見てみると、ヘッダのインクルードと無限ループ前の初期化の定義があります。
処理としては実質空っぽなので、なくなっても大丈夫です。
cg_src/r_cg_main.c
をMac版e2studioのプロジェクトから削除しましょう。
これでコンパイルは通りました!
Warningの解消
放っておいてもいいかなぁとは思います。
Warningの内容を確認してみます。
uint8_t reset_flag = RESF;
定義したけど使ってないということですね。
リセット要因を調べる処理ですが、必要ないなら削除すればいいと思います。
将来使うかもしれないから、取っておきたい気もします。
対処はその日の気分で(笑)
#pragma interrupt r_tau0_channel0_interrupt(vect=INTTM00)
static void __near r_tau0_channel0_interrupt(void)
CC-RLでの#pragma定義、実際の割り込み処理の定義がLLVMでは使えないということです。
割り込み処理ベクタ番号の情報なども付記されているので、このまま残しておきましょう。
最後に、重複定義になっているr_cg_macrodriver.h
の一部をコメントアウトします。
//#define DI __DI
//#define EI __EI
//#define HALT __halt
//#define NOP __nop
//#define STOP __stop
LLVMでの定義を利用するので、CC-RLの定義はコメントアウト、または削除します。
ハードウェアのセットアップ
generate/hwinit.c
にハードウェアの設定を記述します。
ハードウェアの設定はCC-RLで生成されたxxx_Create()
を利用します。
そのために必要なヘッダファイルをインクルードします。
/************************************************************************/
/* File Version: V1.00 */
/* Date Generated: 10/09/2013 */
/************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
extern void HardwareSetup(void);
#ifdef __cplusplus
}
#endif
#include "iodefine.h"
#include "r_cg_macrodriver.h"
#include "r_cg_cgc.h"
#include "r_cg_port.h"
#include "r_cg_tau.h"
#include "r_cg_intp.h"
#include "r_cg_userdefine.h"
アセンブラからコールされるHardwareSetup
の中身を書きます。
必要なハードウェアのCreate()
関数をCC-RLのr_cg_systeminit.c
から探して記述します。
void HardwareSetup(void)
{
DI();
PIOR = 0x05U;
R_CGC_Get_ResetSource();
R_PORT_Create();
R_CGC_Create();
R_TAU0_Create();
R_INTC_Create();
}
オプション・バイト
RL78マイコンは、起動時に
- ウォッチドッグタイマの設定
- 電圧検出設定
- リセット端子の設定
- 高速オンチップ・オシレータの周波数設定
- オンチップ・デバッグのオプション
をROMから読み出します。
CC-RLではハードウェアのGUIで設定すると、オプションバイトの値が生成されます。
そして、ROMの書き込みファイルにオプションバイトが配置されます。
LLVMの場合は、generate/vects.cの中にオプションバイトを記述します。
すでに初期値が用意されていますので、適宜書き換えます。
Option_Bytes[]
がoption_bytes
セクションに配置されます。
const unsigned char Option_Bytes[] __attribute__ ((section (".option_bytes"))) = {
0xef, 0xff, 0xe8, 0x85
};
割り込み処理
generate/inthandler.c
に割り込み処理の関数が用意されています。
中身は空っぽです。
関数の名前は割り込み処理の内容がわかるように付けられています。
また、ベクタアドレスがコメントで書かれているので、iodefine.h
の記述と見比べて探すこともできます。
main
ヘッダを適切にインクルードし、CC-RLのR_MAIN_UserInit()
でやっていた処理を無限ループの前に記載すればいいでしょう。
R_MAIN_UserInit()と同じような関数を作って、無限ループの前にコールする方法でもいいでしょう。
通常はEI()
だけが記載されています。
個人的には、なんちゃってオブジェクト指向の自作フレームワークを組み込んでいるので、その初期化とかをここでやってます。
/***********************************************************************************************************************
* Function Name: R_MAIN_UserInit
* Description : This function adds user code before implementing main function.
* Arguments : None
* Return Value : None
***********************************************************************************************************************/
static void R_MAIN_UserInit(void)
{
/* Start user code. Do not edit comment generated here */
EI();
/* End user code. Do not edit comment generated here */
}
さぁ、これでアプリケーションは動作します!
コンパイルして、デバッグしてみます。
ちゃんと動きますね。
ブレークポイント、変数表示、レジスタ編集もWindows版と同じようにできます。
最後に
MacでもRL78の開発ができるようになりました。
これは私にとっては超効率アップです。
ただ、周辺機能の設定を楽にやりたい場合、現状はWondows版e2studio、あるいはCS+の併用は避けられません。
しかし、周辺機能の設定が最初にがっちり決まっていれば、これ以降はMacだけで開発できます。
今回の移植方法では、Windows版e2studio、CS+のCソースコードの修正は行わないので、途中で周辺機能を変更しても、ソースコードを入れ替えるだけでOKです。
Macで組み込み開発をされている方々の助けになれば幸いです。
参考情報
Mac版e2studioでRL78マイコンの開発をする際、統合開発環境のインストールについては、下記サイトが役に立ちます。
e² studio クイックスタートガイド - macOS環境にe² studioとLLVM for RL78ツールチェーンをインストールする方法
上記だけではダメで、実はE2 / E2 Liteを使うためにはPythonのインストールが必要です。
リリースノートの7ページ目に注意書きがありました。
e² studio 2025-01 Release Documentation
Note:
The GDB included in the e² studio installation for debugging has a requirement on Python 3.10.
This will need to be installed on your machine for the debugging to work correctly.
If not installed the debugger will not launch.
Python 3.10 macOS版をダウンロード、インストールしなくてはいけません。
こちらからダウンロードできます。