Файл VSMain.c:
==============
...
int timer_ticks = 300;
//#define THROUGH_DELAYS
#define THROUGH_TIMER_INTERRUPTS
#if defined(THROUGH_DELAYS) || defined(THROUGH_TIMER_INTERRUPTS)
// Through delays
int mistakes;
int wins;
int correct;
int pressed;
#endif //THROUGH_DELAYS
#if defined(THROUGH_TIMER_INTERRUPTS)
// Through timer interrupts:
int timer_interrupt_is_needed;
int timer_out;
int timer_ticks;
int games;
int buffer[1000];
int nBuffer = -1;
#endif //THROUGH_TIMER_INTERRUPTS
void randomLamp() {
int num;
num = rand() % 4;
if ((nBuffer >= 0) && (nBuffer < 999)) {
buffer[nBuffer++] = -68;
buffer[nBuffer++] = num;
}
*(int*)0xFFFFF430 = 0xF;
delay(10000);
*(int*)0xFFFFF434 = (1<<num);
}
#if defined(THROUGH_DELAYS)
void timer0_interrupt() {
if (!--timer_ticks)
{
timer_ticks = 300;
}
}
#endif //defined(THROUGH_DELAYS)
#if defined(THROUGH_TIMER_INTERRUPTS)
void timer0_interrupt() {
if ((nBuffer >= 0) && (nBuffer < 1000)) {
buffer[nBuffer++] = timer_ticks;
}
if (timer_interrupt_is_needed) {
if (!--timer_ticks)
{
timer_out = 1;
timer_interrupt_is_needed = 0;
}
}
}
#endif
void main(void)
{
/* Define completion code variable. */
unsigned char cc;
int temp = 0;
int delay_dur = 10000000;
int i;
/* Define action expression variable. */
SEM_ACTION_EXPRESSION_TYPE actionExpressNo;
/* Define and initialize. */
SEM_EVENT_TYPE eventNo;
InitDevice();
//AT91SAM7SStartTimer0(); //nap
/* Initialize the VS System. */
SEM_InitAll();
#if (VS_REALLINKMODE == 1)
/* Initialize RealLink communication. */
RealLinkCommInit();
/* Initializing RealLink API. */
VS_RealLinkInit();
#endif
/* Initialize the VS Event queue. */
SEQ_Initialize();
/* Add SE_RESET to initialize system. */
SEQ_AddEvent(SE_RESET);
srand(time(NULL));
#if defined(THROUGH_TIMER_INTERRUPTS)
for(;;) {
mistakes = 0;
wins = 0;
correct = 1;
timer_interrupt_is_needed=0;
games = 20;
delay_dur = 300;
nBuffer = 0;
while (games >0)
{
if (correct == 1) {
if ((nBuffer >= 0) && (nBuffer < 1000)) {
buffer[nBuffer++] = -17;
}
correct = 0;
pressed = 0;
randomLamp();
if (games%4 == 1) {
delay_dur *= 0.8;
}
timer_ticks = delay_dur;
timer_out = 0;
games--;
timer_interrupt_is_needed=1;
} else if (timer_out) {
if ((nBuffer >= 0) && (nBuffer < 1000)) {
buffer[nBuffer++] = -34;
}
mistakes++;
correct = 1;
timer_ticks = delay_dur; //???
}
}
mistakes = mistakes;
}
#endif
…
}