Управление процессами и нитями, страница 6

В этой программе немного усложнился обработчик прерываний таймера. В зависимости от нажатой клавиши нужно совершать различные действия. Результат работы:

# gcc int3.c -o int3

# ./int3

14:58:16

14:58:17

14:58:18

01/13/10

01/13/10

14:58:21

14:58:22

14:58:23

01/13/10

01/13/10

14:58:26

14:58:27

14:58:28

01/13/10

01/13/10

01/13/10

01/13/10

#

4. Программа, маскирующая клавиатуру на 5 сек. Тут используются функции

Int InterruptMask(int intr,Int id); int InterruptUnmask(int intr, int id);

Текст программы:

int4.с

#include <stdio.h>

#include <sys/neutrino.h>

#include <time.h>

#include <hw/inout.h>

int cnt = 0, stopflag = 0;

struct sigevent secpas;

time_t clck;

char clockstr[10];

int keybrd = 0;

char showdate=0,showtime=1;

const struct sigevent *clckisr( void* area, int id){

      cnt++;

      if (cnt == 1000){

            cnt = 0;

            return( &secpas );

      }

      else

            return( NULL );  

}          

const struct sigevent *keybrdisr( void* area, int id){

      return( NULL);

}

int main(){

      int i = 0, id1, id2;

      ThreadCtl( _NTO_TCTL_IO, 0 );

      secpas.sigev_notify = SIGEV_INTR;

      id1 = InterruptAttach( 0, &clckisr, NULL, NULL, 0);

      id2 = InterruptAttach( 1, &keybrdisr, NULL, NULL, 0);

      InterruptMask(1, id2);      

      for (i=0; i<5; i++){

            InterruptWait(0, NULL);

      }

      InterruptUnmask(1, id2);    

      InterruptDetach( id1 );

      InterruptDetach( id2 );

}

В результате, то, что мы набираем на клавиатуре в процессе работы программы, отображается после её завершения.

# ./int4

# otuy

5. Изменим программу так, чтобы выводилась дата, а по нажатию клавиши – время. Она почти аналогична предыдущей.

int6.с

#include <stdio.h>

#include <sys/neutrino.h>

#include <time.h>

#include <hw/inout.h>

int cnt = 0, stopflag = 0;

struct sigevent secpas;

time_t clck;

char clockstr[10];

int keybrd = 0;

char showdate=1,showtime=0;

const struct sigevent *clckisr( void* area, int id){

      switch(keybrd){

      case 1:                 //Esc

            stopflag = 1;

            return( NULL);

      case 0x3b:        //F1

            {    

                  if (showtime ==1) showtime = 0;

                  else {

                  showtime = 1;

                  showdate = 0;

                  }

                  return( NULL );

            }

      case 0x3c:        //F2

            {    

                  if (showdate == 1) showdate = 0;

                  else {

                  showtime = 0;

                  showdate = 1;

                  }

                  return( NULL );

            }

      }

      cnt++;

      if (cnt == 1000){

            cnt = 0;

            return( &secpas );

      }

      else

            return( NULL );  

}          

const struct sigevent *keybrdisr( void* area, int id)

{

      keybrd = in8(0x60);

      return( NULL);

}

int main(){

      int i = 0, id1, id2;

      ThreadCtl( _NTO_TCTL_IO, 0 );

      secpas.sigev_notify = SIGEV_INTR;

      id1 = InterruptAttach( 0, &clckisr, NULL, NULL, 0);

      id2 = InterruptAttach( 1, &keybrdisr, NULL, NULL, 0);

      while(1){

            if(stopflag)

                  break;

            InterruptWait(0, NULL);

            if (showdate){

                  clck = time(NULL);

                  strftime( clockstr, 10, "%D", localtime( &clck ) );

                  printf( "%s \n", clockstr );

                  showdate = 0;

            }

            if(showtime){    

                  clck = time(NULL);

                  strftime( clockstr, 10, "%H:%M:%S", localtime( &clck ) );

                  printf( "%s \n", clockstr );

                  showtime=0;

            }

      }

      InterruptDetach( id1 );

      InterruptDetach( id2 );

}