Frage

Ich versuche, einen Schrittmotor mit einem Rabbit 4000-Prozessor anzutreiben.Ich habe eine Warteschlange, die Strukturen enthält, und habe eine Funktion erstellt, um die Folge von Binärbits zu erstellen, die zum Betrieb des Schrittmotors mit vier Wicklungen erforderlich sind.Ich versuche, die Sequenz von der Funktion in einer Struktur an einen Produzenten zu übergeben, der die Warteschlange damit füllt.Das Problem besteht darin, dass ich nicht den erwarteten Wert in die Warteschlange gestellt bekomme.Verstehe ich falsch, wie man eine Struktur von einer Funktion zurückgibt, oder muss ich die Array-Werte einzeln zuweisen?Die relevanten Codeabschnitte sind:

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);
      }

}

Bildschirmausgabe für Programm:

Hola Verbraucher
Hola-Produzent
Funktion brechen mit:1,0,0,0
Werte nach Funktionsaufruf:235,0,24,23
empfangen (1a= 0:1b= 1:2a= 0:2b= 0) 0
setze 235,0,24,23
Funktion brechen mit:0,0,1,0
Werte nach Funktionsaufruf:236,41,237,0
empfangen (1a= 0:1b= 0:2a= 0:2b= 1) 1
setze 236,41,237,0

Mein Problem besteht darin, dass die Werte von der Unterbrechungsfunktion bis zu den Werten nach dem Funktionsaufruf voraussichtlich gleich sind.

War es hilfreich?

Lösung

Dein setDirStep() gibt keinen Wert zurück, Sie haben ihn jedoch als zurückgegeben deklariert mQueueEntry_t.Die Werte, die Sie in dieser Aufgabe lesen, sind ungültig:

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

Dies sollte eine Compiler-Warnung anzeigen, ich bin überrascht, dass dies nicht der Fall ist.

Um den Fehler zu beheben, fügen Sie die erforderliche Return-Anweisung hinzu setDirStep():

return entry;

Stellen Sie in Zukunft sicher, dass beim Kompilieren immer die Warnungen aktiviert sind.Wenn Sie gcc verwenden, brauchen Sie nur -Wall.

Der Rest des Codes sieht ok aus

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top