オペレーティングシステム: SylixOS
プログラミング環境: RealEvo-IDE3.1
ハードウェア プラットフォーム: AT9x25 開発ボード
ネットワーク カード ドライバーが作成され、基本的な送受信機能が実現できるようになった後, この記事では、ネットワークカードドライバーの送信機能を最適化し、送信のスループットとリアルタイムパフォーマンスを向上させる方法を簡単に紹介します。
ネットワーク カード ドライバーは、ゼロ コピーを通じて送信スループットを向上させることができます。ドライバーは enetCoreTx 送信関数を呼び出して、イーサネット メッセージの送信を実現します。この関数は、netdev 構造体型ポインタと pbuf 型ポインタの 2 つのパラメータを受け取ります。 enetCoreTx は、pbuf が指すコンテンツを、送信記述子が指す DMA 送信バッファにコピーします。このコピーは、送信スループットに一定の影響を与えます。
したがって、最適化するときに、DMA 記述子が pbuf 構造体メンバーのペイロードに指すバッファ アドレスを、メッセージを実際に送信する必要があるアドレスを指すように変更できます。具体的な実装はプログラムリスト 21 に示すとおりです。
プログラム リスト 21 ゼロコピーの最適化
if (usLen == pstPbuf->len) { if ((pstPbuf->type != PBUF_REF)&& (pstPbuf->type != PBUF_ROM)) { bCopy = LW_FALSE; } } if (!bCopy) { pbuf_ref(pstPbuf); pEnet->pTxRing[iHead].iTxBaddr = (UINT32)pstPbuf->payload; API_CacheFlushPage(DATA_CACHE,pstPbuf->payload, pstPbuf->payload, LW_CFG_VMM_PAGE_SIZE); } else { pEnet->pTxRing[iHead].iTxBaddr =(UINT32)pEnet->NET_pTxInfo[iHead].TXI_pvDmaAddr; pbuf_copy_partial(pstPbuf,(PVOID)(pEnet->pTxRing[iHead].iTxBaddr), usLen, 0); }
上記のコードでは、bCopy 変数はゼロコピー操作が必要かどうかを示します。
ゼロコピー最適化を使用する場合は、次の点に注意する必要があります。
1. pbuf タイプが REF または ROM タイプの場合、ゼロコピーはできません。
2.ゼロコピーを実行する場合は、API_CacheFlushPage 関数を呼び出してキャッシュをクリアする必要があります。同時に、pbuf_ref 関数を呼び出して、pbuf のメンバー ref 値を 1 ずつ増やす必要もあります。
3. pbuf_ref 関数を呼び出した後、割り込み内のゼロコピー pbuf を手動で解放する必要があります。空きの場合は関数 pbuf_free を呼び出します。ただし、この動作は割り込みで行われるため、この関数を割り込みサービス関数内で直接呼び出すとエラーが報告されます。特定の実装では、ワーク キューを使用して、pbuf を解放する必要がある操作をワーク キューに追加できます。
ネットワーク カード ドライバーが送信するときは、現在の記述子を使用してメッセージを送信できるかどうかを判断する必要があります。一般的な操作は待機することです。 while ループを通じて、記述子が利用可能な場合、送信操作が実行されます。これはリアルタイムのパフォーマンスに一定の影響を与えます。
ここでは、セマフォを使用して送信プロセスを最適化し、それによってネットワーク送信のリアルタイム性を最適化できます。
まず、ネットワークの初期化中にカウント セマフォを作成します。値は、現在設定されている送信記述子の数です。
送信する必要がある場合は、API_SemaphoreCPend 関数を呼び出してセマフォを取得する必要があり、取得に成功したら、次の送信操作を実行できます。
同様に、割り込みサービス関数では、割り込みの成功が検出された場合、API_SemaphoreCPost 関数を呼び出してセマフォを解放する必要があります。
具体的な実装は、プログラム リスト 22 とプログラム リスト 23 に示されています。
プログラム リスト 22 セマフォの取得
#ifAT_TX_REALTIME > 0 API_SemaphoreCPend(pEnet->NET_hTxRdyCnt,LW_OPTION_WAIT_INFINITE); #else
プログラム リスト 23 セマフォの解放
#ifAT_TX_REALTIME > 0 API_SemaphoreCPost(pEnet->NET_hTxRdyCnt); #endif
以上がSylixOS ネットワーク カード ドライバーを最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。