Applilet EZ PL for RL78 V1.0J, V2.00J を試してみました。
デジタル回路版電子ブロックという感じで興味深いツールと思いましたが、少々使いづらい点もあったので改善要望として挙げておきます。
> 本ツールは評価版です。本ツールに関するテクニカルサポートは受け付けておりません。
と明記されていることは理解しており、返答等を求めているものではありません。
・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() 呼び出し という流れにすべきと思います。
ターゲットが RL78/G10 の場合は RAM にパリティ機能がないのでその心配はないようです。
もう出回ってるのかわかりませんが RL78/G11 にはその可能性はありそうですね。
RL78/G11は1週間ほど前にググった時には未だデバイスは無かったです。以下の評価ボードはありましたが。出回るようになったら秋月電子さんでデバイス単体と変換基板実装済みの2パターンでRL78/G10同様に販売してくれるだろうか、、、
YQB-R5F1057A-TB - Digi-Key