Connexions

You are here: Home » Content » Sample program and assignments - C6711DSK(INCT)
Content Actions

Sample program and assignments - C6711DSK(INCT)

Module by: Yoji Yamada

 サンプルプログラムがユーザ i00200 のホームディレクトリの c6711dsk ディレクトリ以下に置いてある。各プログラムは、プロジェクト(コンパイル単位)ごとに別ディレクトリに分かれており、複数のファイルから構成されているので、ファイルサーバにログインして以下のコマンド例によりディレクトリごとコピーしておく。
	cp  -r   ~i00200/c6711dsk   ~/
上記の例では、N:\c6711dsk 以下にコピーされる。最初は、サンプルプログラムに手を加えずに実行し、動作確認を行う。まずDSPボードをパソコンに正しく接続し、電源も入れておくこと。

スルー入出力プログラム

 DSPボードを動作させるプログラムとして、最もシンプルなプログラムである[3]。入力信号をサンプリング(A/D変換)し、何も処理をしないでそのまま出力する(D/A変換)プログラムである。DSPボードの入力端子に発振器からの信号を加えてプログラムを動作させれば、出力端子に入力信号がそのまま出力される。A/D・D/A変換に伴う処理遅延があるので、出力信号は入力より遅れて出力される(入出力間に位相差がある)。
 このサンプルプログラムをコンパイル・リンク・ロード・実行する手順を以下に示す。
(1)ファイル構成の確認  このサンプルプログラムは、以下のファイル群(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 -  以上のファイル群をコンパイル・リンクする設定を記憶しているプロジェクトファイル。テキストファイルではあるが、このファイルを直接編集してはいけない。
(2)開発環境(CCS)の起動  念のため、DSKの電源を入れなおしボードをリセットする。初期テストプログラムが自動的に実行される(約15秒程度かかる)。 デスクトップの「I科」フォルダの中にある 1のアイコンをダブルクリックして開発環境を起動する。
図 1: CCSを起動するためのアイコン
(3)プロジェクトファイルのロード Project - Openをクリックし、through.pjt を開く。
(4)コンパイル・リンク Project - Rebuild Allを選択し、プログラムをコンパイル・リンクする。 2のように表示されれば、エラーなしで終了したことになる。
図 2: コンパイル・リンクの正常終了表示
(5)プログラムのロード File - Load Programthrough.outをDSPボードにロードする。
(6)実行 Debug - Runでプログラムを実行する。DSPボードの入力に発振器を接続し、1[kHz] 0.5[V]程度の正弦波信号を入力すれば、出力信号をオシロスコープで観測できる。
注意: このDSPボードの出力には、1[V]程度の大きな直流オフセット電圧がある(ボード上のコンデンサの極性間違い)。オシロスコープはAC結合としたほうがよい。なお、この直流オフセットは出力端子と並列に10[kΩ]程度の抵抗を接続すると100[mV]オーダの値まで小さくなる。
(7)終了 Debug - HaltでDSPでのプログラム実行を停止できる。プログラム停止状態でProject - Closeを選択すれば、プロジェクトファイルを閉じることができる(必要に応じプロジェクトを保存しておくこと)。この状態になれば、開発環境CCSを終了してもよい。

スループログラムでの課題

  1. スループログラム動作時の振幅特性を測定し、グラフにまとめよ。(横軸:周波数、縦軸:[dB])
  2. 周波数1[kHz]における無歪最大出力電圧を測定せよ。
  3. through.cを変更し、入力電圧が約0.5倍されて出力されるようにせよ。また、動作確認を行うこと。
  3に課題実行時の開発環境画面例を示す。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を乗ずるのではなくビットシフトするという方法も考えられる。こちらのほうが効率はよい。
  • プログラムを修正した場合、コンパイル・リンク・ロードを再度行う必要がある。

FIRフィルタプログラム

 サンプルコードは、N:\c6711\fir_float にコピーされている。このプログラムは、32bit浮動小数点演算によりFIR(Finite Impulse Response)フィルタ処理を行うサンプルプログラムである。 以下の手順を参考に、さきほどと同じくこのプログラムを実行せよ。
  1. プロジェクトファイル Fir.pjt を開く
  2. Project - Build Options を選択する。 4に示すように、Opt. Level(最適化レベル)がRegister(-o0) になっていることを確認しておく。(-o0)は、コンパイル時にレベル0の最適化を行うことを意味している。
  3. プログラムをコンパイル・リンクし、Fir.out をDSPボードにロードして実行する。このプログラムはフィルタ長101のFIRフィルタの実装であり、約400~800[Hz]の周波数範囲の信号のみを通過させるBPF(Bnad Pass Filter)の特性を有している。オシロスコープなどで動作確認をしておく。
図 4: コンパイラ・リンカの設定画面

FIRフィルタプログラムでの所要サイクル数の測定

 DSPプログラムでは、演算処理に必要なサイクル数(クロック数)が重要である。所要サイクル数が少なければ、より複雑な処理を実装してシステム全体の性能上昇を図ったり、より省電力な動作モードを選択したりする余地が生まれてくることになるからである。FirFil( )関数の所要サイクル数の測定(プロファイリング)を行う手順を以下に示す。
  1. Debug - Reset CPUFile - Reload program を選択する。
  2. Profiler - Start New Session を選択する。 5に示すように、プロファイルセッション名に FirFil と入力しOKを押す。
  3. fir.c のエディタ画面を前面に表示して、FirFil( ) の開始行にカーソルを置いておく(重要)。
  4. 6に示すアイコン Create Profile Area (上から4つめ)をクリック。 7に示したAdd Profile Area に記入し、FirFil( ) 関数を所要サイクル数の測定(プロファイリング)の対象と指定する。
  5. Debug - Run によりプログラムを実行せよ。 8のようにサイクル数測定結果が刻々と表示される。適当なところでDebug - Halt によりプログラムを停止せよ。
図 5: プロファイルセッション名の入力画面
図 6: Create Profile Area アイコンのクリック
図 7: 所要サイクル数を測定する範囲の指定(fir.c の6行から18行までの範囲の関数の実行時間を測定する指定になっている)
図 8: 所要サイクル数の測定結果
  8の結果は、FirFil( ) 関数のコードサイズが160バイトであることや、10回の測定において所要サイクル数の最大値および最小値がそれぞれ4276サイクルおよび4176サイクルであること、平均所要サイクル数が4186サイクルであることを示している。最大値と最小値が異なるのは、キャッシュメモリの効果であると考えられる。1回目の実行では実行コードがキャッシュに書き込まれていないためキャッシュ・ミスを生じ所要サイクル数が多くなり、2回目以降はキャッシュにヒットするので実行時間が短くなる[4]。このプログラム例では、2回目以降の実行サイクル数は4176サイクルとなる。
 以上の結果から、FIRフィルタ処理に要した処理時間を求めておく。DSPコアのクロック周波数150[MHz]より、101タップFIRフィルタ処理に要した処理時間は次式となる。
4726 150× 10 6 = 28.5× 10 -6 = 28.5 [μs] 4726 150 × 10 6 = 28.5 × 10 -6 = 28.5 [μs] (1)
1サンプリング周期125[μs]( =8[kHz]の逆数) よりも処理時間が短いので、リアルタイム処理が充分に可能であることがわかる(後の課題で実行するように、最適化レベルの変更やプログラムの改善により、FirFil( )の所要サイクル数は上記の1/10~1/20倍程度にまで低減できる)。
 所要サイクル数の測定中(プロファイリング作業中)には、原則としてDSPでの実時間処理ができない。サイクル数測定が終了したら、図9に示すように右クリックしてコンテキストメニューを表示し、Closeをクリックしてプロファイル画面を閉じておく。Debug - Reset CPUFile - Reload program によりサイクル数測定前の状態に復帰する。
図 9: プロファイル画面の終了
注意: サイクル数を測定後、DSPボードが制御できなくなることがある(CCS上でDebug-Run を選択するとCPU RUNNING と表示されるが、実際にはDSPでプログラムが実行されていないなどの挙動を示す)。CCSをいったん終了し、ボードの電源を入れ直すと回復する。

FIRフィルタのサンプルプログラムでの課題

(1)フィルタの振幅特性の計算と測定  プログラムで#includeしているフィルタ係数ファイルbpf101.txt のインパルス応答値を用いてフィルタの振幅特性を計算し、グラフ化せよ(以前のディジタルフィルタの実験で作成したプログラムが使用できる。この計算はDSPではなく通常のコンパイラで行う)。また、DSPボードで実現したディジタルフィルタの振幅特性[dB]を測定し、同じグラフにプロットせよ。
(2)最適化レベルと所要サイクル数の変化の測定  コンパイル時の最適化レベルを (-o2) および (-o3) としたときのコードサイズおよび所要サイクル数を測定せよ(このDSPはVLIW型のアーキテクチャを有し演算器を複数個内蔵しているため、コンパイル時の最適化の効果が非常に大きいことを確認できる)。
(3)リアルタイム処理可能な最大フィルタ長の確認  FIRフィルタをディジタルフィルタ設計プログラム集DF-Design[5]などで設計し、リアルタイム処理が可能な最大フィルタ長の確認を行え。また、所要サイクル数が大きすぎてリアルタイム処理が維持できない状態での出力信号波形を観測・記録せよ。

Comments, questions, feedback, criticisms?

Discussion forum

Send feedback