Maison >Opération et maintenance >Sécurité >Comment optimiser le pilote de la carte réseau SylixOS

Comment optimiser le pilote de la carte réseau SylixOS

WBOY
WBOYavant
2023-05-14 11:16:141392parcourir

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

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

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer