Question

Salut, je travaille sur un jeu pour mon FPGA.Je suis en utilisant des files d'attente de messages ici, et mon problème est que lorsque je veux imprimer les valeurs d'un tableau, j'obtiens toujours le même résultat même quand je mets des valeurs différentes à eux.Peut-être que je suis l'impression de sortir de mal ou peut-être réinitialisés lorsque la tâche est en cours d'exécution.

#define   MSG_QUEUE_SIZE  4
OS_EVENT  *msgqueue;
void      *msgqueue_tbl[MSG_QUEUE_SIZE];

int say_array[MSG_QUEUE_SIZE];
int idx,x;

// Interrupt Service Routine for KEY0-KEY3 IRQ
void isr_pio_key(void *context, alt_u32 id)
{
INT32U msg = IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE);

// Post message in queue
OSQPost(msgqueue, (void *)msg);

// Reset EDGE CAP
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE, 0x01);
}

void key_pressed_task(void *pdata)
{
INT8U error_code = OS_NO_ERR;
INT32U msg;
OS_Q_DATA queue_data;
INT16U num_msgs;

int say_array[MSG_QUEUE_SIZE];

for(;;) {

    srand(time(NULL));
    int led = rand()%4;

    if(led == 3){
        IOWR_32DIRECT(PIO_LEDG_BASE,0,0x08);
        say_array[3] = led;
        idx++;
    }
    if(led == 2){
        IOWR_32DIRECT(PIO_LEDG_BASE,0,0x04);
        say_array[2] = led;
        idx++;
    }
    if(led == 1){
        IOWR_32DIRECT(PIO_LEDG_BASE,0,0x02);
        say_array[1] = led;
        idx++;
    }
    if(led == 0){
        IOWR_32DIRECT(PIO_LEDG_BASE,0,0x01);
        say_array[0] = led;
        idx++;
    }

    printf("%d",led);

    if(idx==4)
    {
        printf("\nSimon said: ");
        for(x=0;x<4;x++)
            printf("%d",say_array[x]);
        printf("\n");

        idx=0;
        for(;;)
        {
            OSQQuery(msgqueue, &queue_data);
            num_msgs = queue_data.OSNMsgs;

            if(num_msgs > 0)
            {
                msg = (INT32U)OSQPend(msgqueue, 4, &error_code);
                printf("msg: %d\n", msg);

                if((!error_code) && (msg == 1))
                    printf("(KEY_PRESSED_TASK) KEY0 Pressed\n");break;

                if((!error_code) && (msg == 2))
                    printf("(KEY_PRESSED_TASK) KEY1 Pressed\n");break;

                if((!error_code) && (msg == 4))
                    printf("(KEY_PRESSED_TASK) KEY2 Pressed\n");break;

                if((!error_code) && (msg == 8))
                    printf("(KEY_PRESSED_TASK) KEY3 Pressed\n");break;

                msg = 0;
            }
        }
    }
    OSTimeDlyHMSM(0,0,1,0);
}
}

int main()
{
// Create message queue
msgqueue = OSQCreate(&msgqueue_tbl[0], MSG_QUEUE_SIZE);

// Set up interrupts (mask KEY0)
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY_BASE, 0x0F);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE, 0x01);
alt_ic_isr_register(PIO_KEY_IRQ_INTERRUPT_CONTROLLER_ID, PIO_KEY_IRQ, (void *)isr_pio_key, NULL, NULL);

// Create task
OSTaskCreate(key_pressed_task, NULL, &KEY_PRESSED_TASK_STACK[STACKSIZE-1], KEY_PRESSED_TASK_PRIO);

// Start uC/OS-II
OSStart();

// Shouldn't reach this point
return -1;

}

La partie que je me demande est ce:

printf("\nSimon said: ");
for(x=0;x<4;x++)
printf("%d",say_array[x]);
printf("\n");

Le code ci-dessus devrait imprimer les valeurs qui sont définies où les Led sont allumées.Mais il y a toujours des impressions 0123

Des idées?

Était-ce utile?

La solution

Dans votre for(;;) boucle de toujours définir say_array[led] = led;.I. e.lorsque led==3 vous définissez say_array[3] = 3.Essayez de faire le tableau d'un tableau de valeurs booléennes et le basculement de l'élément, par exemple say_array[led] = !say_array[led]; Également supprimer l'un des say_array définitions, comme vous en avez un à portée de fichier et un deuxième à portée de la fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top