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

2.Добавление возможности выхода по клавише Esc.

Int2.c

#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;

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

      if (keybrd ==1 ){

            stopflag = 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);

            clck = time(NULL);

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

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

      }

      InterruptDetach( id1 );

      InterruptDetach( id2 );

}

Программа аналогична предыдущей. Добавился обработчик прерывания от клавиатуры, и соответственно, проверка клавиши в обработчике таймера. Результаты работы представлены ниже.

# gcc int2.c -o int2

# ./int2

14:28:46

14:28:47

14:28:48

#

3.Программа вывода времени/даты, в зависимости от нажатой клавиши (f1/f2) с выходом по клавише esc.

Int3.c

#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){

      switch(keybrd){

      case 1:                 //Esc

            stopflag = 1;

            return( NULL);

      case 0x3b:        //F1

            {     showtime = 1;

                  showdate = 0;

                  return( NULL );

            }

      case 0x3c:        //F2

            {     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 );

                  //continue;

            }

            if(showtime){    

                  clck = time(NULL);

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

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

                  //showdate=0;

            }

      }

      InterruptDetach( id1 );

      InterruptDetach( id2 );

}