DMAによる可変長ブロック転送

DMAによるデータ通信は、固定長で行うのが基本です。が、可変長によるDMA通信を行いたいことだってあります。以下のエントリーはfenrirさんによるものですが、ベースには可変長DMA転送を行いたいという動機があります。

CPU割込みによって頭だしが行えたらCPU割込みを停止、EDMAを起動して1フレーム分溜まるまでEDMAを動作、EDMAによる1フレーム受信完了後、EDMA終了割込みによってCPU割込みを復活という動作によって解決を図りました。図で示すと、以下のような動作になっています。

Blackfinの場合、SPIは送信か受信の片方にしかDMAを使わないという、必要以上にサディスティックな設計になっており、設計者にはある種の緊縛嗜好があったのではないかと疑うに十分です。
さて、Fenrirさんの例に限らず可変長転送の要求はあるのですが、その場合「本当に可変長は必要なのか」と問い直すのも手です。たいていの場合その返答はYesなのですが、「最大パケット長で常に転送したらどうだ」というと、結構考え込む人もいます。最大転送長といっても、16byteブロックくらいにしておいてそれ以上は分割する方法だってあります。DMAを使うとパケット長にかかわらずCPUの手間は割り込み当たり一回です。だからDMAを使うのです。だったら、毎回長く送っても困りません。問題はHostの負荷ですが、それはホスト次第としか。
SYNCに関しては一定時間ごとにWatch Dogパケットを送るようにすれば、不測の事態からの回復もそれほど困難ではなくなります。