В этой программе немного усложнился обработчик прерываний таймера. В зависимости от нажатой клавиши нужно совершать различные действия. Результат работы:
# 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 );
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.