Изучение основных принципов организации и обслуживания аппаратных прерываний в ОС DOS и QNX

Страницы работы

Содержание работы

Санкт-Петербургский Государственный Политехнический Университет

Факультет Технической Кибернетики

Кафедра Компьютерных систем и Программных технологий

Отчет

о лабораторной работе №5

«Аппаратные прерывания в DOSи QNX»

по дисциплине «Системное программное обеспечение».

Работу выполнил студент группы 4081/2

Радзивиллович Мария

Преподаватель: Душутина Елена Владимировна

Санкт-Петербург

2010


1. Цель работы.

Изучить основные принципы организации и обслуживания аппаратных прерываний в ОС DOS и QNX.

2. Программа работы. 

Написать следующие программы на C для QNX и на Assembler для DOS:

  • транзитную программу вывода текущего времени;
  • эту же программу с выходом по клавише; 
  • транзитную программу вывода текущего времени или даты в зависимости от выбранной клавиши с выходом по клавише;
  • программу, маскирующую клавиатуру на 5 секунд: экспериментально определите, сохраняются ли набираемые символы.

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

3. Выполнение работы.

3.1. Транзитная программа вывода текущего времени.

Данную программу будем писать только для QNX, так как процесс можно будет в любой момент завершить, послав ему сигнал SIGINT посредством нажатия Ctrl+C. В DOS такая программа приведет к зависанию системы.

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

#include <stdio.h>

//для работы с прерываниями

#include <sys/neutrino.h>

//для обработки ошибок

#include <errno.h>

//обработчик прерывания от таймера

//возвращает указатель на событие

//аргументы: area и идентификатор

const struct sigevent* timer0_int (void *area, int id);

struct sigevent time_event;

//может измениться в любой момент, не кэшировать

volatile int counter=0;

int main (void) {

      int inter_id;

      time_t cur_time;

      //запрос на использование привиллегированного ввода/вывода

      //(для возможности использования прерываний)

      ThreadCtl(_NTO_TCTL_IO,0);

      //макрос для определения типа  "прерывание" структуры sigevent

      SIGEV_INTR_INIT(&time_event);

      //подключние обработчика прерывания

      inter_id=InterruptAttach(0, timer0_int, NULL,0,0);

      //проверка на наличие ошибок

      if (inter_id == -1) {

            printf("%s\n",strerror(errno));

            return 1;

      }

      while (1) {

            //ждем события "прерывание"

            InterruptWait(NULL,NULL);

            cur_time=time(NULL);

            printf("%s",ctime(&cur_time));

      }

}

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

      counter++;

      //если прошло 1000 мс, обнуляем счетчик и генерируем событие

      if (counter == 1000) {

            counter = 0;

            return &time_event;

      }

      else return NULL;

}

Результаты испытаний:

# ./print_time.out

Tue Jan  1 08:48:24 2002

Tue Jan  1 08:48:25 2002

Tue Jan  1 08:48:26 2002

Tue Jan  1 08:48:27 2002

Tue Jan  1 08:48:28 2002

Tue Jan  1 08:48:29 2002

Tue Jan  1 08:48:30 2002

Похожие материалы

Информация о работе