Возврат значений массива в структуре на C для шагового двигателя

StackOverflow https://stackoverflow.com//questions/22078827

Вопрос

Я пытаюсь раскрутить шаговый двигатель с процессором Rabbit 4000.У меня есть очередь, которая будет хранить структуры, и я создал функцию для создания последовательности двоичных битов, необходимой для запуска шагового двигателя с 4 обмотками.Я пытаюсь передать последовательность из функции внутри структуры производителю, который заполнит ею очередь.Проблема в том, что я не получаю ожидаемое значение, помещенное в очередь.Я неправильно понимаю, как вернуть структуру из функции, или мне нужно присваивать значения массива индивидуально?Соответствующие фрагменты кода:

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

}

Вывод экрана для программы:

Хола Потребитель
Хола Продюсер
Функция прерывания с:1,0,0,0
Значения после вызова функции:235,0,24,23
получено (1а= 0:1б= 1:2а= 0:2б= 0) 0
поставь 235,0,24,23
Функция прерывания с:0,0,1,0
Значения после вызова функции:236,41,237,0
получено (1а= 0:1б= 0:2а= 0:2б= 1) 1
поставь 236,41,237,0

Моя проблема заключается в том, что значения от функции нарушения до значений после вызова функции должны быть одинаковыми.

Это было полезно?

Решение

Твой setDirStep() не возвращает значение, но вы объявили его возвращающим mQueueEntry_t.Значения, которые вы прочтете в этом задании, будут недействительными:

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

Это должно показать предупреждение компилятора, я удивлен, что это не так.

Чтобы исправить ошибку, добавьте необходимый оператор return в setDirStep():

return entry;

В будущем всегда обязательно выполняйте компиляцию с включенными предупреждениями.Если вы используете gcc, все, что вам нужно, это -Wall.

Остальная часть кода выглядит нормально

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top