stm32のEthernet MAC 続き
引き続きstm32f407のEthernet MACをいじる。
送受信バッファを管理するディスクリプタつれづれ。
一つのバッファに一つのディスクリプタ、ってのは分かりやすいんだけど、
なぜか、stm32では、一つのディスクリプタに2つのバッファが
設定できるようになっている。
2つの別々のメモリブロックを繋げて、一つの送受信バッファ
として使えるみたいだ。
? こんなものなにに使うんだろうな、と思っていたのだけれど、
ようやく使い道に気が付いた。
一つ目のバッファに、各種IP関連のヘッダを持たせ、続く2つ目の
バッファにはデータ本体を置く。
IPのヘッダは長さが多少違うものもあるけど、バッファの長さも
ディスクリプタの設定で動的に変えられるので問題ない。
キモは、データ本体だけを別の所に置けるってところだ。
データ本体部分だけを別の所に、複数ディスクリプタ分
きっちり並べて、DMAを使って一気に転送することができそうだ。
しかもヘッダ側のバッファは各ディスクリプタで
共通にしたりすると、毎回ヘッダを構築したりせずに
使いまわしたりできる。
これは便利、かも。
Ethrnet MACのDMAは、2つのバッファを勝手につなげて
データを出し入れしてくれるので、実に使い勝手が良い。
要するに、IPパケットの構造に特化したハードウエアになってる。
ピンポイントでうまく使うと、効率よくデータ転送とかが出来そうだ。
多分1パケットごとにDMA使うよりも、倍くらいはパフォーマンスが
出そうな気がする。
まあ、ディスクリプタ単位で、ヘッダとデータ本体にしてもいいんだけど、
ディスクリプタの設定が、ヘッダとデータ本体でひとつおきとかになって
煩雑だ。
ディスクリプタ一つに2つのバッファってのは、
ある種最適化されているのかな。
------
でもこれ、汎用プロトコルスタックでは、簡単には機能させられないなあ。
階層化とかの考え方からすれば、逆行しているとも言えるし。
TCPのプロトコルもそうなんだけど、やっぱりすべての物を
カバーするには、汎用品には荷が重い。
汎用品で済ます、都度特化したドライバを書く、
どっちが生産性が高いかは、ケースバイケースだけど、
こういったプロセッサ特有のペリフェラルの機能をほじくるのも
また楽しいものだ。
大筋ではタイヤの再発明といえばそうなんだけど、地味に性能向上
するところもあるので、一律忌み嫌うものでもないよな、と思う。
| 固定リンク | 0
コメント