090915

|



SD/MMCカードを実装にあたって一番最初、H8/3052でテストしていた。その時の
ブレッドボードが未だにそのままなので、まとめておきました。回路は
74VHC125でH8側の5Vと、SD/MMCカード側の3.3Vを変換するだけ。一応SD/MMCの
仕様に従ってプルアップ。



H8開発機の中に押しこめました。ストレージがつくとちょっとうれしい。

SHについて。まずはコンパイラと呼出し規約を確認。gccとルネサスでMACレジ スタの扱いに違いがある。
sh-elf-gcc -Q --help=target -c
sh-elf-gcc --target-help
gcc-4.3.2/gcc/config/sh/sh.h
あたりから様子を探ります。
リーディングアンダースコア
引数は4つまでレジスタ渡し、それ以降はスタックに積む。

R0-R1 関数の返り値 (caller saved)
R2-R3 スクラッチ (caller saved)
R4-R7 関数の引数 (caller saved)
R8-R13 callee saved.
R14 フレームポインタ (callee saved)
R15 スタックポインタ (callee saved)

FPU1 caller saved
FR0-FR3 関数の返り値
FR4-FR11 関数の引数
FR12-FR15 callee saved

gcc-4.3.2/gcc/config/sh/sh.hより。

/* Register allocation for the Renesas calling convention:

        r0		arg return
	r1..r3          scratch
	r4..r7		args in
	r8..r13		call saved
	r14		frame pointer/call saved
	r15		stack pointer
	ap		arg pointer (doesn't really exist, always eliminated)
	pr		subroutine return address
	t               t bit
	mach		multiply/accumulate result, high part
	macl		multiply/accumulate result, low part.
	fpul		fp/int communication register
	rap		return address pointer register
	fr0		fp arg return
	fr1..fr3	scratch floating point registers
	fr4..fr11	fp args in
	fr12..fr15	call saved floating point registers  */

----------------------------------------------------------------------

 -mrenesas Comply with the calling conventions defined by Renesas.

Renesas saves and restores mac registers on call.

The multiply instructions and multiply/accumulate instructions store
results in the MAC register.

 -mnomacsave Mark the "MAC" register as call-clobbered, even if
  -mhitachi is given.

MACレジスタをcallee-savedにするかcaller-savedにするか。gccデフォルトだと
caller-saved(call-clobbered)。-mrenesas(-mhitachi)にするとcallee-saved.


/* sh-elf-gcc -O -S -fomit-frame-pointer a.c */
int
a (int a0, int a1, int a2, int a3)
{

  return a0 + a1 + a2 - a3;
}

int
c (int a0, int a1, int a2, int a3, int a4)
{

  return a0 + a1 + a2 - a3 + a4;
}

int
b ()
{
  a (0, 1, 2, 3);
  return c (0, 1, 2, 3, 4);
}

int
main ()
{

  return a (0xaa55, 4, 3, 2);
}

	.file	"a.c"
	.text
	.text
	.align 1
	.global	_a
	.type	_a, @function
_a:
	mov	r5,r0
	add	r4,r0
	add	r6,r0
	rts	
	sub	r7,r0
	.size	_a, .-_a
	.align 1
	.global	_c
	.type	_c, @function
_c:
	mov	r5,r0
	add	r4,r0
	add	r6,r0
	mov.l	@r15,r1
	add	r1,r0
	rts	
	sub	r7,r0
	.size	_c, .-_c
	.align 1
	.global	_b
	.type	_b, @function
_b:
	sts.l	pr,@-r15
	add	#-4,r15
	mov	#4,r1
	mov.l	r1,@r15
	mov	#0,r4
	mov	#1,r5
	mov	#2,r6
	mov.l	.L7,r0
	jsr	@r0
	mov	#3,r7
	add	#4,r15
	lds.l	@r15+,pr
	rts	
	nop
.L8:
	.align 2
.L7:
	.long	_c
	.size	_b, .-_b
	.align 1
	.global	_main
	.type	_main, @function
_main:
	sts.l	pr,@-r15
	mov.l	.L11,r4
	mov	#4,r5
	mov	#3,r6
	mov.l	.L12,r0
	jsr	@r0
	mov	#2,r7
	lds.l	@r15+,pr
	rts	
	nop
.L13:
	.align 2
.L11:
	.long	43605
.L12:
	.long	_a
	.size	_main, .-_main
	.ident	"GCC: (GNU) 4.3.2"