Санкт-Петербургский Государственный Политехнический Университет
Факультет Технической Кибернетики
Кафедра Компьютерных систем и Программных технологий
Отчет
о лабораторной работе №5
«Аппаратные прерывания в DOSи QNX»
по дисциплине «Системное программное обеспечение».
Работу выполнил студент группы 4081/2
Радзивиллович Мария
Преподаватель: Душутина Елена Владимировна
Санкт-Петербург
2010
1. Цель работы.
Изучить основные принципы организации и обслуживания аппаратных прерываний в ОС DOS и QNX.
2. Программа работы.
Написать следующие программы на C для QNX и на Assembler для DOS:
Программу 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.