1

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

}

程序的屏幕输出:

Hola Consumer
Hola Producer
Breaking Funct with: 1,0,0,0 函数
调用后的值:收到 235,0,24,23
(1a= 0: 1b= 1: 2a= 0:2b= 0) 0
put 235,0 ,24,23
中断函数
:0,0,1,0 函数调用后的值:
收到 236,41,237,0 (1a= 0: 1b= 0: 2a= 0:2b= 1) 1
put 236,41,237,0

我的问题是函数调用后从破坏函数到值的值应该是相同的。

4

1 回答 1

3

setDirStep()没有返回值,但是,您将其声明为正在返回mQueueEntry_t。您在此作业中读取的值将无效:

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

这应该显示编译器警告,我很惊讶它没有。

要修复错误,请在以下位置添加必要的 return 语句setDirStep()

return entry;

将来,请始终确保在打开警告的情况下进行编译。如果你使用 gcc,你只需要-Wall.

其余代码看起来还可以

于 2014-02-27T20:02:00.207 回答