Maison >Opération et maintenance >Sécurité >Comment optimiser le pilote de la carte réseau SylixOS
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.
Le 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.
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.
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.
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!