2014-02-05 6 views
0

Я пишу многопоточный интерфейс связи, где одна функция (в моем основном потоке) подталкивает данные в очередь (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 

Я не понимаю, почему мои данные, которые поступают в очередь не выйдет ...

+0

@nos Очень верно, исправляя это прямо сейчас! – cerr

ответ

1

Проверьте все возвращаемые значения функции, которую вы вызываете, чтобы вы, по крайней мере, не пропустили никаких ошибок. например вы получаете сообщения с NO_WAIT, поэтому, если вам посчастливилось позвонить msgQReceive, прежде чем что-либо было отправлено, вы ничего не получите - что было бы важной вещью. Аналогично, когда вы отправляете с NO_WAIT - вы не обрабатываете случай, если очередь заполнена.

Однако ваша отправка функция есть:

UINT8 *msgTag[MSGTAGLEN] 

по какой-то причине это массив указателей UINT8. В коде нет ничего, что предполагает, что это должен быть массив указателей - и поскольку массив отличается в функции приемника, вы будете интерпретировать байты по-разному в двух функциях. Ваша функция приемника, кажется, это правильно, поэтому убедитесь, что функция отправитель также имеет то же самое:

UINT8 msgTag[MSGTAGLEN]; 

(также убедиться, что ваши две функции здесь arn't вызывается из нескольких задач, то есть статические переменные и не потокобезопасный, а не повторный вход.)

+0

Ой! Да, я не видел этого '*', противного! Но хорошо поймать, спасибо! Я также включил проверку возвращаемых значений ... – cerr

+0

Еще одна вещь в этом отношении: я определил функции static, чтобы никто другой, из «снаружи» не мог получить доступ к этим функциям. И если они работают в рамках своих собственных задач, а очередь - это единственное соединение, то создается проблема safty, нет? 'MsgQLib' из ~ VxWorks' является потокобезопасным: http://www.vxdev.com/docs/vx55man/vxworks/ref/msgQLib.html#msgQReceive – cerr

+1

@cerr да, если есть только одна задача, которая вызывает эти функции при любом дате времени, это нормально – nos

 Смежные вопросы

  • Нет связанных вопросов^_^