Restituire i valori dell'array in una struttura in C per il motore passo-passo
-
24-12-2019 - |
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.
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