__cplb_ctrl

CPLBはキャッシュを使う場合には無視して通れない仕組みです。このテーブルはメモリー領域ごとにキャッシュ可能性と保護属性を宣言しますのでCPLBを使わなければ全領域がキャッシュ不能になってしまいます。一方で信号処理とかアプリケーションにまったく関係ない設定ビットをいじるのはまったくうんざりします。

これを少し楽にするため、VisualDSP++には __cplb_ctrl*1変数が用意されています。この変数は初期値のみが意味を持つ特殊な変数で、デフォルトでは0の初期値を持ちます。ユーザープログラムが__cplb_ctrlを再宣言すると、リンカーはデフォルトの__cplb_ctrlを捨ててユーザー定義の__cplb_ctrlを使用します。

__cplb_ctrlは初期値のみが意味を持ちます。ユーザーが次のように宣言したとします。

#include <cplb.h>
int __cplb_ctrl = // VisualDSP++のヘルプから引用
    CPLB_ENABLE_ICPLBS | 
    CPLB_ENABLE_ICACHE;

そうすると、システムの初期化関数はこの変数の初期値を参照してCPLBを設定します。この後実行中に値を変更しても何の意味もありません。変数の初期値には以下の値を使用できます。これらはビットマスクなので、ビットORによって複数を初期値として使用できます。

CPLB_ENABLE_ICPLBS
ICPLBを有効にする
CPLB_ENABLE_ICACHE
L1命令SRAMをキャッシュにする
CPLB_ENABLE_DCPLBS
DCPLBを有効にする
CPLB_ENABLE_DCACHE
L1データSRAMのバンクAをキャッシュにする
CPLB_ENABLE_DCACHE2
L1データSRAMのバンクBをキャッシュにする

見てわかるとおり、キャッシュとして使用することは指定できますが、どの領域をキャッシュにするかは指定できません。そこでこれらを解決する仕掛けが用意されています。

VisualDSP++ランタイムはCPLBの初期値を_dcplbs_tableおよび、_icplbs_tableの二つの大域変数から取り出します。この変数はVisualDSP++のコンパイル済みオブジェクトとして提供されており、LDFの中で明示的にファイル名が指定されています。ADSP-BF533の場合、オブジェクト・ファイルはcplbtab533.dojです。

独自のCPLBを構築するには、このdojファイルを自分で作り直す必要があります。その手順は以下のとおりです。

  1. インストール・ディレクトリの下の blackfin\lib\src\libc\crt\cplbtab533.s をコピーしてプロジェクト・ファイルにコピーする
  2. cplbtab533.sを編集する
  3. 編集したcplbtab533.sをプロジェクトに追加する
  4. LDFを開き、$OBJECTS変数から cplbtab533.doj を削除する

これによって独自のCPLBをADSP-BF533に登録することができます。

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