Question

J'essaie de faire tourner un moteur pas à pas avec un processeur Rabbit 4000.J'ai une file d'attente qui contiendra les structures et j'ai créé une fonction pour créer la séquence de bits binaires nécessaire pour faire fonctionner le moteur pas à pas à 4 enroulements.J'essaie de transmettre la séquence de la fonction dans une structure à un producteur qui en remplira la file d'attente.Le problème est que je n'obtiens pas la valeur attendue dans la file d'attente.Est-ce que je ne comprends pas comment renvoyer une structure à partir d'une fonction, ou dois-je attribuer les valeurs du tableau individuellement ?Les morceaux de code pertinents sont :

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

}

Sortie d'écran pour le programme :

Salut consommateur
Hola Producteur
Fonction de rupture avec :1,0,0,0
Valeurs après appel de fonction :235,0,24,23
reçu (1a= 0 :1b = 1 :2a= 0:2b= 0) 0
mettre 235,0,24,23
Fonction de rupture avec :0,0,1,0
Valeurs après appel de fonction :236,41,237,0
reçu (1a= 0 :1b=0 :2a= 0:2b= 1) 1
mettre 236,41,237,0

Mon problème est que les valeurs de la fonction de rupture aux valeurs après l'appel de la fonction devraient être les mêmes.

Était-ce utile?

La solution

Ton setDirStep() ne renvoie pas de valeur, mais vous l'avez déclaré comme renvoyant mQueueEntry_t.Les valeurs que vous lisez sur ce devoir seront invalides :

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

Cela devrait afficher un avertissement du compilateur, je suis surpris que ce ne soit pas le cas.

Pour corriger l'erreur, ajoutez l'instruction return nécessaire dans setDirStep():

return entry;

À l’avenir, assurez-vous toujours de compiler avec les avertissements activés.Si vous utilisez gcc, tout ce dont vous avez besoin est -Wall.

Le reste du code semble ok

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top