« recv関数 | トップページ | リゾートビーチ »

2019年8月 8日 (木)

stm32のEthernet MAC 続き

引き続きstm32f407のEthernet MACをいじる。
送受信バッファを管理するディスクリプタつれづれ。

一つのバッファに一つのディスクリプタ、ってのは分かりやすいんだけど、
なぜか、stm32では、一つのディスクリプタに2つのバッファが
設定できるようになっている。

2つの別々のメモリブロックを繋げて、一つの送受信バッファ
として使えるみたいだ。

? こんなものなにに使うんだろうな、と思っていたのだけれど、
ようやく使い道に気が付いた。

一つ目のバッファに、各種IP関連のヘッダを持たせ、続く2つ目の
バッファにはデータ本体を置く。
IPのヘッダは長さが多少違うものもあるけど、バッファの長さも
ディスクリプタの設定で動的に変えられるので問題ない。

キモは、データ本体だけを別の所に置けるってところだ。
データ本体部分だけを別の所に、複数ディスクリプタ分
きっちり並べて、DMAを使って一気に転送することができそうだ。

しかもヘッダ側のバッファは各ディスクリプタで
共通にしたりすると、毎回ヘッダを構築したりせずに
使いまわしたりできる。
これは便利、かも。

Ethrnet MACのDMAは、2つのバッファを勝手につなげて
データを出し入れしてくれるので、実に使い勝手が良い。

要するに、IPパケットの構造に特化したハードウエアになってる。
ピンポイントでうまく使うと、効率よくデータ転送とかが出来そうだ。
多分1パケットごとにDMA使うよりも、倍くらいはパフォーマンスが
出そうな気がする。


まあ、ディスクリプタ単位で、ヘッダとデータ本体にしてもいいんだけど、
ディスクリプタの設定が、ヘッダとデータ本体でひとつおきとかになって
煩雑だ。
ディスクリプタ一つに2つのバッファってのは、
ある種最適化されているのかな。

------

でもこれ、汎用プロトコルスタックでは、簡単には機能させられないなあ。
階層化とかの考え方からすれば、逆行しているとも言えるし。

TCPのプロトコルもそうなんだけど、やっぱりすべての物を
カバーするには、汎用品には荷が重い。

汎用品で済ます、都度特化したドライバを書く、
どっちが生産性が高いかは、ケースバイケースだけど、
こういったプロセッサ特有のペリフェラルの機能をほじくるのも
また楽しいものだ。

大筋ではタイヤの再発明といえばそうなんだけど、地味に性能向上
するところもあるので、一律忌み嫌うものでもないよな、と思う。

| |

« recv関数 | トップページ | リゾートビーチ »

コメント

コメントを書く



(ウェブ上には掲載しません)




« recv関数 | トップページ | リゾートビーチ »