McBSP

McBSP(Multichannel*1 Buffered Serial Port)について。


McBSPはビットクロック信号, フレーム同期信号, データ信号を持った、よくできた普通の同期式シリアルポートですので、さして困る事はありません。ただしMcBSPが持つ大きめのFIFOバッファは曲者です。

このFIFOバッファはかなり大きく(512byte〜5Kbyte)、かつ無効にできません。

FIFOバッファのメリットとデメリット

FIFOバッファにはメリットとデメリットがあります。

メリット:

  • 消費電力を低減できる。
  • データの取りこぼしの可能性がグンと減る。

デメリット:

  • FIFOバッファの分だけデータ送信に遅延が発生する。

これぞれについて詳しくお話しします。

FIFOバッファで消費電力を低減できる

FIFOバッファがなければMcBSPはデータを一つずつ転送する事になります。McBSPへパラレルデータを送受信する方法がDMA or CPU転送のいずれであっても、データを一つ転送する毎にDMAまたはCPUを起床させることになります。
これに対して、FIFOバッファがある場合まとめてデータを転送することができます。例えば256個のデータをまとめて送る場合、データを256個転送する毎にDMAまたはCPUを起床することになります。

DMAまたはCPUは大きな電力ドメイン*2に含まれています。これを転送のために起床すると、該当する電力ドメイン全体をretention→activeに遷移させ、転送を実行させ、電力ドメインを再びactive→retentionへ遷移させる、という動きをします。つまり、起床すると電力ドメイン全体が電力を消費することになるので、起床する毎に大きな電力を消費することになります。

まとめて転送する方がDMAまたはCPUを起床させる回数が少ないので、消費電力をかなり低減できる

データの取りこぼしの可能性が減る

理由は二つあります。

一つは昔からある話で、

バスが混んでいてもFIFOバッファの分だけ緩衝することができるので、取りこぼしの可能性が減る。

もう一つは消費電力低減がらみの新しい話です。
先ほど転送のためにDMAまたはCPUを起床すると、電力ドメイン全体をretention⇔activeに遷移させる事になると言いました。
retentionはデータを保持することを目的とする消費電力を抑えた状態ですから、retentionへ/からの両方の遷移に時間がかかります。

シリアル転送レートによっては、頻繁に起床させると遷移が転送に間に合わずデータを取りこぼす可能性もある。

FIFOバッファがあると、起床させた時にまとめてたくさん転送させることで、起床回数を減らす事ができ、つまりデータを取りこぼす可能性が減ります。

FIFOの分だけデータ送信に遅延が発生する。

McBSPの送信側の話です。

データがFIFOバッファを介すということは、該当データがFIFOバッファ内にある時間がそのまま遅延になります。


音楽再生のように時間の制約が緩い場合は特に気にしなくても構いませんが、音声通話など遅延が品質に直結する場合はこの時間が問題になります。

FIFOバッファは無効にできないので、ファームの設計でFIFOバッファを満杯にしないようにして対応します。この場合、FIFOスレショールド*3の設定に依存してDMAリクエストがアサートされっ放しの期間ができます。DMAリクエストがアサートされている間はDMAを含む電力ドメインがactive状態のままになるので、消費電力に気をつける必要があります。

ぶっちゃけ、あちらを立てればこちらが立たずという状態です。逆に言うとプログラマの腕の見せ所とも言えます。

粘り強く、消費電力と遅延の両方で満足いく結果を残せるように、設計を調整していきました。


LSIチップの設計屋さん、こういう話もあるので、設計する際はご考慮ください。DMAが属する電力ドメインは独立させるとかできますよね。

*1:Multichannelな使い方はしたことがありません。

*2:Power Domain

*3:FIFOスレショールドについてはそのうちお話しするかも知れません