Applilet EZ PL for RL78 改善要望

Applilet EZ PL for RL78 V1.0J, V2.00J を試してみました。

デジタル回路版電子ブロックという感じで興味深いツールと思いましたが、少々使いづらい点もあったので改善要望として挙げておきます。

> 本ツールは評価版です。本ツールに関するテクニカルサポートは受け付けておりません。

と明記されていることは理解しており、返答等を求めているものではありません。

  • > 使用されないスタック領域が無駄に定義されており、メモリの無駄遣いとなってしまっています。
    > アセンブルの際にもコンパイルドライバを使用するよう変更されゝばこの問題は解消するのではないでしょうか。

    makeprj.bat の cstart.asm をアセンブルしている箇所

    "asrl.exe" @cstart.pst >> "test2.err" 2>&1
    

    "ccrl.exe" -subcommand=cstart.pst >> "test2.err" 2>&1
    

    に変更し、アセンブル時のレスポンスファイル cstart.pst の内容

    -cpu=S1
    -obj_path=".\obj\"
    -dev="C:\Program Files (x86)\Renesas Electronics\Applilet EZ PL for RL78 V2.00\Tools\BIN\..\..\Tools\DEV\DR5F10Y17.DVF"
    -include="C:\Program Files (x86)\Renesas Electronics\CS+\CC\CC-RL\V1.04.00\inc",".\include"
    src\cstart.asm
    

    -cpu=S1
    -obj_path=".\obj\"
    -dev="C:\Program Files (x86)\Renesas Electronics\Applilet EZ PL for RL78 V2.00\Tools\BIN\..\..\Tools\DEV\DR5F10Y17.DVF"
    -c
    -I "C:\Program Files (x86)\Renesas Electronics\CS+\CC\CC-RL\V1.04.00\inc",".\include"
    src\cstart.asm
    

    に修正して makeprj.bat を実行し、ビルド時に生成される .map の各セクションの使用量を確認したところ、修正前は

    RAMDATA SECTION:  00000084 Byte(s)
    ROMDATA SECTION:  000000d8 Byte(s)
    PROGRAM SECTION:  00000950 Byte(s)
    

    だったものが

    RAMDATA SECTION:  00000044 Byte(s)
    ROMDATA SECTION:  000000d8 Byte(s)
    PROGRAM SECTION:  00000950 Byte(s)
    

    となりました。 無駄に定義されていたスタック領域がなくなり RAM の使用量が 64バイト減ることが確認できました。

  • > ・書き込み方法がお手軽でない
    >
    > 現状の Applilet EZ PL for RL78 はマイコンへの書き込み装置として E1 が必須となっているようですが、

    あれ? V2.00 の「設定(S)」→「フラッシ・メモリ・プログラマ(M)」で表示されるダイアログで COMポートの設定ができるな?

    Applilet EZ PL for RL78 の頁を見て E1 必須と理解したのだけど、内容が適切でないということかしら?

    # ↑のダイアログでキャンセルが「CANCEL」なのは直すべきだよなあ。

  • ・生成時にエラーと併せて警告が出力される

    生成時にマイコンの容量不足等の原因でエラーとなった場合、

    コンパイルを開始します。
    ---------- Pass1 ----------
    ---------- Pass2 ----------
    
    src\74hc.c(284):W0520177:変数 "ucEnable" は宣言されましたが参照されていません。
    
    src\clk.c(117):W0520186:符号なし整数と 0 の比較は無意味です。
    src\clk.c(107):W0520177:変数 "nowclk" は宣言されましたが参照されていません。
    
    src\flipflop.c(369):W0520550:変数 "Last" は設定されていますが利用されていません 。
    src\flipflop.c(549):W0520550:変数 "Last" は設定されていますが利用されていません 。
    src\flipflop.c(651):W0520550:変数 "Last" は設定されていますが利用されていません 。
    
    src\stop.c(81):W0520177:変数 "ucMK1L" は宣言されましたが参照されていません。
    
    W0561120:Section address is not assigned to ".text"
    W0561120:Section address is not assigned to ".stack_bss"
    F0563100:Section address overflow out of range : ".text"
    
    The evaluation period has expired.
    Renesas Optimizing Linker Abort
    2017-05-09 22:12:19	C:\Users\fujita\My Documents\Applilet EZ PL for RL78\Project\hogera\makeprj.bat
    2017-05-09 22:12:19	1105:Build processing error.
    
    コンパイルを中断しました。
    

    使用するモジュールによってはエラーとは関係ない警告が複数出力されるようです。

    警告の原因はテンプレートして使用しているソースコードの書き方によるものであり、動作に問題があるものではありませんが、ユーザーに対しては無用な情報なので警告が出ない様ソースの書き方を改善していただきたいです。

  • > ユーザーに対しては無用な情報なので警告が出ない様ソースの書き方を改善していただきたいです。

    生成が成功した場合には警告は表示されないので、生成が失敗した場合にも警告はフィルターして表示されない方が良いかもしれません。Applilet EZ PL for RL78 が出力する警告には CC-RL の評価期限切れというものもあるのですが、「お手軽・安価なプログラム開発環境」というツールの位置付けを考えると、開発ツールの評価期限切れというのはユーザーに見せなくて良いものという気もします。

  • ・対応コンパイラの説明が適当でない

    Applilet EZ PL for RL78 の頁を見ると

    コンパイラはルネサス製CA78K0R(統合開発環境CS+付属品と同じ)に標準対応。また、IAR/GNUコンパイラにも対応します。

    とあるのですが、V2.00 のテンプレートのソースを見ると

    common.h:

    #ifdef __CCRL__
    extern	__saddr	UCHAR	fTx0Done;
    extern	__saddr	UCHAR	fTx6Done;
    extern	__saddr	UCHAR	fTm10ms;
    extern	__saddr	UCHAR	fTrg50ms;
    extern	__saddr	UCHAR	fTrg1s;
    extern	__saddr	UCHAR	fTrg10ms;
    
    #else
    #error "undefined compiler"
    #endif
    

    CC-RL 以外には現状対応していないようです。

    対応コンパイラについて説明を改める必要があると思います。

  • fujita nozomu 様

    管理人のAyrです。

    ApEZPL RL78 V2開発の担当者から私の方に下記の回答がありましたので
    回答させていただきます。

    -----------------------【回答】----------------------------------------------
    貴重なご意見、ありがとうございます。

    ApEZPL RL78 V2は、V1でのコード生成効率の悪さを、CC-RL対応にすることで、改善しようとしたものですが、ご指摘いただいていますように、改善すべき点は多数あります。
    このツールを出来るだけ使いやすいものにすることで、「GUI操作だけで簡単に、マイコンのプログラムを生成する」というコンセプトに近づきたいと思っています。

    いただいたご意見は、開発方針の参考とさせて頂きます。
    ---------------------------------------------------------------------
  • ありがとうございます。反応があると嬉しいです。
    次期更新の際の意見のひとつとして頂けたら幸いです。
  • 自己レス

    あれ? V2.00 の「設定(S)」→「フラッシ・メモリ・プログラマ(M)」で表示されるダイアログで COMポートの設定ができるな?

    Applilet EZ PL for RL78 Ver 2.00 で USB シリアル変換ケーブルと自作のアダプタを使用して、COM ポート経由での書き込みができることを確認しました。

  • ・生成時に出力される「使用ROMサイズ」が分かりにくい

    生成を行い、

    コンパイルを開始します。
    ---------- Pass1 ----------
    ---------- Pass2 ----------
    ---------- Pass3 ----------
    コンパイルが終了しました。
    
    使用ROMサイズ 2790byte
    

    生成が成功して上記のメッセージが出力された場合の .map ファイル中の Mapping List が以下の通りです。

    *** Mapping List ***
    
    SECTION                            START      END         SIZE   ALIGN
    
    .vect
                                      00000000  0000007f        80   0
    .const
                                      00000080  0000008f        10   2
    .constf
                                      00000080  00000080         0   2
    .sdata
                                      00000080  00000080         0   2
    .option_byte
                                      000000c0  000000c3         4   1
    .security_id
                                      000000c4  000000cd         a   1
    .textf
                                      000000c4  000000c4         0   1
    .data
                                      000000ce  00000140        73   2
    .text
                                      00000141  00000aaf       96f   1
    .RLIB
                                      00000ab0  00000b15        66   1
    .bss
                                      000ffce0  000ffced         e   2
    .dataR
                                      000ffcee  000ffd60        73   2
    .stack_bss
                                      000ffd62  000ffda1        40   2
    .sbss
                                      000ffe20  000ffe28         9   2
    .sdataR
                                      000ffe2a  000ffe2a         0   2
    
    *** Total Section Size ***
    
    RAMDATA SECTION:  000000ca Byte(s)
    ROMDATA SECTION:  00000111 Byte(s)
    PROGRAM SECTION:  000009d5 Byte(s)
    

    「使用ROMサイズ」の 2790byte は ROMDATA SECTION: の 0x00000111 Byte(s) と PROGRAM SECTION の 0x000009d5 Byte(s) の合計に等しく、使用されている領域 0x00000~0x0008f と 0x000c0~0x00b15 の合計にも等しく数字としては正しいのですが、この場合 RL78/G10 と CC-RL のメモリ配置の制限により 0x00090~0x000bf に使われなかった領域が存在するため、開始アドレス~終了アドレス の 0x00000~0x00b15 とは「使用ROMサイズ」は異なる値となっています。

    使用 ROM サイズを出力する目的はユーザーにあとどれだけ使えるかを伝えることだと思いますが、現在の出力ではRL78/G10 と CC-RL の組み合わせでの使用では避けることが難しい使われない領域はユーザーに伝わらないため、開発を進めるている内に使用しているマイコンの容量いっぱいまで使用する前にメモリが足りなくなる状態に遭遇する可能性が考えられます。

    先の場合、開始アドレス~終了アドレス の 0x00000~0x00b15 を使用 ROM サイズとし

    コンパイルを開始します。
    ---------- Pass1 ----------
    ---------- Pass2 ----------
    ---------- Pass3 ----------
    コンパイルが終了しました。
    
    使用ROMサイズ 2838byte
    

    上のように出力するか、使われなかった領域とまだ使える領域も併せて出力し

    コンパイルを開始します。
    ---------- Pass1 ----------
    ---------- Pass2 ----------
    ---------- Pass3 ----------
    コンパイルが終了しました。
    
    使用ROMサイズ 2790byte
    非使用ROMサイズ 48byte
    未使用ROMサイズ 1258byte
    
    上記等とするのが良いのではないでしょうか。
  • ・RAM の初期化前に割り込みを許可するのは危険

    生成されたプログラムは cstart.asm の中で hdwinit() でハードウェアの初期化を行った後、RAM 全域のゼロクリアと大域変数の初期値の設定を行い main() を呼び出す流れとなっていますが

    	;--------------------------------------------------
    	; hardware initialization
    	;--------------------------------------------------
    	CALL	!!_hdwinit
    
    	;--------------------------------------------------
    	; initializing RAM
    	;--------------------------------------------------
    $IF (__RENESAS_VERSION__ >= 0x01010000)
    	MOVW	HL,#LOWW(__RAM_ADDR_START)
    	MOVW	AX,#LOWW(__RAM_ADDR_END)
    $ELSE	; for CC-RL V1.00
    	MOVW	HL,#LOWW(RAM_ADDR_START)
    	MOVW	AX,#LOWW(RAM_ADDR_END)
    $ENDIF
    	BR	$.L2_RAM
    .L1_RAM:
    	MOV	[HL+0],#0
    	INCW	HL
    .L2_RAM:
    	CMPW	AX,HL
    	BNZ	$.L1_RAM
    
    	;--------------------------------------------------
    	; ROM data copy
    	;--------------------------------------------------
    	; copy external variables having initial value (near)
    	MOV	ES,#HIGHW(STARTOF(.data))
    	MOVW	BC,#LOWW(SIZEOF(.data))
    	BR	$.L2_DATA
    .L1_DATA:
    	DECW	BC
    	MOV	A,ES:LOWW(STARTOF(.data))[BC]
    	MOV	LOWW(STARTOF(.dataR))[BC],A
    .L2_DATA:
    	CLRW	AX
    	CMPW	AX,BC
    	BNZ	$.L1_DATA
    
    	; copy saddr variables having initial value
    	MOV	ES,#HIGHW(STARTOF(.sdata))
    	MOVW	BC,#LOWW(SIZEOF(.sdata))
    	BR	$.L2_SDATA
    .L1_SDATA:
    	DECW	BC
    	MOV	A,ES:LOWW(STARTOF(.sdata))[BC]
    	MOV	LOWW(STARTOF(.sdataR))[BC],A
    .L2_SDATA:
    	CLRW	AX
    	CMPW	AX,BC
    	BNZ	$.L1_SDATA
    
    	;--------------------------------------------------
    	; call main function
    	;--------------------------------------------------
    	CALL	!_main		; main();
    

    systeminit.c 中での hdwinit() はときとして次のようなコードとなり、

    /*******************************************************************************
    * Function Name: SystemInit
    * Description  : This function initializes every Macro.
    * Arguments    : none
    * Return Value : none
    ********************************************************************************/
    void SystemInit( void )
    {
    	/* Initialize the peripheral I/O Redirection registers */
    	PIOR = 0x00;
    
    	/* Peripheral Enable Register initiate */
    	PER0 = 0x00;
    
    	/* Clock generator initiate */
    	Clock_Init();
    	
    	/* Port initiate */
    	PORT_Init();
    	
    	/* WDT initiate */
    	WDT_Init();
    	
    	/* INT initiate */
    	INT_Init();
    	
    #if !defined PWM_USED
    	/* TM00 initiate */
    	TM00_Init();
    #endif /* end of defined PWM_USED */
    }
    
    /*******************************************************************************
    * Function Name: hdwinit
    * Description  : This function initializes hardware settings.
    * Arguments    : none
    * Return Value : none
    ********************************************************************************/
    void hdwinit( void )
    {
    	__DI( );
    	SystemInit( );
    	__EI( );
    }
    

    割り込みの初期化と許可までを行います。RAM の初期化を終える前に割り込み処理を実行してしまうと、大域変数が 0 や初期値で初期化されていることを前提としたコードは正常動作しない可能性があり危険と思います。また、割り込み処理で変数に代入された何らかの値が cstart.asm の RAM 初期化処理で初期化されてしまう可能性も考えられます。

    cstart.asm の処理は

    	;--------------------------------------------------
    	; initializing RAM
    	;--------------------------------------------------
    $IF (__RENESAS_VERSION__ >= 0x01010000)
    	MOVW	HL,#LOWW(__RAM_ADDR_START)
    	MOVW	AX,#LOWW(__RAM_ADDR_END)
    $ELSE	; for CC-RL V1.00
    	MOVW	HL,#LOWW(RAM_ADDR_START)
    	MOVW	AX,#LOWW(RAM_ADDR_END)
    $ENDIF
    	BR	$.L2_RAM
    .L1_RAM:
    	MOV	[HL+0],#0
    	INCW	HL
    .L2_RAM:
    	CMPW	AX,HL
    	BNZ	$.L1_RAM
    
    	;--------------------------------------------------
    	; ROM data copy
    	;--------------------------------------------------
    	; copy external variables having initial value (near)
    	MOV	ES,#HIGHW(STARTOF(.data))
    	MOVW	BC,#LOWW(SIZEOF(.data))
    	BR	$.L2_DATA
    .L1_DATA:
    	DECW	BC
    	MOV	A,ES:LOWW(STARTOF(.data))[BC]
    	MOV	LOWW(STARTOF(.dataR))[BC],A
    .L2_DATA:
    	CLRW	AX
    	CMPW	AX,BC
    	BNZ	$.L1_DATA
    
    	; copy saddr variables having initial value
    	MOV	ES,#HIGHW(STARTOF(.sdata))
    	MOVW	BC,#LOWW(SIZEOF(.sdata))
    	BR	$.L2_SDATA
    .L1_SDATA:
    	DECW	BC
    	MOV	A,ES:LOWW(STARTOF(.sdata))[BC]
    	MOV	LOWW(STARTOF(.sdataR))[BC],A
    .L2_SDATA:
    	CLRW	AX
    	CMPW	AX,BC
    	BNZ	$.L1_SDATA
    
    	;--------------------------------------------------
    	; hardware initialization
    	;--------------------------------------------------
    	CALL	!_hdwinit
    
    	;--------------------------------------------------
    	; call main function
    	;--------------------------------------------------
    	CALL	!_main		; main();
    

    上記のように変更し、RAM 初期化 → hdwinit() 呼び出し → main() 呼び出し という流れにすべきと思います。