-
イーサネットパケット送信
- 著者は「Networking from scratch」というシリーズを作ろうとし、マイクロコントローラ上でTCP/IPスタックを構築するプロジェクトを始めた。
- このブログ記事は、最初のイーサネットパケットを無事に送信した話と、プロジェクトでのバグやデバッグに関する経験を共有している。
-
マイクロコントローラ
- 使用されたマイクロコントローラはSTM32F401で、ARM Cortex-M4ベースで最大84MHzで動作する。
- 96KiBのRAMを備えており、複数のパケットを処理できる十分な容量を提供する。
-
イーサネット
- イーサネットはさまざまな技術と標準を含む概念であり、物理レベルのハードウェア、信号形式、バス衝突処理戦略、フレームレイアウトなどを含む。
- このプロジェクトではWiznetのW5100チップを使用しており、このチップはハードウェアTCP/IPスタックを内蔵している。
-
問題1: 虚空に向かって叫ぶ
- W5100チップとの通信のためのドライバを書いたが、SPI信号の配線が誤っており通信できなかった。
- ArduinoシールドのICSPヘッダがSPI信号を誤って接続していたため問題が発生し、これを修正するためにボードを再作業した。
-
問題2: コメディの本質
- SPI信号が正しく接続された後も、イーサネットパケット送信は正常に行われなかった。
- ロジックアナライザを使ってデジタル信号を解析し、チップセレクト信号のタイミング問題を解決して通信を成功させた。
-
問題3: 謎のパケット
- Wiresharkでは、送信したパケットではない誤ったパケットが表示された。
- Arduinoライブラリを参考に問題を分析し、誤ったメモリアドレスにデータを書き込むバグを修正して問題を解決した。
-
この話の教訓
- イーサネットパケット送信は小さな成果かもしれないが、プロジェクトでのバグやデバッグ経験には価値がある。
- デバッグとツール作成は開発プロセスの重要な部分であり、探究と実験を通じてシステムを理解することが重要だ。
- プロジェクトは、より高い抽象化レベルの問題やバグを扱いながら進行中である。
1件のコメント
Hacker Newsの意見
ツールを作成し、デバッグを探索することには常に価値がある。しかし多くの人はそれを理解しておらず、特にJIRAのような開発プロセスでは探索の価値が見過ごされがちである。
小さなツールを作る能力は、10倍の生産性を持つプログラマーの核心であり、しばしば表に出ないところで実践される技芸である。
マイクロコントローラ上でTCP/IPとEthernetフレームのスタックをゼロから構築するシリーズの始まりである。W5100チップを使ってTCP/IPを処理し、事前構築されたEthernetフレームをサポートしている。
FPGAエンジニアリングへキャリア転向し、Ethernetに注力しているが、ネットワーキングの抽象化を理解することは非常に価値があった。
STM32F401とW5100 Ethernetシールドを使う代わりに、STM32F407ボードと安価なEthernet PHYボードを使うほうがよいという意見がある。
Ethernet機能は通常、マイクロコントローラ内に内蔵された周辺機能として含まれている。
MOSI/MISOの新しい名称であるmain out/subordinate inを初めて見たが、COPI/CIPOという代替案はあまり理解されていない。
Linuxでネットワークスタックを書くなら、
socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))を使うことができる。STM32 Nucleoボードには100Mbps Ethernetが内蔵されており、STM32Cubeソフトウェアの評価は分かれるものの、動作するサンプルを提供している。
Ethernetはフレームを扱い、パケットはIPの概念である。
ENC28J60
Stand-Alone Ethernet Controller with SPI Interfaceも検討できるが、ハードウェアTCP/IPスタックがないため、ソフトウェア実装が必要になる。