Comment optimiser le pilote de la carte réseau SylixOS
1. Environnement de développement
Système d'exploitation : SylixOS
Environnement de programmation : RealEvo-IDE3 1 🎜#Après avoir écrit le pilote de la carte réseau, qui peut réaliser les fonctions d'envoi et de réception de base, cet article présentera brièvement comment optimiser la fonction d'envoi du pilote de la carte réseau et améliorer le débit et les performances d'envoi en temps réel.
1.1 Optimisation du débit d'envoi de la carte réseauLe pilote de la carte réseau peut améliorer le débit d'envoi grâce à zéro copie. Le pilote appelle la fonction d'envoi enetCoreTx pour réaliser l'envoi de messages Ethernet. Cette fonction reçoit deux paramètres, qui sont le pointeur de type structure netdev et le pointeur de type pbuf. enetCoreTx copiera le contenu pointé par pbuf vers le tampon d'envoi DMA pointé par le descripteur d'envoi. Cette copie aura un certain impact sur le débit d'envoi.
Par conséquent, lors de l'optimisation, vous pouvez modifier l'adresse du tampon pointée par le descripteur DMA vers la charge utile du membre de la structure pbuf pour pointer vers l'adresse qui doit réellement envoyer le message. La mise en œuvre spécifique est celle indiquée dans la liste de programmes 21.
Liste des programmes 21 Optimisation sans copie
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); }
Dans le code ci-dessus, la variable bCopy indique si une opération sans copie est requise.
Lorsque vous utilisez l'optimisation zéro copie, vous devez faire attention aux aspects suivants :
1. Lorsque le type pbuf est de type REF ou ROM, aucune copie ne peut être effectuée.
2. Lors de l'exécution d'une copie nulle, vous devez appeler la fonction API_CacheFlushPage pour vider le cache. Dans le même temps, vous devez également appeler la fonction pbuf_ref pour augmenter la valeur de référence membre de pbuf de 1.
3. Après avoir appelé la fonction pbuf_ref, vous devez libérer manuellement le pbuf sans copie dans l'interruption. Appelez la fonction pbuf_free lorsqu'elle est libre. Mais comme cette opération est effectuée dans une interruption, si cette fonction est appelée directement dans la fonction de service d'interruption, une erreur sera signalée. Dans une implémentation spécifique, la file d'attente de travail peut être utilisée pour ajouter des opérations qui doivent libérer pbuf à la file d'attente de travail.
2.2 Le pilote de la carte réseau envoie en temps réel
Lorsque le pilote de la carte réseau envoie, il doit déterminer si le descripteur actuel peut être utilisé pour envoyer le message. l'opération dure un certain temps. Attendez en boucle, puis effectuez l'opération d'envoi lorsqu'un descripteur est disponible. Cela aura un certain impact sur les performances en temps réel.
Ici, vous pouvez utiliser des sémaphores pour optimiser le processus d'envoi, optimisant ainsi la nature en temps réel de l'envoi réseau.
Tout d'abord, créez un sémaphore de comptage lors de l'initialisation du réseau. La valeur correspond au nombre de descripteurs d'envoi actuellement définis.
Lorsque vous avez besoin d'envoyer, vous devez appeler la fonction API_SemaphoreCPend pour obtenir le sémaphore. Après l'avoir obtenu avec succès, vous pouvez effectuer l'opération d'envoi suivante.
De même, dans la fonction de service d'interruption, si une interruption réussie est détectée, la fonction API_SemaphoreCPost doit être appelée pour libérer le sémaphore.
La mise en œuvre spécifique est présentée dans la liste de programmes 22 et la liste de programmes 23.
Liste des programmes 22 Obtenez le sémaphore
#ifAT_TX_REALTIME > 0 API_SemaphoreCPend(pEnet->NET_hTxRdyCnt,LW_OPTION_WAIT_INFINITE); #else
Liste des programmes 23 Libérez le sémaphore
#ifAT_TX_REALTIME > 0 API_SemaphoreCPost(pEnet->NET_hTxRdyCnt); #endif
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)