libbfdspを使う

PizzaFactoryをはじめとするgcc環境でTOPPERS/JSP for Blackfinアプリケーションを開発する場合、VisualDSP++ライブラリを使うことができません。そのため、これまで信号処理ライブラリは手弁当だと思っていました。しかし、uClinux用にVisualDSP++の信号処理ルーチン群がlibbfdspとして移植されており、これがTOPPERS/JSPでも使えることがわかりました。

以下では、このライブラリをTOPPERS/JSP 1.4 for BlackfinおよびPizzaFactory 3.1.1 Express版で使う方法について説明します。

ライセンスはどうなる

最初に一番重要なことを考えておきましょう。ライセンスはどうなるのでしょうか。

結論から言えば、ライセンス条件はグレーです。libbfdsp.aのソースファイル群にはライセンスに関して次の宣言があります。

LGPLに従うとは、一言でいうと「配布されたソフトウェアのユーザーが望む場合、新しいLGPLライブラリを使ってソフトウェアをビルドできなければならない」ことを意味します。ソースを公開する場合は話は簡単です。公開しているソースでユーザーがビルドできますから。ソースを公開しない場合、LGPLライブラリとリンク可能な中間形式および必要なツールを提供する必要があります。

いっぽう、VisualDSP++のライセンスに従うということはどういう意味でしょうか。これが分からないのです。まず、ソースの中のURLは、Analog Devicesの堂々たる伝統に従い、リンク切れを起こしています。そこで、VisualDSP++ 5.0のLicensing Guideを読んでみましたが、そこにはノードロックの確認方法があるだけで、ライセンス条件はLicense Agreement.txt を見よと書いてあります。

ここまでくどくどと書いているのでもうお察しの事と思いますが、VisualDSP++ 5.0 にはLicense Agreement.txt というファイルは存在しません。ライセンス条件はmanifest.xmlというファイルの中にXML形式で収められています。やれやれ。

manifest.xmlを読む限りでは、コンパイラが生成したファイル、およびライブラリを結合したファイルの配布に関する条件は制定されていません。サンプルプログラムに関しては"serialized copy"のみ使ってよいという記述があります。つまり、お金を払って正規シリアルナンバーを入手したユーザーのみ使っていいよと言うことでしょう。

わたしはEZ-KIT Licenseなので、サンプルは使えないことになります。

それほど意外なことではありませんが、このライセンス条項はオープンソース時代のビジネスには対応していません。つまり、「uClinux for Blackfinのサイトからlibbfdsp.aのソースを持ってきてビルドしたんだけど、これで開発したわが社のアプリは(VisualDSP++を買わない限り)LGPLに従わなければならないのかね」という質問には答えてくれていません。

半導体業界での生活が長い方は、こういう問題を鼻で笑うでしょう。直感的には、ADIは、貴方がlibbfdspのソースの著作権を主張しない限り、黙って製品に使っても文句を言わないと思います。が、当然ながら趣味のサイトBlackfin空挺団にはそれを保証することはできません。筋を通したければADIに聞くのが一番です。

私はソースを公開しますので無問題です。

入手方法

libbfdspのソースは、toolchainではなく、uClinuxのディストリビューションとして配布されています。私はuClinux for blackfin processor 2007R1.1-RC3からディストリビューション全体のソースコードをダウンロードしました。233MBあります。

次に、toolchainを入手し、インストールします。私はGNU Toolchain for Blackfin processor 2007R1.1-RC3から386用のツールチェーンと、elf版アドオンをダウンロードしました。いずれもrpmパッケージですが、tar.gzでもかまわないでしょう。

rpm版の場合はLinuxディストリビューションのパッケージ管理ソフトを使ってインストールしてください。tar.gz版の場合は/optの下に展開します。詳しくはオンライン文書Installing toolchainを参考にしてください。

Pathを通したら、カーネルに構成をかけてビルドします。この辺は、Linuxのカーネル・ビルドをしたことがないと少し敷居が高いかもしれません。これもオンライン文書Compiling Kernelを参考にしてください。

余談になりますが、uClinux for Blackfin processorのオンライン文書は質・量ともになかなかのレベルだと思います。網羅的かつ丁寧なので、ひとつずつ読みながら進めばさほどの混乱は無いはずです。

カーネルビルドが終われば、カーネルのlib/libfdspサブディレクトリにlibbfdsp.aが出来上がっているはずです。このライブラリとincludeサブディレクトリが必要になります。

以上の作業がどうしても面倒と言う方は、私のサンプルプログラムからライブラリとインクルード・ファイルを抜き出すといいでしょう。ただし、最新版とは行きません。

プロジェクトへの組み込み

次に、出来上がったlibbfdspをプロジェクトに組み込みます。私はプロジェクト・ディレクトリにlibbfdspサブディレクトリを作り、そこにlibbfdsp.aをおきました。また、libbfdsp/includeサブディレクトリには、libbfdsp.aを使うのに必要なインクルードファイルを置いています。

以下の説明はこの構成を前提にしています。

インクルード・ファイルへのパスを通す

最初にサブディレクトリのインクルードファイルへパスを通します。PizzaFactoryは、単にサブディレクトリを作っただけではインクルード・パスとして認識しません。

インクルード・パスを通すには、プロジェクトのPropertiesを開き、C/C++ BuildTool Settingsタブ ⇒ GCC C CompilerDirectories を選び、追加アイコンをクリックします。ダイアログが現れますので、そこに追加するパスを書いてください。ダイアログのWorkspace...ボタンやFile system...ボタンを使うといいでしょう。

以上でパスが通りますが、実は2008年1月初頭現在、この作業は正しくビルドに反映されません。MLによればこれは制限事項として知られているそうで、将来的には修正されるとのことです。仕方が無いので、現在は次の方法でインクルード・パスを追加します。

プロジェクト・ディレクトリの mkefile.initを開きます。そして「共通コンパイルオプションの定義」を探します。その中に次のようなインクルード・パスの宣言があります。

INCLUDES := -I. -I$(SRCDIR)/include $(INCLUDES) -I.. 

これに希望するインクルード・パスを次のように追加します。

INCLUDES := -I. -I$(SRCDIR)/include $(INCLUDES) -I.. -I../bfdsp/include

パスの基点がプロジェクトディレクトリではなく、一段低いことに気をつけてください。おそらく、オブジェクトを生成するサブディレクトリが基点です。

ライブラリへのパスを通す

ライブラリのパスも同様に設定します。

ライブラリ・パスを通すには、プロジェクトのPropertiesを開き、C/C++ BuildTool Settingsタブ ⇒ GCC LinkerLibraries を選び、Library Search Pathの追加アイコンをクリックします(ライブラリの登録と間違えないように注意する)。ダイアログが現れますので、そこに追加するパスを書いてください。ダイアログのWorkspace...ボタンやFile system...ボタンを使うといいでしょう。

残念ながらこの設定もビルドに反映されませんので、やはりmakefile.initを編集することになります。編集箇所は先と同様「共通コンパイルオプションの定義」です。その中に次のようなライブラリ・パスの宣言があります。

LDFLAGS := -nostdlib $(LDFLAGS) 

これに希望するインクルード・パスを次のように追加します。

LDFLAGS := -nostdlib $(LDFLAGS) -L../bfdsp

この場合も、パスの基点はプロジェクト・ディレクトリより一段低くなっています。

ライブラリを使うよう宣言する

インクルード・パスとライブラリ・パスを設定しましたので、最後にライブラリを使うよう登録します。

この設定はGUIだけで済ますことができます。

ライブラリを登録するは、プロジェクトのPropertiesを開き、C/C++ BuildTool Settingsタブ ⇒ GCC LinkerLibraries を選び、Librariesの追加アイコンをクリックします(パスの設定と間違えないように注意する)。ダイアログが現れますので、そこに追加するパスを書いてください。

追加するライブラリの名前は"bfdsp"です。"libbfdsp"ではありません。理由は知りません。gnu リンカのお約束だそうです。

使用例

ライブラリとインクルード・ファイルの設定が終わったら、あとはアプリケーションから使うだけです。今回は小手調べとしてfir_fr16()関数を使ったフィルタ・アプリケーションを組んでみました。

このプログラムはtalkthroughを基にしており、片チャンネルだけを3.0kHzに帯域制限しています。フィルタの設計にはscilabを使いました。詳しくはzipファイル内部のhtmlサブディレクトリを参照してください。

fir_fr16()関数についてはVisualDSP++のソフトウェア・マニュアルを参照してください。

以下のサンプル・プログラムはPizzaFacotry 3.1.1 Expressでビルドし、VisualDSP++ 5.0 でEZ-KIT BF533にダウンロードして動作を確かめました。

ダウンロード bf-firtest.zip (184kB)

Blackfin空挺団 | プログラム | EZ-KIT | コア&ペリフェラル | TOPPERS/JSP | こぼれ話 | DSP掲示板