PC用DSP制御ライブラリ


概要

 パソコンからDSPボードを制御するライブラリです。 プログラムの実行、データ転送などができます。 必要な定義はdsp21k.hに書かれています。 したがって、プログラムの先頭付近に

  #include "dsp21k.h"
を書いておきます。 パソコン側プログラムでの処理の流れは、以下のようになります。
  1. dsp21k_open()でDSPボードと接続
  2. dsp21k_reset_bd()でDSPボードをリセット
  3. dsp21k_cfg_proc()でDSPを初期化
  4. dsp21k_dl_exe()でプログラムをDSPに転送
  5. dsp21k_start()DSPプログラムを実行
  6. 処理
  7. dsp21k_reset_bd()ボードをリセット (しなくても良い)
  8. dsp21k_close()終了


コンパイル方法

 ヘッダファイルはC:\DSP21K32\incにあります。 コンパイラのインクルードファイルディレクトリに C:\DSP21K32\incを加えます。 そのためには、 コンパイラへの引数に-IC:\DSP21K32\includeを追加します。 また、ライブラリはC:\DSP21K32\lib\hil32b.libです。 リンク時にライブラリを指定します。 具体的には、file.cをコンパイルするには、

  bcc32 -IC:\DSP21K32\inc file.c C:\DSP21K32\lib\hil32b.lib
を実行します。


関数の説明

DSPボードの制御

 とりあえず、「おまじない」だと思って、 上記に概要の処理を順に実行すれば良いでしょう。 dsp21k_open()の引数processor_numは DSPの番号です。 これは、複数のDSPがある場合にどのDSPを処理対象にするのかを示します。 今回はDSPが一個なので、常に0です。

/* Init processor - verify presence, initialize structure & hardware */
PDSP21K dsp21k_open(int processor_num);

/* Close board, free up any memory allocated */
int dsp21k_close(PDSP21K board);

/* reset processor */
int dsp21k_reset_bd(PDSP21K board);

/* configure processor */
int dsp21k_cfg_proc(PDSP21K board);

/* download coff file program */
int dsp21k_dl_exe(PDSP21K board, char *file);

/* start processor */
int dsp21k_start(PDSP21K board);

PC/DSP間のデータ転送

 ダウンロードはPC→DSP、アップロードはDSP→PCです。 dsp21k_start()を実行してから、 dsp21k_get_addr()で変数のアドレスを取得し、 dsp21k_{ul,dl}_type()でデータを転送します。 DSP側の変数はグローバル変数でなければなりません。 変数名nameは、DSP用プログラムの変数名を示す文字列です。 Cの場合は、変数名の前に下線「_」を付ける必要があります。 例えば、DSPのCプログラムが

  float data;
である場合には、 変数dataの値を読み出すPC側プログラムは、
  addr = dsp21k_get_addr(DSP, "_data");
  data = dsp21k_ul_flt(DSP, addr);
となります。

 SHARC Ez-Kit Liteは最大115200bpsのシリアルポート接続なので、 大量のデータを続けて転送しようとすると失敗します。 それでも、512ワードのfloatデータを毎秒1回程度読み出すことはできます。

/* get address of named variable - prog/data/dram flags will be set */
unsigned long dsp21k_get_addr(PDSP21K board, char *name);

/* upload/download int function prototypes */
int dsp21k_ul_int(PDSP21K board, unsigned long dsp_addr);
void dsp21k_dl_int(PDSP21K board, unsigned long dsp_addr, int val);
void dsp21k_ul_ints(PDSP21K board, unsigned long dsp_addr, unsigned int count, int *val);
void dsp21k_dl_ints(PDSP21K board, unsigned long dsp_addr, unsigned int count, int *val);

/* upload/download float function prototypes */
float dsp21k_ul_flt(PDSP21K board, unsigned long dsp_addr);
void dsp21k_dl_flt(PDSP21K board, unsigned long dsp_addr, float val);
void dsp21k_dl_flts(PDSP21K board, unsigned long dsp_addr, unsigned int count, float *val);
void dsp21k_ul_flts(PDSP21K board, unsigned long dsp_addr, unsigned int count, float *val);

サンプルプログラム


(作成: 2000年6月13日, 最終更新: 2000年10月31日)