<< Chapter < Page | Chapter >> Page > |
サンプルプログラムがユーザ
i00200
のホームディレクトリの
c6711dsk
ディレクトリ以下に置いてある。各プログラムは、プロジェクト(コンパイル単位)ごとに別ディレクトリに分かれており、複数のファイルから構成されているので、ファイルサーバにログインして以下のコマンド例によりディレクトリごとコピーしておく。
cp -r ~i00200/c6711dsk ~/
上記の例では、
N:\c6711dsk
以下にコピーされる。最初は、サンプルプログラムに手を加えずに実行し、動作確認を行う。
まずDSPボードをパソコンに正しく接続し、電源も入れておくこと。
DSPボードを動作させるプログラムとして、最もシンプルなプログラムである[3]。入力信号をサンプリング(A/D変換)し、何も処理をしないでそのまま出力する(D/A変換)プログラムである。DSPボードの入力端子に発振器からの信号を加えてプログラムを動作させれば、出力端子に入力信号がそのまま出力される。A/D・D/A変換に伴う処理遅延があるので、出力信号は入力より遅れて出力される(入出力間に位相差がある)。
このサンプルプログラムをコンパイル・リンク・ロード・実行する手順を以下に示す。
(N:\c6711dsk\through)
から構成されている。多くの初期設定ファイルが含まれているが、与えられた環境で信号処理アルゴリズムのみをプログラミングする開発者は、
main( )
関数が含まれている
through.c
のみを編集すればよく、他のファイルの設定は必要がない限り変更しなくてよい。
through.c
には非常にシンプルなコードしか記述されていない。
Project - Open
をクリックし、
through.pjt
を開く。
Project - Rebuild All
を選択し、プログラムをコンパイル・リンクする。
のように表示されれば、エラーなしで終了したことになる。
File - Load Program
で
through.out
をDSPボードにロードする。
Debug - Run
でプログラムを実行する。DSPボードの入力に発振器を接続し、1[kHz] 0.5[V]程度の正弦波信号を入力すれば、出力信号をオシロスコープで観測できる。
Debug - Halt
でDSPでのプログラム実行を停止できる。プログラム停止状態で
Project - Close
を選択すれば、プロジェクトファイルを閉じることができる(必要に応じプロジェクトを保存しておくこと)。この状態になれば、開発環境CCSを終了してもよい。
through.c
を変更し、入力電圧が約0.5倍されて出力されるようにせよ。また、動作確認を行うこと。
に課題実行時の開発環境画面例を示す。
through.c
の中の
c_int11( )
関数を変更すれば、上記 3.を実現できる。
c_int11( )
は1サンプリング周期に1回割り込み処理として実行される関数である。
c_int11( )
関数の内部では、
input_sample( )
関数の戻り値を代入している変数
sample_data
に16bitのデータとしてA/D変換されたサンプル値が格納されている。元のサンプルプログラムでは、
sample_data
に格納されたデータをそのまま
output_sampe( )
関数に渡すことでスルー入出力処理を実現している。したがって、
sample_data
の値を0.5倍してから
output_sample( )
に渡すように変更すれば、上記の3.を実現できる。ただし、データの型変換やキャストを厳密に明示してコードを書かないと、意図した通りにプログラムが動作しない場合がある。
short
に 0.5 を乗ずると、実数型データになる。short
に変換すること。short
型データを2分の1倍にするには、0.5を乗ずるのではなくビットシフトするという方法も考えられる。こちらのほうが効率はよい。 サンプルコードは、
N:\c6711\fir_float
にコピーされている。このプログラムは、32bit浮動小数点演算によりFIR(Finite Impulse Response)フィルタ処理を行うサンプルプログラムである。
以下の手順を参考に、さきほどと同じくこのプログラムを実行せよ。
Fir.pjt
を開くProject - Build Options
を選択する。
に示すように、
Opt. Level
(最適化レベル)が
Register(-o0)
になっていることを確認しておく。
(-o0)
は、コンパイル時にレベル0の最適化を行うことを意味している。Fir.out
をDSPボードにロードして実行する。このプログラムはフィルタ長101のFIRフィルタの実装であり、約400~800[Hz]の周波数範囲の信号のみを通過させるBPF(Bnad Pass Filter)の特性を有している。オシロスコープなどで動作確認をしておく。DSPプログラムでは、演算処理に必要なサイクル数(クロック数)が重要である。所要サイクル数が少なければ、より複雑な処理を実装してシステム全体の性能上昇を図ったり、より省電力な動作モードを選択したりする余地が生まれてくることになるからである。FirFil( )関数の所要サイクル数の測定(プロファイリング)を行う手順を以下に示す。
Debug - Reset CPU
、
File - Reload program
を選択する。Profiler - Start New Session
を選択する。
に示すように、プロファイルセッション名に
FirFil
と入力しOKを押す。fir.c
のエディタ画面を前面に表示して、
FirFil( )
の開始行にカーソルを置いておく(重要)。Create Profile Area
(上から4つめ)をクリック。
に示した
Add Profile Area
に記入し、
FirFil( )
関数を所要サイクル数の測定(プロファイリング)の対象と指定する。Debug - Run
によりプログラムを実行せよ。
のようにサイクル数測定結果が刻々と表示される。適当なところで
Debug - Halt
によりプログラムを停止せよ。
の結果は、
FirFil( )
関数のコードサイズが160バイトであることや、10回の測定において所要サイクル数の最大値および最小値がそれぞれ4276サイクルおよび4176サイクルであること、平均所要サイクル数が4186サイクルであることを示している。最大値と最小値が異なるのは、キャッシュメモリの効果であると考えられる。1回目の実行では実行コードがキャッシュに書き込まれていないためキャッシュ・ミスを生じ所要サイクル数が多くなり、2回目以降はキャッシュにヒットするので実行時間が短くなる[4]。このプログラム例では、2回目以降の実行サイクル数は4176サイクルとなる。
以上の結果から、FIRフィルタ処理に要した処理時間を求めておく。DSPコアのクロック周波数150[MHz]より、101タップFIRフィルタ処理に要した処理時間は次式となる。
1サンプリング周期125[μs]( =8[kHz]の逆数) よりも処理時間が短いので、リアルタイム処理が充分に可能であることがわかる(後の課題で実行するように、最適化レベルの変更やプログラムの改善により、
FirFil( )
の所要サイクル数は上記の1/10~1/20倍程度にまで低減できる)。
所要サイクル数の測定中(プロファイリング作業中)には、原則としてDSPでの実時間処理ができない。サイクル数測定が終了したら、図9に示すように右クリックしてコンテキストメニューを表示し、
Close
をクリックしてプロファイル画面を閉じておく。
Debug - Reset CPU
、
File - Reload program
によりサイクル数測定前の状態に復帰する。
Debug-Run
を選択すると
CPU RUNNING
と表示されるが、実際にはDSPでプログラムが実行されていないなどの挙動を示す)。CCSをいったん終了し、ボードの電源を入れ直すと回復する。
#include
しているフィルタ係数ファイル
bpf101.txt
のインパルス応答値を用いてフィルタの振幅特性を計算し、グラフ化せよ(以前のディジタルフィルタの実験で作成したプログラムが使用できる。この計算はDSPではなく通常のコンパイラで行う)。また、DSPボードで実現したディジタルフィルタの振幅特性[dB]を測定し、同じグラフにプロットせよ。
(-o2)
および
(-o3)
としたときのコードサイズおよび所要サイクル数を測定せよ(このDSPはVLIW型のアーキテクチャを有し演算器を複数個内蔵しているため、コンパイル時の最適化の効果が非常に大きいことを確認できる)。
Notification Switch
Would you like to follow the 'Dsp laboratory with ti c6711dsk (inct - japanese)' conversation and receive update notifications?