Heim  >  Artikel  >  Betrieb und Instandhaltung  >  So optimieren Sie den SylixOS-Netzwerkkartentreiber

So optimieren Sie den SylixOS-Netzwerkkartentreiber

WBOY
WBOYnach vorne
2023-05-14 11:16:141353Durchsuche

1. Entwicklungsumgebung

  • 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.

  • 1.1 Optimierung des Sendedurchsatzes der Netzwerkkarte
  • 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.

  • Daher können Sie bei der Optimierung die Pufferadresse ändern, auf die der DMA-Deskriptor auf die Nutzlast des pbuf-Strukturmitglieds verweist, um auf die Adresse zu verweisen, die tatsächlich zum Senden der Nachricht benötigt wird. Die konkrete Umsetzung ist in Programmlisting 21 dargestellt.

Programmliste 21 Zero-Copy-Optimierung

  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.

Bei der Verwendung der Zero-Copy-Optimierung müssen Sie auf folgende Aspekte achten:

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.

In ähnlicher Weise muss in der Interrupt-Service-Funktion die API_SemaphoreCPost-Funktion aufgerufen werden, um das Semaphor freizugeben, wenn ein erfolgreicher Interrupt erkannt wird.

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen