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 以外には現状対応していないようです。
対応コンパイラについて説明を改める必要があると思います。
自己レス
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() 呼び出し という流れにすべきと思います。