Domanda

Sto tentando di girare un motore passo-passo con un processore Rabbit 4000. Ho una coda che tiene forma, e ha creato una funzione per creare la sequenza di bit binari necessari per eseguire il motore 4. Sto cercando di passare la sequenza dalla funzione in parte una struttura a un produttore che riempirà la coda con esso. Il problema è che non sto ottenendo il valore atteso messo in coda. Sto fraintendendo come restituire una struttura da una funzione, o devo assegnare i valori dell'array singolarmente? I blocchi di codice rilevanti sono:

typedef struct {
    char d[4];
    int  delayUs;
} mQueueEntry_t;


mQueueEntry_t setDirStep(int count0, int count1, int count2, int count3){

 mQueueEntry_t entry;

        entry.d[0] = (!((count0+1)%4));                 //1a
        entry.d[1] = (!((count1+1)%4));                 //1b
        entry.d[2] = (!((count2+1)%4));                 //2a
        entry.d[3] = (!((count3+1)%4));                 //2b

        entry.delayUs =10;
        printf("Breaking Funct with: %d,%d,%d,%d\n",entry.d[0], entry.d[1], entry.d[2], entry.d[3]);
}

// continually stuff a queue with a dedicated structure
void Producer(void* pdata){
    mQueueEntry_t entry;

    int count0 = 3;
    int count1=1;
    int count2=2;
    int count3=0;

    labQueue_t * q = (labQueue_t *) pdata;  // Note use of task data..
    printf("Hola Producer\n");
    while (1)
    {
        entry = setDirStep(count0, count1, count2, count3);
        printf("Values after funct call: %d,%d,%d,%d\n",entry.d[0], entry.d[1], entry.d[2], entry.d[3]);

        count0++;
        count1++;
        count2++;
        count3++;

        // send a copy of the element and
        switch ( labQueuePut( q, &entry) ){
        case LABQ_OK:
            printf("put %d,%d,%d,%d\n",entry.d[0], entry.d[1], entry.d[2], entry.d[3]);
            break;
        case LABQ_TIMEOUT:
            OSTimeDly(OS_TICKS_PER_SEC/10);
            break;
        case LABQ_FULL:
            OSTimeDly(OS_TICKS_PER_SEC/10);
            break;
        default:
            assert(0);
            break;
        }
        OSTimeDly(1);
      }

}
.

Uscita schermo per il programma:

Hola Consumer
Produttore di Hola
. Breaking funct con: 1,0,0,0

Valori dopo la chiamata di funct: 235,024,23
ricevuto (1a= 0: 1b= 1: 2a= 0: 2b= 0) 0
Metti 235,0,24,23
. Breaking funct con: 0,0,1,9
Valori dopo la chiamata di funct: 236,41,237,0
ricevuto (1a= 0: 1b= 0: 2a= 0: 2b= 1) 1
Metti 236,41,237,0

Il mio problema è con i valori dalla funzione di rottura ai valori dopo che la chiamata di funct dovrebbe essere la stessa.

È stato utile?

Soluzione

Il tuo setDirStep() non restituisce un valore, ancora, l'hai dichiarato come restituzione mQueueEntry_t.I valori che hai letto su questo incarico non saranno validi:

entry = setDirStep(count0, count1, count2, count3);
.

Questo dovrebbe mostrare un avvertimento del compilatore, sono sorpreso che non lo faccia.

Per correggere l'errore, aggiungere l'istruzione di ritorno necessaria in setDirStep():

return entry;
.

In futuro, assicurati sempre di compilare con gli avvertimenti accesi.Se stai usando GCC, tutto ciò di cui hai bisogno è -Wall.

Il resto del codice sembra OK

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top