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