Pregunta

Estoy tratando de hacer girar un motor paso a Paso con un conejo 4000 procesador.Tengo una cola que contendrá los structs, y han creado una función para crear la secuencia de bits binarios necesitan para ejecutar el 4 de bobinado de motor paso a paso.Estoy tratando de pasar de la secuencia de la función en el lado de una estructura para un productor que va a llenar la cola con ella.El problema es no puedo obtener el valor esperado puso en la cola.Soy un malentendido de cómo devolver una estructura de una función, o tengo que asignar los valores de la matriz de forma individual?Los correspondientes fragmentos de código son:

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

}

La salida por pantalla del programa:

Hola Consumidor
Hola Productor
Romper Func. con:1,0,0,0
Los valores después de la func. de llamada:235,0,24,23
recibido (1a= 0:1b= 1:2a= 0:2b= 0) 0
poner 235,0,24,23
Romper Func. con:0,0,1,0
Los valores después de la func. de llamada:236,41,237,0
recibido (1a= 0:1b= 0:2a= 0:2b= 1) 1
poner 236,41,237,0

Mi problema es con los valores de rotura de la función para los Valores después de la func. de llamada se espera que sea el mismo.

¿Fue útil?

Solución

Su setDirStep() no devuelve un valor, sin embargo, que la declaró como devolver mQueueEntry_t.Los valores de leer en esta asignación no será válido:

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

Esto debería mostrar una advertencia del compilador, que me sorprende que no.

Para corregir el error, agregar la necesaria instrucción return en setDirStep():

return entry;

En el futuro, asegúrese siempre de que compilar con las advertencias de encendido.Si usted está usando gcc, todo lo que necesita es -Wall.

El resto del código se ve bien

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top