Heim > Artikel > Betrieb und Instandhaltung > So optimieren Sie den SylixOS-Netzwerkkartentreiber
Betriebssystem: SylixOS
Programmierumgebung: RealEvo-IDE3 1 🎜#Nachdem der Netzwerkkartentreiber geschrieben wurde, der grundlegende Sende- und Empfangsfunktionen realisieren kann, wird in diesem Artikel kurz vorgestellt, wie die Sendefunktion des Netzwerkkartentreibers optimiert und der Durchsatz und die Echtzeitleistung des Sendens verbessert werden können.
Der Netzwerkkartentreiber kann den Sendedurchsatz durch Nullkopien verbessern. Der Treiber ruft die Sendefunktion enetCoreTx auf, um das Senden von Ethernet-Nachrichten zu realisieren. Diese Funktion empfängt zwei Parameter: den Netdev-Strukturtypzeiger und den Pbuf-Typzeiger. enetCoreTx kopiert den Inhalt, auf den pbuf zeigt, in den DMA-Sendepuffer, auf den der Sendedeskriptor zeigt. Diese Kopie hat einen gewissen Einfluss auf den Sendedurchsatz.
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); }
Im obigen Code gibt die bCopy-Variable an, ob ein Zero-Copy-Vorgang erforderlich ist.
1. Wenn der pbuf-Typ REF oder ROM ist, kann keine Nullkopie durchgeführt werden.
2. Wenn Sie eine Nullkopie durchführen, müssen Sie die Funktion API_CacheFlushPage aufrufen, um den Cache zu leeren. Gleichzeitig müssen Sie auch die Funktion pbuf_ref aufrufen, um den Member-Ref-Wert von pbuf um 1 zu erhöhen.
3. Nach dem Aufruf der Funktion pbuf_ref müssen Sie den Nullkopie-Pbuf im Interrupt manuell freigeben. Rufen Sie die Funktion pbuf_free auf, wenn sie frei ist. Da dieser Vorgang jedoch in einem Interrupt ausgeführt wird, wird ein Fehler gemeldet, wenn diese Funktion direkt in der Interrupt-Servicefunktion aufgerufen wird. In einer bestimmten Implementierung kann die Arbeitswarteschlange verwendet werden, um Vorgänge, die pbuf freigeben müssen, zur Arbeitswarteschlange hinzuzufügen.
2.2 Der Netzwerkkartentreiber sendet in Echtzeit
Wenn der Netzwerkkartentreiber sendet, muss er feststellen, ob der aktuelle Deskriptor zum Senden der Nachricht verwendet werden kann Der Vorgang durchläuft eine Weile. Warten Sie in einer Schleife und führen Sie dann den Sendevorgang aus, wenn ein Deskriptor verfügbar ist. Dies wird einen gewissen Einfluss auf die Echtzeitleistung haben.
Hier können Sie Semaphoren verwenden, um den Sendevorgang zu optimieren und so den Echtzeitcharakter des Netzwerkversands zu optimieren.
Erstellen Sie zunächst während der Netzwerkinitialisierung ein Zählsemaphor. Der Wert ist die Anzahl der aktuell eingestellten Sendedeskriptoren.
Wenn Sie senden müssen, müssen Sie die Funktion API_SemaphoreCPend aufrufen, um das Semaphor abzurufen. Nachdem Sie es erfolgreich erhalten haben, können Sie den folgenden Sendevorgang ausführen.
Die spezifische Implementierung ist in Programmliste 22 und Programmliste 23 dargestellt.
Programmliste 22 Holen Sie sich das Semaphor
#ifAT_TX_REALTIME > 0 API_SemaphoreCPend(pEnet->NET_hTxRdyCnt,LW_OPTION_WAIT_INFINITE); #else
Programmliste 23 Geben Sie das Semaphor frei
#ifAT_TX_REALTIME > 0 API_SemaphoreCPost(pEnet->NET_hTxRdyCnt); #endif
Das obige ist der detaillierte Inhalt vonSo optimieren Sie den SylixOS-Netzwerkkartentreiber. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!