Top > R8C >開発環境 GNUM16C v0901_0902における問題

レジスタ定義ファイルの問題

v0901およびv0902で自動生成されるレジスタ定義ファイル iodefine.hの一部に問題があるようです。 現時点で確認しているのはR8C/2Aのみですが、もしかすると、 他のデバイスにも同様の問題が存在する可能性があります。 以下のソースコードはR8C/2Aの場合です。 282行目からのタイマーCのレジスタ定義に指定されている型が間違っています。 タイマーCは16ビットタイマーなのでtrc,trcgra,trcgrb,trcgrc,trcgrdは、 (*(volatile unsigned short *)で定義されるはずです。 チェックしきれてませんがほかのレジスタ定義にも問題があるかもしれません。

iodefine.h
#define	trc	(*(volatile union byte_def *) (0x0126))	/* Timer RC counter register */

#define	trcgra	(*(volatile union byte_def *) (0x0128))	/* Timer RC general register A */

#define	trcgrb	(*(volatile union byte_def *) (0x012A))	/* Timer RC general register B */

#define	trcgrc	(*(volatile union byte_def *) (0x012C))	/* Timer RC general register C */

#define	trcgrd	(*(volatile union byte_def *) (0x012E))	/* Timer RC general register D */

スタートアップルーチンの変更点

v0901およびv0902で自動生成されるスタートアップルーチン start.asmに変更がありました。 以下のソースコードはR8C/2Aの場合です。 38行目の可変ベクタテーブルの開始アドレスが0xFEDCに変更されました。 Linkerの設定の.var_vectsの項目をこのアドレスと一致させる必要があります。

startup.asm
_start:
	ldc	#_istack, isp	/* set interrupt stack pointer */
	mov.b	#0x02,0x0a	/* write enable in protect register */
	mov.b	#0x00,0x04	/* set processer mode  :single chip mode */
				/* 0x04 is the address of processor mode register 0 */
	mov.b	#0x00,0x0a	/* write disable in protect register */
	ldc	#0x0080,flg	/* select USER STACK POINTER (BIT7=1,USP) (BIT7=0,ISP) */
	ldc	#_ustack,sp	/* set user stack pointer */
	
	/* INTERRUPT VECTOR ADDRESS  definition	*/
	ldc 	#0x0, intbh
	ldc 	#0xFEDC, intbl	/* 変更点load variable vector address in intbl */

	fset	I		/* ADD THIS TO ENABLE INTERRUPTS */
		
	/* call the hardware initialiser */
	jsr.a	_hw_initialise