DMPG1( DAG Memory Page )はDAG1が生成するアドレスのページ(上位8ビット)部分として使います。下位24ビットはDAG1が計算して生成します。
DMPG2( DAG Memory Page )はDAG2が生成するアドレスのページ(上位8ビット)部分として使います。下位24ビットはDAG2が計算して生成します。
この二本を高級言語から直接扱うことはありません。
DMPGxは8ビット長です。DMPGと16ビットレジスタとの間でデータをやり取りする場合は右詰で転送し、上位は0フィル扱いになります。
図1 レジスタの構造
この二本のレジスタの初期値は0です。このレジスタには構造はありません。
C/C++言語用に以下のインターフェースが用意されています。宣言はsysreg.hで行われています。
// 推奨しないAPI // #include <sysreg.h> sysreg_write(sysreg_DMPG1, 値) // 値をDMPG1に代入します 変数 = sysreg_read(sysreg_DMPG1) // DMPG1の値を取得します sysreg_write(sysreg_DMPG2, 値) // 値をDMPG2に代入します 変数 = sysreg_read(sysreg_DMPG2) // DMPG2の値を取得します
ただし、上のインターフェースは使わないほうがいいでしょう。この二本はコンパイラのメモリーアクセスに強い影響を与えます。特にDMPG1は専用レジスタとして予約されていることを考えると、割り込み処理などに深刻な影響を与える可能性があります。
VisualDSP++3.0はC/C++言語から64KWより上のメモリー空間にアクセスするために次のAPIを用意しています。通常はこちらの関数を使えば用は足りるはずです。どちらの関数も第一引数はメモリーのページを、第二引数はページ内部のオフセットを与えます。書き込み関数の第三引数は書き込む値を与えます。
// #include <sysreg.h> int external_memory_read( int page, void * address ) // 読み取り関数 void external_memory_write( int page, void * address, int value ) // 書き込み関数
DMPGxのレイテンシは以下のとおりです。
命令 | DMPG=value/reg; | |
---|---|---|
レイテンシ | 2 |
レイテンシが1のとき、直後の命令からその値を利用することができます。レイテンシが2以上のとき、直後の命令でその値を参照しようとすると、インターロック機構によって1サイクルのストールが発生します。なお、この表のレイテンシの数え方はHRとは異なっています。
項目 | マニュアルのページ等 |
---|---|
解説 | HR 4-6 |
レイテンシ | HR 3-6 |