間が空いてしまいましたが、その間えらくしつこいバグに手間取っていました。
割り込みの発生レートがどうしても期待通りにならなかったのですが、何のことはない、仕様の読み違いでした。SPORTの各種クロックは全てFPGAから供給されるのですが、例外として送信フレーム同期信号のみはADSP-BF533から供給しなければなりません。それが何を勘違いしたのか、これも外部供給としたのだから動くはずがありませんでした。それにしても、オシロでは確かにクロックが出ていたのですが、あれは何だったのやら。
さて、送受信のレートが一致してジッタ・バッファからのエラーも消えました。ということで、懸案だったDSPの負荷率を早速実装しました。
実装方法は割と簡単です。
TOPPERS/JSP for Blackfinは割り込み待ちの時に、割り込み禁止にしてからidle命令を実行してアイドル状態に入ります。アイドル状態では割り込みから生成されるwakeイベントを待っており、検出と同時に割り込みから抜けます。そして再び割り込み可能にすることでwakeを作った割り込み要求の処理を行います。
この性質から、idle命令の開始と終了の時刻を記録して引き算すればアイドル時間が分かります。単位時間当たりの累積アイドル時間を調べてやればアイドル率が分かります。これを1から引けばDSPの負荷率となります。
現状で負荷率は12%でした。
今回のフレームワークはDMAこそ使っていますが、取り扱うデータの性質から事実上1サンプル毎に関数が呼ばれる余り効率的では無い構成になっています。そのため、負荷が高いのでは無いかと心配していましたが、このくらいなら問題ありませんので胸をなで下ろしています。今後、ブロック浮動小数点フォーマットとの間のフォーマット変換、CPUからのコマンドの解析と記録を実装しなければなりませんが、たいしたことはありません。
ということで、再び先に進んでいます。