組込み開発再入門(1) – Lチカ

色々理解できていないので組込み開発を学び直すことにした。

スポンサーリンク

ターゲットボード

死蔵しているH8/3048F(秋月電子:K-00179)とマザーボード(秋月電子:K-00140)を有効活用することにした。
(新規購入するのであればRJ-45端子が付いているH8/3069Fネット対応マイコンLANボードをお勧めする。)

開発環境の用意

「組込みOS自作入門」という本で用意した環境をそのまま使うことにした。
開発環境の準備方法は 著者のホームページが詳しい。

リンカスクリプトの書き方は本書を参考にした。

回路図を眺める

まずは回路図を眺める。
手始めに 5P0 と 5P1 に接続されている LED を点灯させてみることにした。

ソースコード

LED点灯したら無限ループに入るだけのプログラム。

/********************************************************************************/
/* led.s - LED点灯プログラム
/********************************************************************************/
 
        .h8300h 
 
        .equ    P5DDR,  0xFFFC8
        .equ    P5DR,   0xFFFCA
 
        .section    .text
 
        .global     _start
        .type       _start,@function
 
_start:
 
        /* スタックポインタの設定 */
        mov.l   #0xFFF00, sp
 
        /* P5 を出力に設定 */
        mov.b   #0xF3, r0l
        mov.b   r0l, @P5DDR
 
        /* LED を点灯 */
        mov.b   #0x03, r0l
        mov.b   r0l, @P5DR
 
EXIT:
        bra     EXIT

わからなかったこと

  • ビット演算子の使い方がわからない
    • “bset #0, @P5DR” とかで LED ON できると思ったらできなかった
    • “bset #0, @P5DR:8” とビット幅を指定してやるとコンパイルはできるがやはり無理
  • → “bset.b #0x00, @P5DR:8” と記述することで無事に動作するようになった
  • .section で開始アドレスは指定できない?

リンカスクリプト

.section で開始アドレス指定できないっぽいのでリンカスクリプトを書いてみる。
とりあえず動くレベル。後でもうちょっとちゃんと書く。

OUTPUT_FORMAT("elf32-h8300")
OUTPUT_ARCH(h8300h)
ENTRY("_start")
 
SECTIONS
{
    . = 0x0;
    .vectors : {
        LONG(ABSOLUTE(_start))
    }
    . = 0x00100;
    .text : {
        *(.text)
    }
}

Makefile

自前でコンパイルしたツールチェインを /usr/local/ に置いてるのでこんな感じ。h8write にはビットレート合わせ込みシーケンスにバグがあるらしいけど問題なく書き込めてるのでまぁいいか。

PREFIX	=	/usr/local
ARCH	=	h8300-elf
BINDIR	=	$(PREFIX)/bin
ADDNAME	=	$(ARCH)-
TARGET	=	led
 
AR		=	$(BINDIR)/$(ADDNAME)ar
AS		=	$(BINDIR)/$(ADDNAME)as
CC		=	$(BINDIR)/$(ADDNAME)gcc
LD		=	$(BINDIR)/$(ADDNAME)ld
NM		=	$(BINDIR)/$(ADDNAME)NM
OBJCPY	=	$(BINDIR)/$(ADDNAME)objcopy
OBJDMP	=	$(BINDIR)/$(ADDNAME)objdump
LANLIB	=	$(BINDIR)/$(ADDNAME)ranlib
STRIP	=	$(BINDIR)/$(ADDNAME)strip
 
OBJS	=	led.o
 
CFLAGS	=	-Wall -mh -nostdinc -nostdlib -fno-builtin
CFLAGS	+=	-I
CFLAGS	+=	-g
CFLAGS	+=	-Os
 
LFLAGS	=	-static -T linker.x -L.
 
.SUFFIX:	.c	.o
.SUFFIX:	.s	.o
 
all:		$(TARGET)
 
$(TARGET):	$(OBJS)
			$(CC) $(OBJS) -o $(TARGET) $(CFLAGS) $(LFLAGS)
			cp $(TARGET)	$(TARGET).elf
			$(STRIP) $(TARGET)
 
$(TARGET).mot:	$(TARGET)
				$(OBJCPY) -O srec $(TARGET) $(TARGET).mot
 
image:		$(TARGET).mot
 
clean:		$(TARGET)
			rm -rf led led.elf led.mot led.o
 
write:		$(TARGET).mot
			h8write -3048 $(TARGET).mot /dev/ttyUSB0

次はビルドしたイメージファイルの中身を覗いたり、リンカスクリプトについてもうちょっと詳しく見ていきたいと思う。

スポンサーリンク

フォローする

コメント

  1. […] 組込み開発再入門(1)で適当なリンカスクリプトを書いた。 これをブラシュアップしつつもうちょっと理解してみようと思う。 […]