Значения массива uC/OS-II не печатаются правильно в игре

StackOverflow https://stackoverflow.com//questions/24062196

  •  27-12-2019
  •  | 
  •  

Вопрос

Привет, я работаю над игрой для своей FPGA.Я использую здесь очереди сообщений, и моя проблема в том, что когда я хочу напечатать значения из массива, я всегда получаю один и тот же результат, даже если помещаю в них разные значения.Возможно, я их неправильно распечатываю, или, может быть, они сбрасываются при выполнении задачи.

#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;

}

Меня интересует вот что:

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

Приведенный выше код должен печатать значения, установленные при включении светодиодов.Но он всегда печатает 0123

Есть идеи?

Это было полезно?

Решение

В вашей for(;;) цикл, который ты всегда устанавливаешь say_array[led] = led;.Т.е.когда led==3 Ты устанавливаешь say_array[3] = 3.Попробуйте сделать массив массивом логических значений и переключить элемент, например. say_array[led] = !say_array[led];Также удалите одно из определенийsay_array, так как одно из них находится в области файла, а второе — в области функции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top