bfin-elf-gcc

TOPPERS/JSPをgnu環境でビルドするには、Blackfin用のgccをelf用にビルドしたbfin-elf-gccを用います。以下では、特に断らない限りbfin-elf-gcc 3.4.1についてVisualDSP++ 4.5のコンパイラとの差異を説明します。

環境の識別

コンパイル環境はあらかじめ宣言されているマクロの有無によって容易に知ることができます。

__GNUC__
このマクロが宣言されているならば、コンパイラはgcc。
__ECC__
このマクロが宣言されているならば、コンパイラはVisualDSP++のコンパイラ。

TOPPERS/JSP for Blackfinでは、どちらも宣言されていない場合にエラーメッセージを表示するようにしています。

インライン・アセンブラ

インライン・アセンブラの呼び出し方法はVisualDSP++とgnuの間で異なります。

__asm__
gccはインライン・アセンブラの呼び出しを__asm__()によって行う。
asm
VisualDSP++のCコンパイラはインライン・アセンブラの呼び出しをasm()によって行う。

さて、両者のインライン・アセンブラの使い方はおおむね同じです。これはVisualDSP++のCコンパイラがgccをお手本にしたためです。しかしながらrestictionの指定方法が異なりますので注意が必要です。

restrictionは、インライン・アセンブラにパラメータがどのようなレジスタであるべきかを指定する文字列です。この文字列はVisualDSP++のコンパイラととgccの間で異なりますので、気をつけてください。

また、gccのrestictionにはレジスタ・ハーフを指定する方法が用意されていません。

インライン関数

bfin-elf-gccでは、.hファイルの中でinline定義した関数はstatic修飾を行う必要があります。そうしなければ複数のファイルからインクルードした場合に名前の衝突が起きます。VisualDSP++ 4.5のCコンパイラにはこの制限はありません。

inline int foo(void);        // 複数のファイルからインクルードして使うとエラーが起きる
static inline int bar(void); // 複数のファイルからインクルードして使っても大丈夫
Blackfin空挺団 | プログラム | EZ-KIT | コア&ペリフェラル | TOPPERS/JSP | こぼれ話 | DSP掲示板