アットウィキロゴ

C言語LED点滅

1. LED点滅ソースコード(blink.c)


#define P4DDR   (*(volatile unsigned char *)0xfee003)
#define P4DR    (*(volatile unsigned char *)0xffffd3)

int main(void){
        int i;
        P4DDR = 0xc0;           // Set bit 6 and 7 of port No.4 for Output
        while(1){
                P4DR = 0x80;    // Write bit 7 to turn on Green LED
                i=1000000;
                while(i>0) i--; // Wait for a moment
                P4DR = 0x40;    // Write bit 6 to turn on Red LED
                i=1000000;
                while(i>0) i--; // Wait for a moment
        }
}

2. RAM用スタートアップスクリプト(ramcrt0.S)


	.h8300h 
	.section .text
	.global	_start
_start: 
	jsr	@_main
	rts

3. RAM用リンカスクリプト(ram3069F.x)


OUTPUT_FORMAT("elf32-h8300")
OUTPUT_ARCH(h8300h)
ENTRY("_start")
MEMORY
{
	syscall(r) : o = 0x000100, l = 0x0200
	ram(rwx)   : o = 0xffbf20, l = 0x1800
}
SECTIONS
{ 
.text :	{
	*(.text)
	*(.strings)
	*(.rodata)
  	 _etext = . ; 
	}  > ram
.tors : {
	___ctors = . ;
	*(.ctors)
	___ctors_end = . ;
	___dtors = . ;
	*(.dtors)
	___dtors_end = . ;
	}  > ram
.data : {
	*(.data)
	 _edata = . ; 
	}  > ram
.bss : {
	 _bss_start = . ;
	*(.bss)
	*(COMMON)
	 _end = . ;  
	}  >ram
}


4. コンパイル、リンク。各オプションの意味は以下の通り。


-g            : デバッグ情報を付加する
-mh           : H8/300Hシリーズのプロセッサ向けにコンパイルを行う
-mint32       : 32bitのint型を使用する(デフォルトは16bit)
-nostartfiles : 標準のスタートアップスクリプト(crt0.S)を使用しない。
-T            : リンカスクリプトを指定
-o            : 出力ファイル名の指定

$ export PATH=/usr/local/gnu/bin:$PATH
$ h8300-elf-gcc -g -mh -mint32 -nostartfiles -Tram3069f.x -o blink.elf ramcrt0.S blink.c

これで blink.elf が完成。


5. ROM用スタートアップスクリプト(30xxcrt0.S)


	.h8300h
	.section .text
	.global	_start
_start:
	mov.l	#_stack,sp
	mov.l	#___dtors_end,er0
	mov.l	#___data,er1
	mov.l	#_edata,er2
.mvdata:
	mov.w	@er0,r3
	mov.w	r3,@er1
	adds	#2,er0
	adds	#2,er1
	cmp.l	er2,er1
	blo	.mvdata
	jsr	@_main
	bra	_start

	.section .stack
_stack:	.long 	1

5. ROM用リンカスクリプト(rom3069f.x)


OUTPUT_FORMAT("elf32-h8300")
OUTPUT_ARCH(h8300h)
ENTRY("_start")
MEMORY
{
	rom(rx)    : o = 0x00b000, l = 0x055000
	ram(rwx)   : o = 0xffdd20, l = 0x001800
	stack(rw)  : o = 0xffff1c, l = 0x000004
}
SECTIONS 				
{ 					
.text : {
	*(.text)		
	*(.strings)
	*(.rodata)
  	 _etext = . ; 
	} > rom
.tors : {
	___ctors = . ;
	*(.ctors)
	___ctors_end = . ;
	___dtors = . ;
	*(.dtors)
	___dtors_end = . ;
	}  > rom
.data : AT ( ADDR(.tors) + SIZEOF(.tors) ){
	___data = . ;
	*(.data)
	*(.tiny)
	 _edata = .;
	} > ram
.bss : {
	 _bss_start = . ;
	*(.bss)
	*(COMMON)
	 _end = . ;  
	}  >ram
.stack : {
	 _stack = . ; 
	*(.stack)
	}  > stack
}

6. ROM化のためのコンパイル、リンク


$ h8300-elf-gcc -O -mh -mint32 -nostartfiles -Trom3069f.x -o blink.elf 30xxcrt0.S blink.c

7. Sレコード型式への変換


Sレコード形式と呼ばれるファイル形式に変換する。Sレコード形式とは、米モトローラ社によって開発されたテキスト形式のファイルで、ROMアドレスとバイナリコードが規則正しく並んでいる。また、ほとんどのROMライタがこのSレコード形式に対応している。
変換が出来たら、GDBスタブやRedBootを焼いたときと同じようにフラッシュROMに焼きます。もちろん、

$ h8300-elf-objcopy -O srec blink.elf blink.mot

ROM用Sレコード(blink.mot)

S00C0000626C696E6B2E6D6F7465
S113B0007A0700FFFF1C7A000000B0607A0100FF9D
S113B010DD207A0200FFDD20690369930B800B8138
S113B0201FA145F45E00B02A40D601006DF60FF66C
S113B030FAC06AAA00FEE0037A0300FFFFD3FA8095
S113B04068BA7A02000F42401B020FA24EFAFA407D
S113B05068BA7A02000F42401B020FA24EFA40DE89
S903B0004C

8. H8へ焼く


H8をフラッシュROM書き込みモードにして、電源を入れ以下コマンドを実行
# kz_h8write -3069 -f20 blink.mot /dev/ttyUSB0

H8の電源を切り、通常モードにして再度電源をONするとLEDが点滅する。



参考ページ

タグ:

+ タグ編集
  • タグ:
最終更新:2015年01月15日 21:59