cc interrupt2.c -o interrupt2
# ./interrupt2
01:54:04
01:54:05
01:54:06
01:54:07
01:54:08
01:54:09
01:54:10
01:54:10
#
3.3. Транзитная программа вывода текущего времени или даты в зависимости от выбранной клавиши с выходом по клавише
Отличие этой программы от предыдущих состоит в некотором усложнении логики функционирования, а также в том, что осуществляется взаимодействие между обработчиками различных прерываний.
Клавиша:
‘1’ - вывод текущего времени
‘2’ - вывод даты
‘Esc’ - выход из программы
interrupt3.c
#include <sys/neutrino.h>
#include <time.h>
#include <hw/inout.h>
int cnt, flag = 0, key = 0;
int timeok = 0, dateok = 0;
struct sigevent curtime;
time_t timeof;
char mtimeof[12];
const struct sigevent *handler (void* area, int id)
{
switch(key)
{
case 1:
flag = 1;
return(&curtime);
case 2:
timeok = 1;
dateok = 0;
break;
case 3:
dateok = 1;
timeok = 0;
}
cnt++;
if(cnt == 1000)
{
cnt = 0;
return(&curtime);
}
else return(NULL);
}
const struct sigevent *keyboard (void* area, int id)
{
key = in8(0x60);
return(NULL);
}
int main()
{
int id1, id2, i = 0;
ThreadCtl(_NTO_TCTL_IO, 0);
curtime.sigev_notify = SIGEV_INTR;
id1 = InterruptAttach( 0, &handler, NULL, NULL, 0);
id2 = InterruptAttach( 1, &keyboard, NULL, NULL, 0);
while(1)
{
if( flag == 1) break;
InterruptWait(0, NULL);
timeof = time(NULL);
if(timeok == 1)
{
strftime(mtimeof, 12, " %T", localtime(&timeof));
printf( " %s\n", mtimeof);
}
if(dateok == 1)
{
strftime(mtimeof, 12, " %D", localtime(&timeof));
printf( " %s\n", mtimeof);
}
}
InterruptDetach( id1 );
InterruptDetach( id2 );
return 0;
}
Результат выполнения программы:
# make interrupt3
cc interrupt3.c -o interrupt3
# ./interrupt3
02:31:33
02:31:34
02:31:35
02:31:36
02:31:37
02:31:38
12/17/08
12/17/08
12/17/08
02:31:42
02:31:43
12/17/08
#
3.4. Программа, маскирующая клавиатуру на 5 секунд
interrupt4.c
#include <sys/neutrino.h>
#include <time.h>
#include <hw/inout.h>
int cnt;
struct sigevent curtime;
const struct sigevent *handler (void* area, int id)
{
cnt++;
if(cnt == 1000)
{
cnt = 0;
return(&curtime);
}
else return(NULL);
}
const struct sigevent *keyboard (void* area, int id)
{
return(NULL);
}
int main()
{
int id1, id2, i;
ThreadCtl(_NTO_TCTL_IO, 0);
curtime.sigev_notify = SIGEV_INTR;
id1 = InterruptAttach( 0, &handler, NULL, NULL, 0);
id2 = InterruptAttach( 1, &keyboard, NULL, NULL, 0);
// маскирование прерывания от клавиатуры
InterruptMask(1, id2);
for(i=0; i<5; i++) // пауза 5 секунд
{
InterruptWait(0, NULL);
}
// демаскирование прерывания
InterruptUnmask(1, id2);
InterruptDetach( id1 );
InterruptDetach( id2 );
return 0;
}
Результат выполнения программы:
# make interrupt4
cc interrupt4.c -o interrupt4
# ./interrupt4
# 983443450384573
За время маскирования клавиатуры были нажаты различные клавиши. Сохраненные символы были выведены в окно терминала.
3.5. Модификация программы interrupt3.c
При запуске программы выводиться текущая дата, а время выдается на экран по запросу пользователя.
interrupt5.c
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.