2017-03-27 2 views
0

J'essaye d'implémenter des threads RTOS sur un système d'exploitation Armed MBED sur une carte K64F. Je me sépare des exemples RTOS et j'ai couru et communiqué avec succès différents threads en utilisant Queues. J'ai des problèmes lors de la copie de valeurs char * d'une structure à une autre pour obtenir un message d'une file d'attente à l'autre. Je crois que j'ai mal compris quelque chose et que mon problème est lié aux pointeurs et à la gestion de la mémoire, mais je ne suis pas capable de passer à travers.Copier des valeurs char * à travers les files d'attente et les threads sur MBED OS

J'ai défini des files d'attente différentes pour envoyer des données à divers threads. J'ai également créé une structure de données de base contenant tout ce dont j'ai besoin pour aller dans ces discussions. Dans cette structure, j'ai une variable char * (rHostAddr) contenant l'adresse de l'hôte distant qui a demandé un service.

MemoryPool<cMsg, 16> AMPool; 
Queue<cMsg, 16> AMQueue; 
MemoryPool<cMsg, 16> ioLedPool; 
Queue<cMsg, 16> ioLedQueue; 

typedef struct{ 
    ... 

    char* rHostAddr; 
    ... 
} cMsg; 

dans le thread principal Je crée cette structure de données et de le mettre dans la première file d'attente (AMQueue).

--- Main Thread --- 
cMsg *message = AMPool.alloc(); 

char* rcvaddrs = "111.111.111.111"; 
message->rHostAddr = "111.111.111.111"; 

rcvaddrs = (char*)addr.get_ip_address(); 
message->rHostAddr = rcvaddrs; 

AMQueue.put(message); 

sur le fil 1 J'attends un message pour arriver et à certaines conditions copier toute la structure à un nouveau créé à partir de la piscine correspondante et insérez-le sur une nouvelle file d'attente (ioLedQueue).

--- Thread 1 --- 

cMsg *msg; 
cMsg *ledm = ioLedPool.alloc(); 
osEvent evt = AMQueue.get(); 
msg = (cMsg*)evt.value.p; 

msg.rHostAddr = ledm.rHostAddr; 
printf("\t -- Host 1 -- %s\n\r", ledm->rHostAddr); 
ioLedQueue.put(ledm); 

Sur le thread 2, j'obtiens la structure du message et les données.

--- Thread 2 --- 

cMsg *msg; 
osEvent evt = ioLedQueue.get(); 
msg = (cMsg*)evt.value.p; 
printf("\t -- Host 2 -- %s\n\r", msg->rHostAddr); 

À ce stade, rHostAddr est vide. Je peux voir la valeur sur le printf "Host 1" mais pas dans le "Host 2"

Je crois (si je ne me trompe pas) que le problème vient d'assigner avec = opérande, comme je copie l'adresse, pas la valeur, et il est perdu lorsque la première mémoire de pool est libérée. J'ai essayé de copier la valeur avec memcpy, strcpy et même mon propre char par char mais le système se bloque en appelant ces méthodes.

Comment puis-je copier la valeur via cette file d'attente?

+1

Notez que avec 'char *', la valeur est un pointeur et donc le pointeur être copié. Alors maintenant, deux structures pointent vers la même chaîne. Peut-être que vous devriez également copier les chaînes. Vous pouvez le faire en définissant le 'char * x' comme par exemple. 'char x [123]'. Maintenant, les données de chaîne font partie de la structure. De même, si les threads s'exécutent sur des ordinateurs distincts ou possèdent leur propre mémoire, le pointeur transmis de l'un à l'autre sera invalide. –

Répondre

1

Je propose ici que la bonne réponse a été écrit comme commentaire. La conversion de la valeur en un tableau de caractères était le chemin à parcourir, donc les données de la chaîne font partie de la structure.

char rHostAddr[40]; 

Maintenant, le rendez peut être fait avec la méthode srtcpy et il est passé à travers tout le processus correctement:

char* rcvaddrs = (char*)addr.get_ip_address(); 

strcpy(message->rHostAddr,rcvaddrs);