STM32F4 DiscoveryでeCos 3.0を動かす

eCosはSTM32F4 DiscoveryというARM Cortex-M4の評価ボードで動く。 昨年の10月に試していて、無事に動作させることができたのだが、 きちんと再現できるように書いておかなかったので、再現に苦労してしまった。

NetBSD/amd64 7.99.29と7.0_STABLE (2016-05-06時点)で確認したが、別にNetBSDに限るものではないと思う。

ツールの導入

BinutilsとGCCの導入

pkgsrcより、pkgsrc/cross/arm-none-eabi-gcc5をmake installで導入すると、 Binutils 2.26とGCC 5.3.0が導入される。

依存するパッケージの導入

GUIツールであるconfigtoolとコマンドラインツールであるecosconfigは、 TclとTk、wxGTK28、wxGTK28-contribを必要としているので、 pkgsrcから以下をインストールしておく。

  • pkgsrc/lang/tcl
  • pkgsrc/x11/tk
  • pkgsrc/x11/wxGTK28
  • pkgsrc/x11/wxGTK28-contrib

eCosのソースツリーの取得

eCosのソースツリーは公式にはAnonymous CVSで取得できるが、 私は自分でGitリポジトリーに変換している。 ecosmasterブランチをデフォルトのブランチとして管理している。 以下のように取得しておく。


$ cd ~/rtos/ecos
$ git clone git@github.com:ryoon/eCos.git

依存するライブラリーの導入

cyginfraとlibcdlというライブラリーがeCosの一部として提供されている。 設定ツールが使用するので、用意しておく。


$ ~/rtos/ecos/eCos/host/infra/configure --prefix=/home/ryo_on/rtos/ecos/tools
$ gmake install
$ ~/rtos/ecos/eCos/host/libcdl/configure --prefix=/home/ryo_on/rtos/ecos/tools --with-infra=/home/ryo_on/rtos/ecos/tools --with-tcl=/usr/pkg --with-tcl-version=8.6
$ gmake install

eCosの設定ツールの導入 (コマンドライン)

コマンドラインの設定ツールであるecosconfigコマンドをビルドする。 Autotoolsを使っていないので、pkgsrc/devel/gmakeよりGNU Make 4.1を導入して、 gmakeコマンドを使わないといけない。

以下のようにmakefileを編集した上で、gmakeコマンドを実行する。


$ cat makefile
COMPILE := ../common/ecosconfig.cxx ../common/cdl_exec.cxx ../../common/common/build.cxx ../../common/common/flags.cxx
OBJECTS := $(COMPILE:.cxx=.o)
INCLUDE_PATH := -I../../common/common -I$(ECOS)/include -I$(TCL)/include
CXX := g++

ecosconfig: $(OBJECTS)
 $(CXX) $^ -L$(ECOS)/lib -L$(TCL)/lib -lcdl -lcyginfra -ltcl86 -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -o $@

%.o: %.cxx
 $(CXX) -c -g -O2 -I$(dir $<) $(INCLUDE_PATH) -o $@ $<

clean:
 rm ecosconfig $(OBJECTS)

$ gmake ECOS=/home/ryo_on/rtos/ecos/tools TCL=/usr/pkg
$ cp ecosconfig ~/rtos/ecos/tools/bin

eCosの設定ツールの導入 (GUI)

http://github.com/ryoon/eCos では、GUI設定ツールであるconfigtoolは、 中途半端にAutotools化してあるので、以下のようにインストールする。


$ ~/rtos/ecos/eCos/host/tools/configtool/standalone/wxwin/configure --prefix=/home/ryo_on/rtos/ecos/tools --with-wxconfig-path=/usr/pkg/bin/wx-config
$ gmake install

eCosのOS(ライブラリー)のビルド

eccファイルの用意

ecosconfigでベースとなるecos.eccを用意し、configtoolで編集し、メモリーマップをJTAGからROMに変更する。


$ mkdir ~/rtos/ecos/stm32f4d
$ cd ~/rtos/ecos/stm32f4d
$ ECOS_REPOSITORY=/home/ryo_on/rtos/ecos/eCos/packages ~/rtos/ecos/tools/bin/ecosconfig new stm32f4discovery
$ cd ~/rtos/ecos # ここで、cdしておかないとconfigtoolがsegfaultする。
$ ~/rtos/ecos/tools/bin/configtool &
; ~/rtos/ecos/stm32f4d/ecos.ecc を開く。
; CYG_HAL_STARTUPをJTAGからROMに変更する。
; ecos.eccを保存する。

ビルド用ツリーを生成し、OS (ライブラリー)をビルドする

makefile等を生成し、OSをビルドする。


$ cd ~/rtos/ecos/stm32f4d
$ ECOS_REPOSITORY=/home/ryo_on/rtos/ecos/eCos/packages ~/rtos/ecos/tools/bin/ecosconfig tree
$ gmake

これによって、~/rtos/ecos/stm32f4d/installに静的ライブラリーとヘッダーファイルが生成される。

アプリケーションをリンクしてOSのバイナリーを生成する

OSであるライブラリーをリンクしたELFバイナリーを生成し、 プレーンなbinary形式に変換する。 これがSTM32F4 Discoveryに書き込む対象になる。 今回ではa.binを書き込むこととなる。


$ cd ~/rtos/ecos/application
$ cat hello.c
#include <cyg/infra/diag.h>
int main(void)
{
        diag_printf("hello world\n");
        return 0;
}

$ /usr/pkg/cross-arm-none-eabi/bin/arm-none-eabi-gcc -g -I../stm32f4d/install/include -L../stm32f4d/install/lib -Ttarget.ld -nostdlib hello.c -O0 -mcpu=cortex-m3 -mthumb
$ /usr/pkg/cross-arm-none-eabi/bin/arm-none-eabi-objcopy -O binary a.out a.bin

バイナリーの書き込み

書き込みプログラムの準備

stlinkというツールで書き込むことにする。 OpenOCDでも書き込まれるが、今回は書き込みはstlinkで書き込むことにする。 pkgsrc/cross/stlinkをインストールすれば良い。

バイナリーの書き込み

以下のようにして、flashの0x0800000に書き込みする。 0x08000000は0x00000000にマッピングされるらしい。 つまり、0x00000000から実行されることとなる。


$ cd ~/rtos/ecos/application
$ st-flash write a.bin 0x08000000

実行と確認

診断用シリアルコンソールの接続

http://ecos.sourceware.org/ecos/boards/stm32f4discovery.htmlによると、 PC10ピンに診断用の出力がされるので、PC10ピンを3.3VのRXに接続する。 私は、秋月のTTL-232R-3V3のRXD (黄色)に接続した。 eCos for STM32F4 Discoveryでは、診断用シリアルコンソールは、 標準では115200 bpsになっているので、cu(1)で接続しておく。


$ cu -l /dev/ttyU0 -s 115200

OpenOCDのインストールと実行

pkgsrc/devel/openocdをインストールする。 これによって、電源供給をしているUSB mini Bケーブルを抜き挿ししなくてもプログラムを再実行できるようになる。


$ openocd -f /usr/pkg/share/openocd/scripts/board/stm32f4discovery.cfg
$ telnet localhost 4444
> reset init
> reset run
> reset run

このように実行することで、cu(1)の出力として、hello worldが表示される。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

plgarc/wip/llama.cppでpkgsrcのBLASサポートを探る

この記事は、 NetBSD Advent Calendar 2024 の13日目の記事です。 llama.cppを使ってみる 以前に、 NetBSD/amd64でllama.cppを使ってみる という記事で llama.cpp を使ってみていました。 あれか...