i00200 のホームディレクトリの c6711dsk ディレクトリ以下に置いてある。各プログラムは、プロジェクト(コンパイル単位)ごとに別ディレクトリに分かれており、複数のファイルから構成されているので、ファイルサーバにログインして以下のコマンド例によりディレクトリごとコピーしておく。
cp -r ~i00200/c6711dsk ~/上記の例では、
N:\c6711dsk 以下にコピーされる。最初は、サンプルプログラムに手を加えずに実行し、動作確認を行う。まずDSPボードをパソコンに正しく接続し、電源も入れておくこと。
(N:\c6711dsk\through)から構成されている。多くの初期設定ファイルが含まれているが、与えられた環境で信号処理アルゴリズムのみをプログラミングする開発者は、main( )関数が含まれているthrough.cのみを編集すればよく、他のファイルの設定は必要がない限り変更しなくてよい。through.cには非常にシンプルなコードしか記述されていない。
| c6xdsk.h, c6xinterrupts.h | - | DSKおよびDSPチップ関連のヘッダファイル(TI社) |
| c6xdskinit.c, c6xdskinit.h | - | DSKのA/D・D/A変換器や通信ポートの初期化用コード |
| through.c | - | main( )関数が含まれたソースコード、利用者はこれを編集 |
| C6xdsk.cmd | - | DSKのメモリ構成の指定/Cコンパイラが生成するセクションをどの メモリ領域に置くかなどの指定がなされている設定ファイル(CCS環境での固有のファイル) |
| vectors_11.asm | - | リセットや割り込みに対応した処理を書いたアセンブリコード |
| through.pjt | - | 以上のファイル群をコンパイル・リンクする設定を記憶しているプロジェクトファイル。テキストファイルではあるが、このファイルを直接編集してはいけない。 |
図 1: CCSを起動するためのアイコン |
Project - Openをクリックし、through.pjt を開く。Project - Rebuild Allを選択し、プログラムをコンパイル・リンクする。図 2のように表示されれば、エラーなしで終了したことになる。
![]() 図 2: コンパイル・リンクの正常終了表示 |
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回割り込み処理として実行される関数である。
![]() 図 3: 開発環境の実行例 |
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 を選択する。図 4に示すように、Opt. Level(最適化レベル)がRegister(-o0) になっていることを確認しておく。(-o0)は、コンパイル時にレベル0の最適化を行うことを意味している。Fir.out をDSPボードにロードして実行する。このプログラムはフィルタ長101のFIRフィルタの実装であり、約400~800[Hz]の周波数範囲の信号のみを通過させるBPF(Bnad Pass Filter)の特性を有している。オシロスコープなどで動作確認をしておく。![]() 図 4: コンパイラ・リンカの設定画面 |
Debug - Reset CPU、File - Reload program を選択する。Profiler - Start New Session を選択する。図 5に示すように、プロファイルセッション名に FirFil と入力しOKを押す。fir.c のエディタ画面を前面に表示して、FirFil( ) の開始行にカーソルを置いておく(重要)。Create Profile Area (上から4つめ)をクリック。図 7に示したAdd Profile Area に記入し、FirFil( ) 関数を所要サイクル数の測定(プロファイリング)の対象と指定する。Debug - Run によりプログラムを実行せよ。図 8のようにサイクル数測定結果が刻々と表示される。適当なところでDebug - Halt によりプログラムを停止せよ。![]() 図 5: プロファイルセッション名の入力画面 |
![]() 図 6: Create Profile Area アイコンのクリック |
![]() 図 7: 所要サイクル数を測定する範囲の指定( fir.c の6行から18行までの範囲の関数の実行時間を測定する指定になっている) |
![]() 図 8: 所要サイクル数の測定結果 |
FirFil( ) 関数のコードサイズが160バイトであることや、10回の測定において所要サイクル数の最大値および最小値がそれぞれ4276サイクルおよび4176サイクルであること、平均所要サイクル数が4186サイクルであることを示している。最大値と最小値が異なるのは、キャッシュメモリの効果であると考えられる。1回目の実行では実行コードがキャッシュに書き込まれていないためキャッシュ・ミスを生じ所要サイクル数が多くなり、2回目以降はキャッシュにヒットするので実行時間が短くなる[4]。このプログラム例では、2回目以降の実行サイクル数は4176サイクルとなる。FirFil( )の所要サイクル数は上記の1/10~1/20倍程度にまで低減できる)。Closeをクリックしてプロファイル画面を閉じておく。Debug - Reset CPU、File - Reload program によりサイクル数測定前の状態に復帰する。![]() 図 9: プロファイル画面の終了 |
Debug-Run を選択するとCPU RUNNING と表示されるが、実際にはDSPでプログラムが実行されていないなどの挙動を示す)。CCSをいったん終了し、ボードの電源を入れ直すと回復する。#includeしているフィルタ係数ファイルbpf101.txt のインパルス応答値を用いてフィルタの振幅特性を計算し、グラフ化せよ(以前のディジタルフィルタの実験で作成したプログラムが使用できる。この計算はDSPではなく通常のコンパイラで行う)。また、DSPボードで実現したディジタルフィルタの振幅特性[dB]を測定し、同じグラフにプロットせよ。
(-o2) および (-o3) としたときのコードサイズおよび所要サイクル数を測定せよ(このDSPはVLIW型のアーキテクチャを有し演算器を複数個内蔵しているため、コンパイル時の最適化の効果が非常に大きいことを確認できる)。Comments, questions, feedback, criticisms?