RXマイコン、C++、新たなネットスタックの実装(UDP通信)

やっと、UDP通信が出来た。

まだ、不完全ではあると思うが、簡単な送受信が成功した。

作ってみて判るのは、やはり、ネットスタックの実装は、C++に良くマッチ
すると思う事。

・構造体やクラスは、処理系にとって都合の良いように、アライメントされる
が、パケットの中身は、処理系のアラインサイズとは無関係な場合もある為、
随所に「__attribute__((__packed__))」を使って、「余り」が出ないように
してある、これは、gcc 特有のキーワードなので、コンパイラーが違うと、エ
ラーになると思う。
・内部で扱うバッファは、固定サイズにしてあり、アロケーターを必要としない
ようにした。(テンプレートのパラメーターとしてある)
※これが、良いか悪いか、判断の分かれる部分ではあるけど、組み込みでは、
少メモリーに対応する必要と、システムのアロケーターが使えない場合も考慮
する必要性もあるので、そのような実装にしてある。
・UDP/TCP の経路を開始した時に必要なバッファを動的に確保しないと、スタ
テックなメモリーは設定した経路数の最大値によって、多く消費してしまうが、
この辺りの管理は、ユーザーの設定(テンプレートパラメーター)にまかせる
事としている。
・また、メモリー管理を独自に実装する事も考えられるが、現実として、独自
のアロケーターを実装しても、安定して動作するまでは、かなり時間のかかる
困難な作業ではあるし、「DL malloc」(通称)を超える事は、ほとんど不可能
に近い事を考えると、これは後回しにすべき問題と思える。
※殆どのシステムには、高性能な「DL malloc」か、又は、修正版が実装されて
いるにも拘らず、独自に実装している「例」を多く見かけるが、一度、システム
のアロケーターとの違い(勝負)を厳密に行うべきで、容易には、様々な面で、
超える事は出来ないと思われる。(記憶割り当ての効率、速度、断片化割合)

割り込み内での処理と、通常の処理を、分離してあり、コンテキストのオーバー
ラップを起こさないように工夫してある。

また、マルチタスクでは無く、シングルタスクをポリシーとして実装してあり、
処理が集中しないように工夫してある。
※大きなバッファの処理は、ある程度は仕方無いが・・・
※各クラスには、サービスルーチンが用意してあり、10ms単位で呼ぶよう
にするが、必ず、割り込み外から呼ぶようにデザインしてある。

—–
現状では、RX64Mや、GR-KAEDEで動作する。
※イーサーネットの物理層(PHY)ハードウェアーとの接続は、RMIIで
リンクアップはポーリングで行っている。

ソースコードは、GitHub net2で公開している。

UDP通信の簡易テストUDP

※MITライセンス

カテゴリー: ソフトウェアー・エンジニアリング, 電子工作な日々 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です