Arrays uC/OS-II数组值在游戏中无法正确打印

Arrays uC/OS-II数组值在游戏中无法正确打印,arrays,printf,ucos,Arrays,Printf,Ucos,嗨,我一直在为我的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 Ser

嗨,我一直在为我的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;
#定义消息队列大小4
OS_事件*msgqueue;
void*msgqueue_tbl[MSG_QUEUE_SIZE];
int say_数组[消息队列大小];
int-idx,x;
//KEY0-KEY3 IRQ的中断服务程序
无效isr_pio_键(无效*上下文,alt_u32 id)
{
INT32U msg=IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE);
//在队列中发布消息
OSQPost(msgqueue,(void*)msg);
//重置封边帽
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE,0x01);
}
无效键\u按下\u任务(无效*数据)
{
INT8U错误代码=操作系统无错误;
INT32U味精;
OS_Q_数据队列_数据;
INT16U num_msgs;
int say_数组[消息队列大小];
对于(;;){
srand(时间(空));
int led=rand()%4;
如果(发光二极管==3){
IOWR_32DIRECT(PIO_LEDG_基地,0,0x08);
say_阵列[3]=发光二极管;
idx++;
}
如果(发光二极管==2){
IOWR_32DIRECT(PIO_LEDG_基地,0,0x04);
say_数组[2]=led;
idx++;
}
如果(发光二极管==1){
IOWR_32DIRECT(PIO_LEDG_基地,0,0x02);
say_数组[1]=led;
idx++;
}
如果(发光二极管==0){
IOWR_32DIRECT(PIO_LEDG_基地,0,0x01);
表示_阵列[0]=led;
idx++;
}
printf(“%d”,发光二极管);
如果(idx==4)
{
printf(“\nSimon说:”);
对于(x=0;x 0)
{
msg=(INT32U)OSQPend(msgqueue,4和错误代码);
printf(“消息:%d\n”,消息);
如果((!错误代码)&&(消息==1))
printf(“(按键按下任务)按键按下0”);中断;
如果((!错误代码)&&(消息==2))
printf(“(按键按下任务)按键按下1”);中断;
如果((!错误代码)&&(消息==4))
printf(((按键按下任务)按键2按下);中断;
如果((!错误代码)&&(消息==8))
printf(((按键按下任务)按键3按下);中断;
msg=0;
}
}
}
ostimedlyhmm(0,0,1,0);
}
}
int main()
{
//创建消息队列
msgqueue=OSQCreate(&msgqueue\u tbl[0],MSG\u QUEUE\u SIZE);
//设置中断(掩码键0)
IOWR_ALTERA_AVALON_PIO_IRQ_掩码(PIO_KEY_BASE,0x0F);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE,0x01);
alt_ic_isr_寄存器(PIO_键IRQ_中断控制器ID,PIO_键IRQ,(空*)isr_键,空,空);
//创建任务
OSTaskCreate(按键按任务,空,按键按任务栈[STACKSIZE-1],按键按任务优先级);
//启动uC/OS-II
OSStart();
//不应该达到这一点
返回-1;
}

我想知道的是:

printf("\nSimon said: ");
for(x=0;x<4;x++)
printf("%d",say_array[x]);
printf("\n");
printf(“\nSimon说:”);
对于(x=0;x在
for(;)
循环中,您总是设置
say_数组[led]=led;
。例如,当
led==3
您设置
say_数组[3]=3
。尝试将数组设置为布尔值数组并切换元素,例如
say_数组[led]=!say_数组[led]
还要删除一个say_数组定义,因为您在文件范围内有一个,在函数范围内有第二个