Pergunta

Estou tentando girar um motor de passo com um processador Rabbit 4000.Eu tenho uma fila que contém estruturas e criei uma função para criar a sequência de bits binários necessária para operar o motor de passo de 4 enrolamentos.Estou tentando passar a sequência da função ao lado de uma estrutura para um produtor que preencherá a fila com ela.O problema é que não estou colocando o valor esperado na fila.Estou entendendo mal como retornar uma estrutura de uma função ou preciso atribuir os valores da matriz individualmente?Os pedaços de código relevantes são:

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

}

Saída de tela para programa:

Olá Consumidor
Olá Produtor
Função de quebra com:1,0,0,0
Valores após chamada de função:235,0,24,23
recebido (1a= 0:1b = 1:2a= 0:2b= 0) 0
coloque 235,0,24,23
Função de quebra com:0,0,1,0
Valores após chamada de função:236,41,237,0
recebido (1a= 0:1b = 0:2a= 0:2b= 1) 1
coloque 236,41,237,0

Meu problema é que os valores da função de quebra para os valores após a chamada da função devem ser os mesmos.

Foi útil?

Solução

Seu setDirStep() ainda não está retornando um valor, você o declarou como retornando mQueueEntry_t.Os valores que você leu nesta tarefa serão inválidos:

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

Isso deve mostrar um aviso do compilador, estou surpreso que isso não aconteça.

Para corrigir o erro, adicione a instrução de retorno necessária em setDirStep():

return entry;

No futuro, certifique-se sempre de compilar com os avisos ativados.Se você estiver usando o gcc, tudo que você precisa é -Wall.

O resto do código parece ok

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top