0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RL78マイコンの開発をMac版e2studioでやってみる!

Last updated at Posted at 2025-03-31

背景

私は組み込みマイコンの開発を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プロジェクト

スクリーンショット 2025-03-28 9.12.40.png
Renesas CC-RL C/C++ Executable Projectを選びます。
プロジェクト名を決めて、ターゲットデバイスなどの設定に移ります。

今手掛けている開発のマイコンはRL78/G10で、ターゲット・デバイスはR5F10Y16です。秋月電子で入手できます。
ちなみに、Hardware Debugの構成を生成のポップアップですが、
WindowsではE1も選択肢に現れますが、MacではE2/E2 Liteしかサポートしてません。

スクリーンショット 2025-03-28 9.22.56.png

次に進んだら、Use 周辺コード生成にチェックを入れます。
これをチェックすることで、GUIによる周辺機能の設定ができます。
スクリーンショット 2025-03-28 9.26.51.png

このように、古いルネサスの開発環境で利用していたGUI設定が使えます。
ここで周辺機能の設定をし、C言語のソースコードを生成します。

スクリーンショット 2025-03-28 9.30.48.png

コードを生成するボタンをクリックすると、cg_srcフォルダの中に周辺機能の設定を記述したソースコードが生成されます。
このソースコードを、Mac版e2studioでうまく利用します。

スクリーンショット 2025-03-28 9.37.57.png

Mac版e2studioでプロジェクトを作る

スクリーンショット 2025-03-28 9.44.50.png

LLVM for Renesas RL78 C/C++ Executable Projectを選びます。
Windows版e2studioと同じように、プロジェクト名を決めて、ターゲットデバイスなどの設定に移ります。
先ほど記載した通り、デバッガはE2/E2 Liteしか選択肢がありません。

スクリーンショット 2025-03-28 9.48.08.png

この後、適宜設定をしてプロジェクトを作成します。
基本的には何も変更せず、次々進んでいけばいいです。

このように、最低限のソースコードが作成されます。
割り込み処理の入り口なども用意されていますね。

スクリーンショット 2025-03-28 9.50.48.png

CC-RLでの起動の流れ

アセンブラgenerate/cstart.asmの中を見てみます。
76行でhdwinitをコールしています。

スクリーンショット 2025-03-28 10.00.42.png

hdwinitsrc/cg_src/r_cg_systeminit.cの中に記述されています。
さらにその中でR_Systeminit()がコールされ、その中でクロック、I/Oポート、タイマーの設定がされています。

スクリーンショット 2025-03-28 10.04.31.png

アセンブラにもどり、メモリの0フィルや初期値代入を経て、199行でmain()をコールしています。

スクリーンショット 2025-03-28 10.08.56.png

main()ではまずR_MAIN_UserInit()がコールされ、この中でユーザーが必要とする初期設定をする感じです。
main()で無限ループへ入るまでをシンプルにしたいという意図でしょうね。

スクリーンショット 2025-03-28 10.20.07.png

LLVMでの起動の流れ

アセンブラstart.Sの中を見てみます。
153行でHardwareSetupをコールしています。

スクリーンショット 2025-03-28 10.15.04.png

HardwareSetupgenerate/hwinit.cの中に記述されています。
中身は空っぽです。
スクリーンショット 2025-03-28 10.16.07.png

そして、main()は161行でコールされています。
スクリーンショット 2025-03-28 10.17.47.png

main()は空っぽで、無限ループのみ用意されています。

スクリーンショット 2025-03-28 10.24.53.png

見た感じでは、CC-RLとLLVMの流れは変わりません。
CC-RLのhdwinitR_MAIN_UserInit内でやっている処理をLLVMのHardwareSetupでやれば良さそうです。

では、移植作業をやってみましょう。

移植作業

CC-RLのcg_srcフォルダをMac版e2studioにコピーする

image.png

中身はC言語なので、互換性は問題ありません。
ヘッダの定義に差があるため、また、CC-RLでのmainループも含まれているため、コンパイルするとエラーが出ます。

スクリーンショット 2025-03-28 10.44.51.png

ヘッダ定義エラーの解消

r_cg_port.cのエラーを見てみます。

スクリーンショット 2025-03-28 10.46.51.png

PMC0の定義がないためエラーになっています。
これはヘッダ内の定義の違いによって発生しています。
今回は、CC-RLで生成したハードウェア情報を利用するため、レジスタのアドレスマッピングなどはCC-RLのものに置き換えます。

image.png

Windows版e2studioのgenerate/iodefine.hの中身をクリップボードにコピーします。
Mac版e2studioのIntrinsic Functionの定義は念のため残しておき、それ以降をクリップボードのWindows版e2studiogenerate/iodefine.hで置き換えます。

定義に関するエラーは消え、残るエラーは1つになりました。

スクリーンショット 2025-03-28 10.57.42.png

main重複の解消

最後の一つのエラーはmainが二つあるためです。
Windows版e2studioからコピーしてきたcg_src/r_cg_main.cが原因です。

スクリーンショット 2025-03-28 11.01.04.png

中を見てみると、ヘッダのインクルードと無限ループ前の初期化の定義があります。
処理としては実質空っぽなので、なくなっても大丈夫です。
cg_src/r_cg_main.cをMac版e2studioのプロジェクトから削除しましょう。

スクリーンショット 2025-03-28 11.03.26.png

これでコンパイルは通りました!

Warningの解消

放っておいてもいいかなぁとは思います。
Warningの内容を確認してみます。

スクリーンショット 2025-03-28 11.05.33.png

cg_src/r_cg_cgc_user.c
uint8_t reset_flag = RESF;

定義したけど使ってないということですね。
リセット要因を調べる処理ですが、必要ないなら削除すればいいと思います。
将来使うかもしれないから、取っておきたい気もします。
対処はその日の気分で(笑)

スクリーンショット 2025-03-28 11.05.17.png

cg_src/r_cg_tau_user.c
#pragma interrupt r_tau0_channel0_interrupt(vect=INTTM00)
static void __near r_tau0_channel0_interrupt(void)

CC-RLでの#pragma定義、実際の割り込み処理の定義がLLVMでは使えないということです。
割り込み処理ベクタ番号の情報なども付記されているので、このまま残しておきましょう。

最後に、重複定義になっているr_cg_macrodriver.hの一部をコメントアウトします。

cg_src/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()を利用します。
そのために必要なヘッダファイルをインクルードします。

generate/hwinit.c(1)
/************************************************************************/
/*    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から探して記述します。

generate/hwinit.c(2)
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セクションに配置されます。

generate/vects.c
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()だけが記載されています。
個人的には、なんちゃってオブジェクト指向の自作フレームワークを組み込んでいるので、その初期化とかをここでやってます。

r_cg_main.c
/***********************************************************************************************************************
* 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 */
}

さぁ、これでアプリケーションは動作します!

コンパイルして、デバッグしてみます。

スクリーンショット 2025-03-31 10.19.42.png

ちゃんと動きますね。
ブレークポイント、変数表示、レジスタ編集も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版をダウンロード、インストールしなくてはいけません。
こちらからダウンロードできます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?