Applilet EZ PL for RL78 改善要望

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

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

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

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

Parents
  • ・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() 呼び出し という流れにすべきと思います。

Reply
  • ・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() 呼び出し という流れにすべきと思います。

Children