2015年10月16日金曜日

PSoC 4 Pioneer Kitでリズムマシンのプログラムの処理時間を計測

Visual C++で作ったリズムマシンのプログラムをPSoC 4 Pioneer Kitに移植して処理時間を計測してみた。

PSoC Creatorのトップデザイン


時間の計測には16bitタイマー(TCPWMコンポーネント)を使って処理の開始時と終了時にCounter値を取得して調べた。

取得値はUARTを使ってPCで表示。

SPI通信自体は行っていない。

PSoC Creatorのプロジェクト
https://github.com/ryood/RhythmMachine/tree/master/PSoC/PSoC_Fixedpoint_DDS_RhythmMachine

48000回ループさせて、サンプリング周波数48kHzでちょうど1秒の間にどれだけ実行時間を消費するか見てみた。

変更点 start end end - start 処理時間(s) 比率
初期 2 7792 7790 0.779 100.0%
generateDDSWaveをinlineに 2 7432 7430 0.743 95.4%
generateNoiseをinlineに 2 7245 7243 0.7243 93.0%
hihatの波形生成をDDSに 2 6282 6280 0.628 80.6%
シーケンスを見て処理を省略 2 3967 3965 0.3965 50.9%
Releseモードでコンパイル 2 3322 3320 0.332 42.6%

表は上から順に追加変更していったものだ。

比率(初期プログラムに対する短縮率)を見ると、「シーケンスを見て処理を省略」するとかなり速くなっている。シーケンスが0(音符で言う休符)のとき、処理を省略するというもので、かなり早くなるが、音数が増えると処理落ちする可能性がある。

「hihatの波形生成をDDSに」も結構効いている。Hihatの波形をrand()関数で作っているのをテーブル参照にした。rand関数ですらコストが高いらしい。

inline指定やコンパイルオプションの変更は多少効く感じだ。

SPI通信との兼ね合い

波形生成とSPI通信と順番に処理するとかなりカツカツっぽい。

PSoC 4 Pioneer KitでMCP4922を使う DDSで波形生成」で調べたSPI通信のタイミング


ざっくり見てサンプリング区間の50%以下で波形生成の処理を終わらせないとだめっぽい?入出力系のI2C通信の時間もあるので。

PSoC 4のSPIにはSCB(Serial Communication Block)以外にもUDB(内蔵のCPLDみたいなもの)を使ったコンポーネントもあるようなので、これもテストしてみたいと思います。