Я пишу многопоточный интерфейс связи, где одна функция (в моем основном потоке) подталкивает данные в очередь (VxWorks msgQLib
) и другую функцию в моей задаче связи, извлекает данные из очереди для пересылки на аппаратный интерфейс. Теперь кажется, что мои данные push не совпадают с моими данными извлечения (или наоборот). Я вставил несколько отладочных сообщений, чтобы узнать, что происходит, но пока не смог найти виновника. Код у меня:Почему данные, которые я вставляю в очередь, не выходят на другой конец?
немного информация. Я построил функции так, чтобы я вставлял тег сообщения с некоторыми метаданными перед фактическим сообщением, то есть каждое сообщение вставляло бы два элемента в очередь. Пожалуйста, не беспокойтесь о части «ответа», которая все еще нуждается в некоторой работе с обеих сторон. Теперь я просто беспокоюсь об уходящей части уравнения.
Функция, которая выталкивает данные в очередь (в прикладной задаче):
static STATUS SPIQWriteRead_TDM(UINT8 cmdlen, UINT8 *cmd, UINT8 retdatlen, UINT8 *retdat)
{
UINT8 BytesRead;
UINT8 *msgTag[MSGTAGLEN]={0};
static UINT spi_init = 0;
UINT i=0;
//assemble message tag
msgTag[0] = 0x01; //FrameID
msgTag[1] = cmdlen/255; //MsgLen MSB
msgTag[2] = cmdlen%255; //MsgLen LSB
msgTag[3] = CS_TDM; // ChipSelect
msgTag[4] = 0; //SlotID
//copy message tag into queue
for(i=0;i<MSGTAGLEN;i++)
printf("<= msgTag[%d] 0x%x\n",i,msgTag[i]);
msgQSend(TDMTxQ,msgTag,MSGTAGLEN,NO_WAIT,MSG_PRI_NORMAL);
printf("<= TxQueue(0x%x) contains %d items\n",TDMTxQ, msgQNumMsgs(TDMTxQ));
for(i=0;i<cmdlen;i++)
printf("<= msg[%d] 0x%x\n",i,cmd[i]);
// copy message into queue
msgQSend(TDMTxQ,cmd,cmdlen,NO_WAIT,MSG_PRI_NORMAL);
printf("<= TxQueue(0x%x) contains %d items\n",TDMTxQ, msgQNumMsgs(TDMTxQ));
// wait for a maximum of 10 ticks (~1600ms) for the Reply
BytesRead = msgQReceive(TDMRxQ,retdat,retdatlen,100);
for(i=0;i<retdatlen;i++)
printf("retdat[%d] 0x%x\n",i,retdat[i]);
printf("BytesRead 0x%x\n",BytesRead);
// compare reply and return
if (BytesRead != retdatlen)
return ERROR;
else
return OK;
}
и функция, которая извлекает данные из очереди (в задаче связи):
static FROM_Q_DAT *GetFromQueue(MSG_Q_ID TxQId)
{
UINT8 msgTag[MSGTAGLEN]= {0};
UINT8 FrameID = 0;
UINT16 MsgLen = 0;
UINT8 ChipSelect = 99;
UINT8 SlotID = 99;
static UINT8 *cmd=NULL;
UINT8 retdat[2]={0};
UINT8 cs=99;
static FROM_Q_DAT Qdat;
int retval = 0;
UINT8 i=0;
// read message tag from queue
msgQReceive(TxQId, msgTag, MSGTAGLEN, NO_WAIT);
for(i=0;i<MSGTAGLEN;i++)
printf("=> msgTag[%d] 0x%x\n",i,msgTag[i]);
// parse received message tag
FrameID = msgTag[0];
MsgLen = (((UINT16)msgTag[1])<<8) | (msgTag[2]);
ChipSelect = msgTag[3];
SlotID = msgTag[4];
printf("FrameID: %d\n",FrameID);
printf("MsgLen: %d\n",MsgLen);
printf("ChipSelect: %d\n",ChipSelect);
printf("SlotID: %d\n",SlotID);
printf("=> TxQueue(0x%x) contains %d items\n",TxQId, msgQNumMsgs(TxQId));
cmd = (UINT8*) calloc(MsgLen, sizeof(UINT8));
// Get the message from the queue
msgQReceive(TxQId, cmd, MsgLen, NO_WAIT);
for(i=0;i<MsgLen;i++)
printf("=> cmd[%d] 0x%x\n",i,cmd[i]);
printf("=> TxQueue(0x%x) contains %d items\n",TxQId, msgQNumMsgs(TxQId));
Qdat.cs = ChipSelect;
Qdat.len = MsgLen;
Qdat.data = cmd;
return &Qdat;
}
И захват экрана выглядит так:
<= msgTag[0] 0x1
<= msgTag[1] 0x0
<= msgTag[2] 0x9
<= msgTag[3] 0x2
<= msgTag[4] 0x0
<= TxQueue(0x261c6010) contains 1 items
<= msg[0] 0x5e
<= msg[1] 0x8
<= msg[2] 0x40
<= msg[3] 0x6
<= msg[4] 0x0
<= msg[5] 0x0
<= msg[6] 0x0
<= msg[7] 0x0
<= msg[8] 0x0
<= TxQueue(0x261c6010) contains 2 items
//the next message (with '==' is from the communication engine that checks for content in the communication Queue:
== TxQueue(1) contains 2 items
=> msgTag[0] 0x0
=> msgTag[1] 0x0
=> msgTag[2] 0x0
=> msgTag[3] 0x1
=> msgTag[4] 0x0
FrameID: 0
MsgLen: 0
ChipSelect: 1
SlotID: 0
=> TxQueue(0x261c6010) contains 1 items
=> TxQueue(0x261c6010) contains 0 items
Я не понимаю, почему мои данные, которые поступают в очередь не выйдет ...
@nos Очень верно, исправляя это прямо сейчас! – cerr