Файл 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

}