在C中为步进电机返回结构中的数组值

在C中为步进电机返回结构中的数组值,c,arrays,struct,embedded,motordriver,C,Arrays,Struct,Embedded,Motordriver,我正在尝试用兔子4000处理器旋转步进电机。我有一个队列,它将保存结构,并创建了一个函数来创建运行4绕组步进电机所需的二进制位序列。我试图将序列从结构中的函数传递给生产者,生产者将用它填充队列。问题是我没有得到放入队列中的预期值。我是否误解了如何从函数返回结构,或者我是否需要单独指定数组值?相关的代码块包括: typedef struct { char d[4]; int delayUs; } mQueueEntry_t; mQueueEntry_t setDirStep(

我正在尝试用兔子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);
      }

}
程序的屏幕输出:

Hola消费者
Hola制作人
带:1,0,0,0的断开函数
函数调用后的值:235,0,24,23
收到(1a=0:1b=1:2a=0:2b=0)0
放置235,0,24,23
带:0,0,1,0的断开函数
函数调用后的值:236,41237,0
收到(1a=0:1b=0:2a=0:2b=1)1
把236,41237,0

我的问题是,从断开函数到函数调用后的值应该是相同的。

您的
setDirStep()
没有返回值,但您将其声明为返回
mqueentry\t
。您在此分配中读取的值将无效:

entry = setDirStep(count0, count1, count2, count3);
这应该显示一个编译器警告,我很惊讶它没有

要修复此错误,请在
setDirStep()
中添加必要的返回语句:

以后,请始终确保在编译时打开警告。如果您使用的是gcc,那么只需要
-Wall


代码的其余部分看起来正常

setDirStep()
没有return语句,但您将其声明为returning
mQueueEntry\t
。这至少应该给出一个编译器警告。我猜您想添加
返回条目
setDirStep()
中。谢谢你,蹩脚的编译器没有给出任何警告,我忽略了它,因为我偏执于把代码更复杂的部分搞糟。好吧,将来,总是在打开警告的情况下编译。检查编译器的文档以了解如何使用。有了gcc,您只需要
-Wall
。另外,我会加上这个作为答案。如果你填写答案,我会给你支票。。。
return entry;