Hi,
While using interface Pool as below:

module MyP

{
   .
   .
    .
   interface Queue<message_t*> as SendQueue;
   interface Pool<message_t> as SendPool;
   .
   .
}
.
.
.



task void sendDataPkt()
       {

               CADataMsg_t* carm;
               message_t* newmsg = call SendPool.get();
               if (newmsg == NULL)
               {
                       return;
               }
               .
               .
               .
               carm = (CADataMsg_t*)call RadioPacket.getPayload(newmsg, NULL);
               .
               .
               .
               carm->radio_header.radio_pkt_source_addr = TOS_NODE_ID;

               .





               if (call SendQueue.enqueue(newmsg) == SUCCESS)
               {

                       post sendTask();
                       data_sequence_number=data_sequence_number+1;

               }
               else
               {

                       call SendPool.put(newmsg);
               }
               .
               .
               .
}

task void sendTask()
       {
               if (radiolocked == TRUE)
               {
                       return;
               }
               else if (call SendQueue.empty())
               {

                       return;
               }
               else
               {

                       if (call RadioAMSend.send[AM_CADATAMSG]
(myNextHop,call SendQueue.head(), sizeof(CADataMsg_t)) == SUCCESS)
                       {
                               radiolocked = TRUE;

                               call RetxmitTimer.startOneShot(RETXMIT_TIMER);

                               return;
                       }
                       else
                       {
                               post sendTask();
                       }
               }
       }


I realized that the value of newmsg in sendDataPkt() is most of the time NULL.
Should I initialize it or am I doing sth wrong?
here is my wiring:
.
.
.
components new QueueC(message_t*,12) as SendQueue;
 components new PoolC(message_t, 12) as SendPool;
.
.
.
 MyP.SendQueue -> SendQueue;

  MyP.SendPool -> SendPool;

Thanks,
RGDS,
B.


Salem,

Je n'ai pas pu comprendre la cause du problème. Avec les leds, tu ne vas pas 
t'ensortir. Il vaut mieux utiliser printf, comme ça tu pourras obtenir plus 
d'informations. Essaye de diminuer le débit d'émission des paquets de données, 
comme ça tu pourras mieux comprendre la situation, car avec seulement le code 
je ne peux pas trop t'aider.
Petite remarque : est-ce normal d'appeler getPayload comme ça : 
RadioPacket.getPayload(newmsg, 0) ? (i.e. avec le zéro?)

Abdelraouf.

2008/12/3 <[EMAIL PROTECTED]>
Salam Raouf,
Merci bcp pour les indications,j'ai regarde le code
de MultihopOsciloscope et puis j'ai essaie d'implementer
comme suit:

task void sendDataPkt()
       {
               uint8_t j;

               CADataMsg_t* carm;
               message_t* newmsg = call SendPool.get();
               if (newmsg == NULL)
               {
                       return;
               }
               .
               .
               .
               carm = (CADataMsg_t*)call RadioPacket.getPayload(newmsg, 0);
               .
               .
               .
               carm->radio_header.radio_pkt_source_addr = TOS_NODE_ID;
               carm->radio_header.seq_num = data_sequence_number;
               carm->numb_of_hops = 0;
               .
               .
               .
               carm->last_relay_node_addr = TOS_NODE_ID;




               if (call SendQueue.enqueue(newmsg) == SUCCESS)
               {

                       post sendTask();
                       data_sequence_number=data_sequence_number+1;

               }
               else
               {

                       call SendPool.put(newmsg);
               }
               .
               .
               .
}

task void sendTask()
       {
               if (radiolocked == TRUE)
               {
                       return;
               }
               else if (call SendQueue.empty())
               {

                       return;
               }
               else
               {

                       if (call RadioAMSend.send[AM_CADATAMSG]
(myNextHop,call SendQueue.head(), sizeof(CADataMsg_t)) == SUCCESS)
                       {
                               radiolocked = TRUE;

                               call RetxmitTimer.startOneShot(RETXMIT_TIMER);

                               return;
                       }
                       else
                       {
                               post sendTask();
                       }
               }
       }



       event void RetxmitTimer.fired()
       {
               post sendTask();

       }

       event message_t* RadioReceive.receive[am_id_t id]
(message_t* bufPtr, void* payload, uint8_t len)
       {
          .
          .
          .
          .
          case AM_CAACKMSG://acknowledgment msg received
                               if ( keepPkt(bufPtr,payload)== SUCCESS)
                               {

                                       ack=(CAAckMsg_t*)payload;
                                       if(call RetxmitTimer.isRunning())
                                       {

                                               if (call SendQueue.empty()== 
FALSE )
                                               {

                                                       message_t* hd;
                                                       CADataMsg_t* smsg;
                                                       smsg = 
(CADataMsg_t*)call RadioPacket.getPayload(call SendQueue.head(),call 
RadioPacket.payloadLength(call SendQueue.head()) );
                                                       
if(smsg->radio_header.seq_num==ack->seq_num_dataPkt)
                                                       {


                                                               call 
RetxmitTimer.stop();
                                                               hd=call 
SendQueue.dequeue();
                                                               call 
SendPool.put(hd);
                                                       }
                                               }

                                       }


                               }

Bon j'ai decalre les interfaces comme t'as propose et puis pour la taille
de Pool et Queue j'ai mis 100.
J'ai remarque (aussi avec LED) que ds le task sendDataPkt :


message_t* newmsg = call SendPool.get();
               if (newmsg == NULL)
               {
                       return;
               }

newmsg est presque toujours NULL ,et j'ai envoye le newmsg sur serial une
fois (call SendQueue.enque==SUCCESS)et j'ai remarque que les champs
de messages sont intialise de facon arbitraire. Je me suis dit et je pense que
p.ex. quand la qualite de lien entre sender et receiver est tres basse
comme 20% entre node 0 et 2,comme la plupart des acks
ne sont pas recus ,le pool devient plein dans  peu de temps
sans etre libere.
mais meme quand la qualite du lien est 100% ,le led qui indiquait
si le newmsg est NULL  clignote .
Alors en resume ca marche pas.
J'ai verfie les examples ds la librarie de Tinyos et ce que je fais
me semble normal,mais bon on sait jamais.
J'envoie mon code sur ta boite hotmail si tu veux le regarde de plus
pres.

Merci bcp,
Behnaz




















Quoting Abdelraouf Ouadjaout <[EMAIL PROTECTED]<mailto:[EMAIL PROTECTED]>>:

Salem Behnaz,

Pour le problème de la queue, si tu regardes par exemple  l'application 
MultihopOscilloscope, ils ont utilisé QueueC et PoolC  en même temps, pas comme 
dans ton code. Ils utilisent un "pool" pour  stocker une copie du message reçu, 
puis le pointeur de ce message  sera stocké dans une queue. Voici un petit 
exemple montrant la phase  de réception de paquet (afin de le sauvegarder pour 
être émis par la  suite) :

message_t *newMsg = call SendPool.get();
//Tu dois remplir newMsg avec le contenu du message reçu, par  exemple en 
utilisant memcpy
memcpy(newMsg, receivedMsg, sizeof(message_t));
//Maintenant, on peut sauvegarder le pointeur newMsg dans notre queue
if (call SendQueue.enqueue(newmsg) != SUCCESS) {
  call SendPool.put(newmsg);
}

Après, pour retirer un paquet de la queue, on peut faire comme suit :

call Send(nextHop, call SendQueue.head(), ...) ...

Si cet envoie est acquitté, on peut enlever la tête de la queue comme suit :

message_t headMsg = call SendQueue.dequeue();
call SendPool.put(headMsg); //Cela signifie qu'on libère la place  occupé par 
ce message dans le pool

Regarde l'exemple de MultihopOscilloscope pour avoir une idée sur  quelque 
chose qui marche, car ce que je t'ai montré je ne peux pas  le tester :)

Dernière remarque : SendQueue est déclarée avec : interface  Queue<message_t *> 
as SendQueue;
                             SendPool est déclarée avec : interface  
Pool<message_t> as SendPool;

A+
Abdelraouf.

2008/12/2 <[EMAIL PROTECTED]>





_______________________________________________
Tinyos-help mailing list
Tinyos-help@millennium.berkeley.edu
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to