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