読者です 読者をやめる 読者になる 読者になる

DSP基板用プログラムをMacで開発する

DSP Mac

 前回までのあらすじ

rohi.hatenablog.com

 Blackfin DSP ADSP-BF592を搭載した基板付き雑誌を購入。Macだとコンパイラとかないなぁどうしよう。

 

環境整備

Blackfin Toolchainについて

toolchain:installing [Analog Devices Open Source| Mixed-signal and Digital Signal Processing ICs]によると、ツールチェーンにはベアメタル向けとBlackfinでLinuxを動かしている環境向けの2種類がある。また、バイナリパッケージとして提供されるものにはGCC 4.3をを使うものとGCC 4.5を使うものがある。

同ページの記述によると、パッケージはADI GNU toolchain - Browse Files at SourceForge.netにあるとのこと。このURLは雑誌本体のP.21右下に記載されいてるものと同じ。最新の2014R1フォルダへのリンクをクリックする。2014R1-RC2GCC 4.3、2014R1_45-RC2GCC 4.5を使用していて、後者は"experimental"ということらしい。

experimentalでもどっちでもいいけどMac用のバイナリパッケージを見つけられなかったので、自前でビルドすることにする。4.3でも4.5でもない最新版で。

binutils

最初はbinutilsbinutils-2.25.tar.bz2を取ってきて、bfinをターゲットにしてビルドする。brew環境ではあるけどfomuraをちゃんと作ったことがないので、今回は/usr/local/bfin-elfにざくざくインストールするようにする。インストールしたてのツールを使いながら次のツールをビルドするようなことにもなるので、あらかじめ/usr/local/bfin-elf/binあたりにPATHを通しておくとよい。

tar xjf binutils-2.25.tar.bz2

cd binutils-2.25

./configure --target=bfin-elf --without-newlib --prefix=/usr/local/bfin-elf --disable-nls --disable-shared

make

make install

gcc 1回目

次にgccgcc-5.1.0.tar.bz2を取ってくる。こちらもbfinをターゲットする。

tar xjf gcc-5.1.0.tar.bz2

cd gcc-5.1.0

mkdir build

cd build

../configure --disable-multilib --enable-languages=c --with-gmp --with-gmp-include=/usr/local/include --with-gmp-lib=/usr/local/lib --with-isllib=/usr/local/lib --with-mpfr --with-mpc --prefix=/usr/local/bfin-elf --target=bfin-elf --disable-shared --disable-threads --disable-nls --with-newlib --without-headers --with-gnu-as --with-gnu-ld

make all-gcc
make install-gcc

上記のconfigureだと、あらかじめbrewでgmpとかisllibとかmpfrとかmpcとかがインストールされている必要がある。

newlib

ターゲット上で動作するCライブラリとしてnewlibを使う。newlib-2.2.0-1.tar.bz2を取ってくる。

tar xjf newlib-2.2.0-1.tar.bz2
mkdir build-newlib
cd build-newlib
../newlib-2.2.0-1/configure --target=bfin-elf --prefix=/usr/local/bfin-elf
make all
make install

gccふたたび

さっきgccをビルドしたディレクトリに戻って以下のconfigureとmakeを実行する。これでnewlibを使えるgccになる。

../configure --disable-multilib --enable-languages=c --with-gmp --with-gmp-include=/usr/local/include --with-gmp-lib=/usr/local/lib --with-isllib=/usr/local/lib --with-mpfr --with-mpc --prefix=/usr/local/bfin-elf --target=bfin-elf --disable-shared --disable-threads --disable-nls --with-newlib --with-gnu-as --with-gnu-ld --disable-libssp

make all
make install

gdb

つぎにgdbgdb-7.9.tar.gzを取ってきて以下のconfigureを実施。configureの前にCFLAGSに"-O1"を指定したり、CCに"clang -std=gnu89"をお指定したりするのは、gdbをビルドするときに出るインライン関数関連のエラーを抑止したり、make checkでシミュレータが正しく動作しなかったりしたのを回避するため。

tar xjf gdb-7.9.tar.gz
mkdir build-gdb
cd build-gdb
CFLAGS="-O1" CC="clang -std=gnu89" ../gdb-7.9/configure --prefix=/usr/local/bfin-elf --target=bfin-elf --enable-sim-bfin

make all 

make install

参考

https://sourceware.org/ml/gdb-patches/2014-05/msg00186.html
--> リンクエラーが出るからインライン関連のところを修正するパッチ作ったよ!
https://sourceware.org/ml/gdb-patches/2014-05/msg00741.html
--> それ、CC="clang -std=gnu89"ってしたらリンクエラー出なくなるんだよ。

ldr (bfin-elf-ldr)

ここまででgccを使ってCプログラムをbfin向けにクロスコンパイルすることができ、gdbとシミューレータで動作確認をすることもできるようになっている。が、しかしボードにプログラムを流し込むにはLDR形式に変換する必要がある。ツールチェーンのバイナリパッケージをインストールできる環境なら、bfin-elf-ldrという実行ファイルがその変換を実現する。ツールチェーンのソースの塊であるblackfin-toolchain-2014R1-RC2.src.tar.bz2を解くと、ldr-utils.tar.bz2というファイルが出てきてこれを更に解くことでldrのソースが出てくる。ldr単独でどこかに公開されているのかもしれないけど、探すのがめんどくさくなってきたので探さない。

ちなみにldrをビルドするにはelf.hが必要になる。Macにはelf.hは入ってないので、これもツールチェーンのソースの塊から取り出す。

tar xjf blackfin-toolchain-2014R1-RC2.src.tar.bz2

cd blackfin-toolchain-2014R1-RC2/
tar xjf uClibc.tar.bz2 uClibc/include/elf.h
tar xjf ldr-utils.tar.bz2
cd ldr-utils
cp ../uClibc/include/elf.h .
./configure --prefix=/usr/local/bfin-elf CFLAGS="-Wno-gnu-designator" 

make

make install

ln -s /usr/local/bfin-elf/bin/ldr /usr/local/bfin-elf/bin/bfin-elf-ldr

CFLAGSに指定する"-Wno-gnu-designator"はビルド時の警告を消すためのもの。gccの名前を名乗っているclangが警告を出さないようにしているだけ。

makeによりldrコマンドができあがる。これがbfin-elf-ldrと同じもので、好きなようにリネームしてもよいが、上記のmake installで/usr/local/bfin-elfディレクトリにldrコマンドとして配置される。雑誌付録CD-ROMに入っているソースのMakefileを修正なしに使いたいのでldrをbfin-elf-ldrシンボリックリンクしておく。

ここまでで簡単なLチカ程度ならビルドできてLDR形式に変換できて、ボードに流し込んで動作するところまで確認できる。

libdsp

雑誌おまけのエフェクタサンプルプログラムたちをビルドしようとしたとき、数学関数的なヘッダファイルがないとかそういうエラーが発生してビルドできない。これはツールチェーンのソースの塊に入っているlibdsp.tar.bz2をインストールしていないために発生することがわかったのでビルド&インストールする。

cd blackfin-toolchain-2014R1-RC2

tar xjf libdsp.tar.bz2

cd libs

make CROSS=bfin-elf-

make CROSS=bfin-elf- install DESTDIR=/usr/local/bfin-elf/bfin-elf

ちなみに、ツールチェーンのソースの塊に入っているbuildscript.tar.bz2のさらにその中に入っているスクリプトBuildToolChain(今回のいろいろなツールのビルドはこのスクリプトを参考にした)には、以下のようなコメントがある。

# LIBC_HAS_NO_CMATH=1 will add several more files to libbfdsp.a.
# For file systems with low resolution timestamp, like ext2/3,
# sometimes, libbfdsp.a will not be updated correctly.
# Remove it instead of make clean can save much time. 

そういうことなので、BuildToolChainと同様にいったんlibbfdsp.aを削除してLIBC_HAS_NO_CMATH=1でビルド&インストールしなおす。結果、新しく作られたlibbfdsp.aとcomplex_fns.h というヘッダファイルが追加でインストールされる。

rm libdsp/libbfdsp.a
make CROSS=bfin-elf- LIBC_HAS_NO_CMATH=1
make CROSS=bfin-elf- LIBC_HAS_NO_CMATH=1 install DESTDIR=/usr/local/bfin-elf/bfin-elf

最後に

まぁ、なんかこんな感じでMacでプログラムを作る環境が完成した。また、前回記事にあるように、CUI版のプログラム流し込みコマンドも使えることが確認できたので、環境整備は一旦ここまでとしたい。

興味としてはbrewでFomula書いてらくちんインストール&アンインストール、という環境が気になるところ。

次なる興味

基板にはピンヘッダさえ付ければJTAGがつながるというふうになっているので、JTAGからのアクセスができるようになってみたいと考えている。

余談

  • ボードに載っている水晶が49.152MHz
  • 49.152MHzはBF592のPLLで8倍して393.216MHz ... スペックでは"400MHz動作"でも、実際は393.216MHz
  • どうしてそんな中途半端なのか...同じ水晶からクロック供給を受けるADAU1361はそれを1024分周して48KHzを作っているから

...なのかなぁ。