Использование таймеров в ARM-программировании - PullRequest
1 голос
/ 05 января 2012

Я пишу игру типа понг на языке C, которая будет работать на плате ARM через ЖК-экран. Часть требований к игре называется «волшебное время».

Период "магического времени" происходит через случайные интервалы между 5 и 10 секундами, т.е. между 5 и 10 секундами после последнего периода "магического времени", и длится в течение случайной продолжительности от 2 до 10 секунд.

1 Ответ

2 голосов
/ 05 января 2012

Я не совсем понимаю ваш вопрос (вы выполняете этот код каждую секунду через прерывание по таймеру или?), Но есть некоторые ошибки, которые я вижу на первый взгляд:

while (magicTime == true) {
    magicTimeLength++;
    magicTime == magicTimeLength;
}

Последняя строка (magicTime == magicTimeLength;) ничего не делает - она ​​просто оценивает, равен ли magicTime magicTimeLength, поэтому вы попадете в тупик.

Я думаю, что вы хотите сделать это:

  1. Инициация magicTimeOccurence со случайным значением в пределах 5 и 10.
  2. Инициация magicTimeLength со случайным значением в пределах 2 и 10.
  3. Каждую секунду, если magicTimeOccurence больше 0, уменьшается его значение на единицу.
  4. Как только magicTimeOccurence достигнет 0, уменьшите значение magicTimeLength по одному.
  5. Проверьте, если magicTimeLength больше 0. Если это так, это волшебство период времени (поэтому установите флаг magicTime на true). декремент magicTimeLength.
  6. Если magicTimeLength, установите magicTime на false и перейдите к шагу 1.

Вам следует инициализировать ваше timer0 прерывание с периодом 1 с. Я думаю, что вы сделали это с

/* Set timer 0 period */
T0PR = 0;
T0MR0 = SYS_GetFpclk(TIMER0_PCLK_OFFSET)/(TIMER0_TICK_PER_SEC);

, но убедитесь, что он срабатывает каждую секунду.

Вот пример кода, он должен показать вам, что я имею в виду.

/* In     void InitTimer0Interrupt() */

...
T0TCR_bit.CE = 1;     /* Counting Enable */

magicTimeOccurence = 5+(rand()%5);
magicTimeLength = 2+(rand()%8);
magicTime = false;

    __enable_interrupt();
}

/* In     void Timer0IntrHandler (void) */

void Timer0IntrHandler (void) {


    /* clear interrupt */
    T0IR_bit.MR0INT = 1;
    VICADDRESS = 0;
    if(magicTimeOccurence > 0)
    {
        magicTimeOccurence--;
    }
    else if(magicTimeLength > 0){
        magicTime = true;
        magicTimeLenght--;
    }
    else{
        magicTime = false;
        magicTimeOccurence = 5+(rand()%5);
        magicTimeLength = 2+(rand()%8);
    }

     /* take action on timer interrupt */
}
...