Изучение принципов обработки аппаратных прерываний. Логика взаимодействия процессора и контроллера прерываний, страница 10

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