Я не очень понимаю ваш вопрос (вы выполнить этот код каждую секунду через прерывание по таймеру, или?), Но есть некоторые ошибки, которые я вижу на первый взгляд:
while (magicTime == true) {
magicTimeLength++;
magicTime == magicTimeLength;
}
Последняя линия (magicTime == magicTimeLength;
) ничего не делают - он просто оценивает, равен ли magicTime
magicTimeLength
, поэтому вы входите в мертвую петлю.
Я думаю, что вы хотите сделать это:
- Init
magicTimeOccurence
со случайным значением в 5 и 10.
- Init
magicTimeLength
со случайным значением в пределах 2 и 10.
- Каждый второй, если
magicTimeOccurence
больше 0, уменьшает его значение на единицу.
- После
magicTimeOccurence
показов 0, уменьшение magicTimeLength
значение по одному.
- Проверить, если
magicTimeLength
больше 0. Если это так, это магия период времени (так, установите флаг magicTime
на номер true
). Decrement magicTimeLength
.
- Если
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 */
}
В чем заключается цель 'magicTime == magicTimeLength;'? Он сравнивает логическое значение с целым числом (что само по себе является проблемой), но не сохраняет результат нигде. –
Это вопрос и ответ. Вы задаете вопросы, мы отвечаем на них. Какой у Вас вопрос? –
Таймеры не являются частью ядра ARM (кроме ARM Cortex-M SYSCLK, но это не код Cortex-M). Периферийные устройства на микроконтроллерах на базе ARM определяются поставщиком. Вам нужно точно указать, какая часть ARM от того поставщика. Возможно, вы упростили бы всю систему, используя RTOS. – Clifford