##############「Hello World」のソースコード(1.2.1 - 1.2.9)###################
ここ
http://kozos.jp/kozos/osbook/osbook_03/01/bootload/に、本書第1章で作成するプログラムのソースコードがおいてある。今回は、環境構築のテストが目的なので、そのまま流用させてもらう。
#クロス開発のソースコードは~/12step/src/01/bootloadに置く
cd ~/12step/src/
mkdir 01
cd 01
mkdir bootload
cd bootload
#ここにソースコードをダウンロードしてくる
#main()関数 main.c(1.2.2)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/main.c
#スタート・アップ startup.s(1.2.3)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/startup.s
#割り込みベクタの定義 vector.c(1.2.4)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/vector.c
#各種ライブラリ関数のヘッダ・ファイル lib.h(1.2.5)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/lib.h
#各種ライブラリ関数の本体 lib.c(1.2.5)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/lib.c
#シリアル・デバイス・ドライバのヘッダ・ファイル serial.h(1.2.6)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/serial.h
#シリアル・デバイス・ドライバの本体 serial.c(1.2.6)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/serial.c
#様々な型の定義 defines.h(1.2.7)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/defines.h
#リンカ・スクリプト ld.scr(1.2.8)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/ld.scr
#ビルド方法 Makefile(1.2.9)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/Makefile
#################Makefileの編集(1.2.9)#########################
本書では、各種ライブラリを/usr/localにインストールしているが、今回の私の環境ではこれらをすべて、~/12step/toolsにおいている。そこでMakefileを編集して、~/12step/toolsに読みに行くようにする。
#以下の合計3カ所をコメントアウトして書き換えた
vim Makefile
ドライバに関しては、USBシリアルケーブルをMacに接続した後、以下のコマンドを実行することで調べることができる。
ls /dev/tty.*
で調べたものを書いた。私の環境は、/dev/tty.usbserial-FTB3L7SJであった。
#####################ビルド(1.3)########################
#/Users/kappa/12step/src/bootloadにてmakeを実行
make
#うまくいったら、kzloadという実行形式ファイルが生成しているはず。。
ls
Makefile kzload ld.scr lib.h main.c serial.c serial.o startup.s vector.o
defines.h kzload.elf lib.c lib.o main.o serial.h startup.o vector.c
できた!
kzloadというファイルは、ELF形式というフォーマットで、h8writeでそのままH8/3069Fマイコン・ボードのフラッシュROMに書き込むことはできないそうだ。h8writeでフラッシュROMに書き込めるのは、モトローラSレコード・フォーマットという形式のファイルだそうだ。
ELF形式に変換するには、objcopyというコマンドが必要であるらしい。そして、binutilsをインストールした時に、objcopyも一緒にビルドされているとのこと。なんて、便利なんだろう。
それでは、以下のコマンドでフォーマット変換を行う。
~/12step/tools/h8300-elf/bin/objcopy -O srec kzload kzload.mot
ls
Makefile kzload kzload.mot lib.c lib.o main.o serial.h startup.o vector.c
defines.h kzload.elf ld.scr lib.h main.c serial.c serial.o startup.s vector.o
このコマンドは長いので、Makefileに記述がされている。よってmake imageというコマンドでいけるとのこと。
#一度消去して
rm kzload.mot
#Makefileに頼る
make image
~/12step/tools/bin/h8300-elf-objcopy -O srec kzload kzload.mot
ls
Makefile kzload kzload.mot lib.c lib.o main.o serial.h startup.o vector.c
defines.h kzload.elf ld.scr lib.h main.c serial.c serial.o startup.s vector.o
##################フラッシュROMへの書き込み(1.3.2)#####################
を~/12step/toolsにおいてあるkz_h8writeを用いてフラッシュROMへ書き込む
sudo ~/12step/tools/kz_h8write -3069 -f20 kzload.mot /dev/tty.usbserial-FTB3L7SJ
これまた、Makefileに記載があるので、make writeでもよい。
make write
そして、ここでまたハマった。
ハマったのは2カ所。
・1カ所目
ボード本体に電源のケーブルを挿入していなかった。
・2カ所目
ボード状のスイッチを左から「ON, ON, OFF, ON」にしていなかった。「ON, ON, OFF, ON」にすることで、CPUが書き込みモードで起動するようだ。あまりにも困ったものだから、著者のサポートページをよく読んだら、書いてあった。
マイコン・ボードの右上には,4連のディップ・スイッチがあります. これらはCPUの動作モード設定ピンに直結しているスイッチで,CPUの動作モードを 指定することができます.またディップ・スイッチのすぐ右には, リセット・ボタンがあります.
まず,ディップ・スイッチを左から,ON,ON,OFF,ONの状態(上,上,下,上)に してください. この状態で電源ONすると,フラッシュROM書き込みモードとしてCPUが起動します.
PCとH8/3069Fマイコン・ボードをシリアル・ケーブルで接続します. さらにマイコン・ボードに電源アダプタを接続し,電源を入れます. H8/3069Fマイコン・ボードには電源のON/OFFボタンがありませんので, 電源アダプタを接続するとそのまま電源ONになります.
H8/3069Fマイコン・ボードの電源を入れたらフラッシュROM書き込みモードで起動して いますので,h8writeを実行することで,シリアル経由でフラッシュROMに 書き込みができます.
写真を貼付けておく。
電源とシリアルコネクタに注目
ディップ・ スイッチに注目
うまくいくと、以下のようなログが表示される。
sudo make write
../../../tools/kz_h8write -3069 -f20 kzload.mot /dev/tty.usbserial-FTB3L7SJ
=================================================
H8/3069F Flash Writer for KOZOS (Version 0.2.1)
Copyright(C) 2011-2012 Shinichiro Nakamura
=================================================
Bitrate sequence: Done.
Inquiry device: Done.
Select device: Done.
Inquiry clock mode: Done.
Select clock mode: Done.
Select bitrate: Done.
Waiting for erase done:......
Programming:.....
Program: Done.
Complete.
#######picocomを用いてボードを起動し、シリアル通信を行う(1.3.4 - 1.3.10)###########
ディップ・スイッチを「ON, OFF, ON, OFF」に変更し、リセットボタンを押す。リセットボタンは、ディップ・スイッチの右隣にある。
あとは、通信をするだけ。
以前、Arduinoでシリアル通信をするために、picocomというコンパクトなシリアル通信の端末エミュレータをインストールしてあったので、それを使用する。
picocom -r -l /dev/tty.usbserial-FTB3L7SJ
picocom v1.7
port is : /dev/tty.usbserial-FTB3L7SJ
flowcontrol : none
baudrate is : 9600
parity is : none
databits are : 8
escape is : C-a
local echo is : no
noinit is : no
noreset is : yes
nolock is : yes
send_cmd is : sz -vv
receive_cmd is : rz -vv
imap is :
omap is :
emap is : crcrlf,delbs,
Terminal ready
Hello World! #スイッチを押すたびにHello World!が出力される!!!!
Hello World!
Hello World!
#######cuを用いてボードを起動し、シリアル通信を行う(1.3.4 - 1.3.10)###########
cuはMacでデフォルトでついているエミュレータである。
sudo cu -l /dev/tty.usbserial-FTB3L7SJ
Connected.
Hello World! #やはりスイッチを押すたびにHello World!が帰ってくる。
Hello World!
Hello World!
Hello World!
Hello World!
~. #終了するときは、~.と入力してEnterを押せばいい。
Disconnected.
以上で、MacによるStep1は終了した!!!!!!!!!!!!!!!!!
一日で終わって本当に良かった。
これも、ネット上に丁寧にログを残してくださっている皆様のお陰。
###################追記1##################
最後に環境変数PATHに
$HOME/12step/tools/binを追加していたが、普段は必要ないので、コメントアウトしておく方がよい。そうでないと、クロス開発用のgccが優先されてしまう。
#export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export PATH=$HOME/12step/tools/bin:/opt/local/bin:/opt/local/sbin:$PATH
を
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
#export PATH=$HOME/12step/tools/bin:/opt/local/bin:/opt/local/sbin:$PATH
のように戻しておくこと。
##################追記2##################
いろいろ検証してみたが、どうやらPATHに~/12step/tools/binを必要はないようだ。
なぜなら、makeファイルの中で
PREFIX = ~/12step/tools
としており、これにより、
BINDIR = $(PREFIX)/bin
は
BINDIR = ~/12step/tools/bin
となるためである。
【参考文献】
坂井 弘亮『12ステップで作る組込みOS自作入門』カットシステム 2010