2008-09-22 4 views
0

J'utilise des tuyaux pour transférer des informations entre deux tâches vxWorks.Pourquoi est-ce que je perds des données lors de l'utilisation d'un tube vxWorks?

Voici un exemple de code:


Init() 
{ 
    fd = open("/pipe/mydev", O_RDWR, 0777); 
... 
} 

taskRx() 
{ 
    ... 
    len = read(fd, rxbuf, MAX_RX_LEN); 
    ... 
} 
taskTx() 
{ 
    ... 
    len = write(fd, txbuf, txLen); 
    ... 
} 

Si nous envoyons un message qui est plus long que MAX_RX_LEN, (c.-à-txLen> MAX_RX_LEN) nous faisons 2 lit pour obtenir le reste du message.

Ce que nous avons remarqué est que la 2ème lecture n'a pas reçu de données!

Pourquoi est-ce?

Répondre

2

Le mécanisme de tuyauterie de VxWorks est et non basé sur les flux (contrairement aux tubes nommés Unix).

Il s'agit d'une couche au-dessus de la fonction de file d'attente des messages de vxWorks. En tant que tel, il a les mêmes limites qu'une file d'attente de messages: lors de la lecture du tuyau, vous lisez vraiment le message entier. Si votre tampon de réception n'a pas assez d'espace pour stocker les données reçues, le débordement est simplement supprimé.

Lorsque vous effectuez une réception sur une file d'attente de messages ou un canal, assurez-vous toujours que le tampon est défini sur la taille maximale d'un élément de file d'attente.

Questions connexes