Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний» icon

Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний»



НазваниеОтчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний»
Одинец Д.Н
Дата17.10.2016
Размер
ТипОтчет

Белорусский Государственный Университет Информатики и Радиоэлектроники


Кафедра ЭВМ


Отчет по лабораторной работе № 4

Тема: «Программирование контроллера прерываний»


Выполнил:

студент гр.05050x evg


Проверил:

к.т.н., доцент __________________ Одинец Д.Н.


Минск 2012
  1. Постановка задачи.


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

  1. Выводить на экран в двоичной форме следующие регистры контроллеров прерывания (как ведущего, так и ведомого):

  • регистр запросов на прерывания;

  • регистр обслуживаемых прерываний;

  • регистр масок.

При этом значения регистров должны выводиться всегда в одно и то же место экрана.

  1. Осуществлять переход на стандартные обработчики аппаратных прерываний, для обеспечения нормальной работы компьютера.
^

  1. Алгоритм решения задачи.

    1. Все векторы аппаратных прерываний ведущего и ведомого контроллера переносятся на пользовательские прерывания с помощью функций getvect и setvect.

    2. Производится инициализация контроллеров, заключающаяся в последовательности команд: ICW1, ICW2, ICW3 и ICW4.

    3. ^

      С помощью функции _dos_keep осуществляется выход в DOS, при этом программа остаётся резидентной.

    4. В каждом обработчике выводятся в видеопамять в двоичной форме значения регистров запросов на прерывания, обслуживаемых прерываний, масок. Затем вызываются стандартные обработчики прерываний.

^

  1. Листинг программы.


#include

#include

#include


void printToVideoMemory(char* str, int x, int y, unsigned char attribute);

void byteToString(unsigned char temp, char *str);

void print();

void interrupt new_8(...);

void interrupt new_9(...);

void interrupt new_10(...);

void interrupt new_11(...);

void interrupt new_12(...);

void interrupt new_13(...);

void interrupt new_14(...);

void interrupt new_15(...);

void interrupt new_70(...);

void interrupt new_71(...);

void interrupt new_72(...);

void interrupt new_73(...);

void interrupt new_74(...);

void interrupt new_75(...);

void interrupt new_76(...);

void interrupt new_77(...);

void interrupt (*old_8)(...);

void interrupt (*old_9)(...);

void interrupt (*old_10)(...);

void interrupt (*old_11)(...);

void interrupt (*old_12)(...);

void interrupt (*old_13)(...);

void interrupt (*old_14)(...);

void interrupt (*old_15)(...);

void interrupt (*old_70)(...);

void interrupt (*old_71)(...);

void interrupt (*old_72)(...);

void interrupt (*old_73)(...);

void interrupt (*old_74)(...);

void interrupt (*old_75)(...);

void interrupt (*old_76)(...);

void interrupt (*old_77)(...);

void main()

{

// Изменяем таблицу векторов прерывания

old_8 = getvect(0x8); // IRQ0 прерывание таймера,

// возникает 18,2 раза в секунду.

old_9 = getvect(0x9); // IRQ1 прерывание от клавиатуры.

old_10 = getvect(0xA); // IRQ2 используется для каскадирования

// аппаратных прерываний

old_11 = getvect(0xB); // IRQ3 прерывание асинхронного

// порта COM2.

old_12 = getvect(0xC); // IRQ4 прерывание асинхронного

// порта COM1.

old_13 = getvect(0xD); // IRQ5 прерывание от контроллера

// жесткого диска для XT.

old_14 = getvect(0xE); // IRQ6 прерывание генерируется

// контроллером флоппи диска

old_15 = getvect(0xF); //IRQ7 прерывание принтера.

old_70 = getvect(0x70); //IRQ8 прерывание от

// часов реального времени.

old_71 = getvect(0x71); //IRQ9 прерывание от контроллера EGA.

old_72 = getvect(0x72); //IRQ10 зарезервировано.

old_73 = getvect(0x73); //IRQ11 зарезервировано.

old_74 = getvect(0x74); //IRQ12 зарезервировано.

old_75 = getvect(0x75); //IRQ13 прерывание от

// математического сопроцессора.

old_76 = getvect(0x76); //IRQ14 прерывание от

// контроллера жесткого диска.

old_77 = getvect(0x77); //IRQ15 зарезервировано.

setvect(0x78, new_8);

setvect(0x79, new_9);

setvect(0x7A, new_10);

setvect(0x7B, new_11);

setvect(0x7C, new_12);

setvect(0x7D, new_13);

setvect(0x7E, new_14);

setvect(0x7F, new_15);


setvect(0x80, new_70);

setvect(0x81, new_71);

setvect(0x82, new_72);

setvect(0x83, new_73);

setvect(0x84, new_74);

setvect(0x85, new_75);

setvect(0x86, new_76);

setvect(0x87, new_77);

// Инициализация ведущего контроллера

unsigned char value = inp(0x21); // Запоминаем регистр масок

outp(0x20, 0x11); // ICW1 (инициализация ведущего контроллера) –

// ICW4 будет вызвана,

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

outp(0x21, 0x78); // ICW2

outp(0x21, 0x04); // ICW3

outp(0x21, 0x01); // ICW4

outp(0x21, value); // Восстанавливаем регистр масок

// Инициализация ведомого контроллера

value = inp(0xA1); // Запоминаем регистр масок

outp(0xA0, 0x11); // ICW1

outp(0xA1, 0x80); // ICW2

outp(0xA1, 0x02); // ICW3

outp(0xA1, 0x01); // ICW4

outp(0xa1, value); // Восстанавливаем регистр масок

_dos_keep(0,(_DS-_CS)+(_SP/16)+1); // Оставить

// программу резидентной

}

// Байт в строку в двоичном виде

void byteToString(unsigned char temp, char *str)

{

int i;

str[8] = 0;

i=7;

while(temp)

{

str[i]='0'+temp%2;

temp=temp/2;

i--;

}

for(;i>-1;i--)

str[i]='0';

}

void printToVideoMemory(char* str, int x, int y, unsigned char attribute)

{

char far* start = (char far*)0xb8000000;

start += x+160*y;

int i = 0;

while(str[i] != 0)

{

*start = str[i];

start++;

*start = attribute;

start++;

i++;

}

}

void print()

{

unsigned char isr_master, isr_slave; // Interrupt Service Register

unsigned char irr_master, irr_slave; // Interrupt Request Register

unsigned char imr_master, imr_slave; // Interrupt Mask Register

imr_master = inp(0x21);

imr_slave = inp(0xA1);


outp(0x20, 0x0A);

irr_master = inp(0x20);

outp(0x20, 0x0B);

isr_master = inp(0x20);


outp(0xA0,0x0A);

irr_slave = inp(0xA0);

outp(0xA0,0x0B);

isr_slave = inp(0xA0);

char str[9];

printToVideoMemory(^ "MASTER PIC ->> ISR: ",0, 0, 0x6E);

byteToString(isr_master, str);

printToVideoMemory(str, 44, 0, 0x6E);

printToVideoMemory(" | IRR: ",60, 0, 0x6E);

byteToString(irr_master, str);

printToVideoMemory(str, 80, 0, 0x6E);


printToVideoMemory(" | IMR: ", 96, 0, 0x6E);

byteToString(imr_master, str);

printToVideoMemory(str, 116, 0, 0x6E);

printToVideoMemory(^ "SLAVE PIC ->> ISR: ", 0, 1, 0x1E);

byteToString(isr_slave, str);

printToVideoMemory(str, 44, 1, 0x1E);

printToVideoMemory(" | IRR: ", 60, 1, 0x1E);

byteToString(irr_slave, str);

printToVideoMemory(str, 80, 1, 0x1E);


printToVideoMemory(" | IMR: ",96, 1, 0x1E);

byteToString(imr_slave, str);

printToVideoMemory(str, 116, 1, 0x1E);

}


void interrupt new_8(...)

{

print();

(*old_8)();

}


void interrupt new_9(...)

{

print();

(*old_9)();

}

void interrupt new_10(...)

{

print();

(*old_10)();

}

void interrupt new_11(...)

{

print();

(*old_11)();

}

void interrupt new_12(...)

{

print();

(*old_12)();

}

void interrupt new_13(...)

{

print();

(*old_13)();

}

void interrupt new_14(...)

{

print();

(*old_14)();

}

void interrupt new_15(...)

{

print();

(*old_15)();

}


void interrupt new_70(...)

{

print();

(*old_70)();

}

void interrupt new_71(...)

{

print();

(*old_71)();

}

void interrupt new_72(...)

{

print();

(*old_72)();

}

void interrupt new_73(...)

{

print();

(*old_73)();

}

void interrupt new_74(...)

{

print();

(*old_74)();

}

void interrupt new_75(...)

{

print();

(*old_75)();

}

void interrupt new_76(...)

{

print();

(*old_76)();

}

void interrupt new_77(...)

{

print();

(*old_77)();

}

  1. Результаты работы программы.

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




Похожие:

Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний» iconОтчёт к лабораторной работе №8 по дисциплине «Программирование на языках высокого уровня» Обработка двоичных файлов
Освоить работу с двоичными файлами. Создавать и использовать собственные структуры данных
Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний» iconОтчет по лабораторной работе №4 Тема: «Оценка качества классификации»
Исследовать и сравнить два любых построенных в предыдущих работах классификатора
Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний» iconОтчет по лабораторной работе №2 по дисциплине «Базы знаний и экспертные системы»
Основная цель работы это сделать модель предметной области «Музыкальные инструменты»
Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний» iconОтчет по лабораторной работе №2 тема: Применение case-средств для описания документооборота
Целью проведения работы является закрепление теоретических знаний по моделированию процессов обработки документов, совершенствование...
Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний» iconОтчет по лабораторной работе №2 Тема: «Стекло и строительные материалы на основе минеральных вяжущих»
Упругие свойства делают стекло сходным с твёрдыми кристаллическими телами, а отсутствие кристаллографической симметрии (и связанная...
Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний» iconОтчет по лабораторной работе №4 тема: Регистрация документа. Задание маршрута прохождения документа
Цель работы: Научиться регистрировать документ и задавать маршрут прохождения. Научиться создавать цепочки поручений по документу,...
Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний» iconОтчёт по лабораторной работе №1
После окончания всех переходных процессов связанных с дешифрацией и пересылкой данных, процессор формирует управляющий сигнал wr,...
Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний» iconСправочник по специальным функциям. Skp-56/120hx гибридно-клавишная телефонная система. Содержание
Программирование системного быстрого набора Программирование персонального быстрого набора
Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний» iconСодержание инструктажей по технике безопасности в 7 классе
Инструктаж №1 по лабораторной работе «Измерение физических величин с учетом аб­солютной погрешности»
Отчет по лабораторной работе №4 Тема: «Программирование контроллера прерываний» iconСодержание инструктажей по технике безопасности в 9 классе
Инструктаж №1 по лабораторной работе «Исследование равноускоренного движения без начальной скорости»
Разместите ссылку на наш сайт:
Справочники, творчество


База данных защищена авторским правом ©dmee.ru 2000-2014
При копировании материала обязательно указание активной ссылки открытой для индексации.
контакты