Банк рефератов содержит более 364 тысяч рефератов, курсовых и дипломных работ, шпаргалок и докладов по различным дисциплинам: истории, психологии, экономике, менеджменту, философии, праву, экологии. А также изложения, сочинения по литературе, отчеты по практике, топики по английскому.
Полнотекстовый поиск
Всего работ:
364139
Теги названий
Разделы
Авиация и космонавтика (304)
Административное право (123)
Арбитражный процесс (23)
Архитектура (113)
Астрология (4)
Астрономия (4814)
Банковское дело (5227)
Безопасность жизнедеятельности (2616)
Биографии (3423)
Биология (4214)
Биология и химия (1518)
Биржевое дело (68)
Ботаника и сельское хоз-во (2836)
Бухгалтерский учет и аудит (8269)
Валютные отношения (50)
Ветеринария (50)
Военная кафедра (762)
ГДЗ (2)
География (5275)
Геодезия (30)
Геология (1222)
Геополитика (43)
Государство и право (20403)
Гражданское право и процесс (465)
Делопроизводство (19)
Деньги и кредит (108)
ЕГЭ (173)
Естествознание (96)
Журналистика (899)
ЗНО (54)
Зоология (34)
Издательское дело и полиграфия (476)
Инвестиции (106)
Иностранный язык (62791)
Информатика (3562)
Информатика, программирование (6444)
Исторические личности (2165)
История (21319)
История техники (766)
Кибернетика (64)
Коммуникации и связь (3145)
Компьютерные науки (60)
Косметология (17)
Краеведение и этнография (588)
Краткое содержание произведений (1000)
Криминалистика (106)
Криминология (48)
Криптология (3)
Кулинария (1167)
Культура и искусство (8485)
Культурология (537)
Литература : зарубежная (2044)
Литература и русский язык (11657)
Логика (532)
Логистика (21)
Маркетинг (7985)
Математика (3721)
Медицина, здоровье (10549)
Медицинские науки (88)
Международное публичное право (58)
Международное частное право (36)
Международные отношения (2257)
Менеджмент (12491)
Металлургия (91)
Москвоведение (797)
Музыка (1338)
Муниципальное право (24)
Налоги, налогообложение (214)
Наука и техника (1141)
Начертательная геометрия (3)
Оккультизм и уфология (8)
Остальные рефераты (21692)
Педагогика (7850)
Политология (3801)
Право (682)
Право, юриспруденция (2881)
Предпринимательство (475)
Прикладные науки (1)
Промышленность, производство (7100)
Психология (8692)
психология, педагогика (4121)
Радиоэлектроника (443)
Реклама (952)
Религия и мифология (2967)
Риторика (23)
Сексология (748)
Социология (4876)
Статистика (95)
Страхование (107)
Строительные науки (7)
Строительство (2004)
Схемотехника (15)
Таможенная система (663)
Теория государства и права (240)
Теория организации (39)
Теплотехника (25)
Технология (624)
Товароведение (16)
Транспорт (2652)
Трудовое право (136)
Туризм (90)
Уголовное право и процесс (406)
Управление (95)
Управленческие науки (24)
Физика (3462)
Физкультура и спорт (4482)
Философия (7216)
Финансовые науки (4592)
Финансы (5386)
Фотография (3)
Химия (2244)
Хозяйственное право (23)
Цифровые устройства (29)
Экологическое право (35)
Экология (4517)
Экономика (20644)
Экономико-математическое моделирование (666)
Экономическая география (119)
Экономическая теория (2573)
Этика (889)
Юриспруденция (288)
Языковедение (148)
Языкознание, филология (1140)

Реферат: Программирование системного таймера

Название: Программирование системного таймера
Раздел: Рефераты по информатике
Тип: реферат Добавлен 06:09:30 27 июня 2011 Похожие работы
Просмотров: 56 Комментариев: 19 Оценило: 2 человек Средний балл: 5 Оценка: неизвестно     Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ

ХАРЬКОВСКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ

имени В.Н. Каразина

Курсовой проект

Дисциплина: архитектура ПК

Тема: « Программирование системного таймера»

Выполнил:

Шульга Сергей Олегович

студент ФКН гр. КС-31

Харьков

2010


Цель

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

Основные сведения

Программирование таймера на уровне портов

Таймеру соответствуют четыре порта ввода/вывода со следующими адресами:

40h - канал 0;

41h - канал 1;

42h - канал 2;

43h - управляющий регистр.

Приведем формат управляющего регистра:

Все управление таймером осуществляется путем вывода одного байта в порт 43h. Рассмотрим назначение бит в этом байте.

биты 7 – 6: если не 11 — это номер канала, который будет программироваться

00,01,10 = канал 0,1,2

биты 5 – 4:

00 — зафиксировать текущее значение счетчика для чтения (в этом случае биты 3 – 0 не используются)

01 — чтение/запись только младшего байта

10 — чтение/запись только старшего байта

11 — чтение/запись сначала младшего, а потом старшего байта

биты 3 – 1: режим работы канала

000: прерывание IRQ0 при достижении нуля

001: ждущий мультивибратор

010: генератор импульсов

011: генератор прямоугольных импульсов (основной режим)

100: программно запускаемый одновибратор

101: аппаратно запускаемый одновибратор

бит 0: формат счетчика:

0 — двоичное 16-битное число (0000 – FFFFh)

1 — двоично-десятичное число (0000 – 9999)

Если биты 7 – 6 равны 11, считается, что байт, посылаемый в порт 43h, — команда чтения счетчиков, формат которой отличается от команды программирования канала:

биты 7 – 6: 11 (код команды чтения счетчиков)

биты 5 – 4: режим чтения:

00: сначала состояние канала/потом значение счетчика

01: значение счетчика

10: состояние канала

биты 3 – 1: команда относится к каналам 3 – 1

Таймер и динамик

Одно из наиболее распространенных применений таймера - генерация звуковых сигналов и воспроизведение музыки. Таймер позволяет воспроизводить музыку в фоновом режиме, т.е. во время работы программы может звучать музыка.

Как мы уже говорили, канал 2 микросхемы 8254 связан с громкоговорителем компьютера. Однако громкоговоритель не просто соединен с выходом OUT канала 2. Порт вывода 61h также используется для управления громкоговорителем. Младший бит порта 61h подключен ко входу GATE канала 2 таймера. Этот бит при установке в 1 разрешает работу канала, т.е. генерацию импульсов для громкоговорителя.

Дополнительно для управления громкоговорителем используется бит 1 порта 61h. Если этот бит установлен в 1, импульсы от канала 2 таймера смогут проходить на громкоговоритель.

Таким образом, для включения звука надо выполнить следующие действия:

запрограммировать канал 2 таймера на нужную частоту (т.е. загрузить регистр счетчика канала нужным значением);

для включения звука установить в 1 два младших бита порта 61h.

Так как остальные 6 битов порта 61h используются для других целей, установка младших битов должна выполняться таким образом, чтобы значения остальных битов не были изменены. Для этого вначале надо считать байт из порта 61h в рабочую ячейку памяти, установить там нужные биты, затем вывести новое значение байта в порт 61h.

Очевидно, что для выключения звука надо сбросить два младших бита порта 61h в 0 (при этом нельзя изменять значение остальных битов этого порта).

Мелодия (одноголосая), как известно, состоит из нот, разделенных или не разделенных паузами. При проигрывании мелодии необходимо для каждой ноты программировать соответствующим образом канал 2 таймера и включать громкоговоритель (с помощью порта 61h) на определенное время, равное длительности ноты. Затем программа должна выключить динамик и выдержать паузу перед проигрыванием следующей ноты, если такая пауза требуется.

Пример функции:

void tm_sound(int freq, int time) {

int cnt, i;

outportb(0x43, 0xb6); // Задаем режим канала 2 таймера

cnt = 1193180L / freq; // Вычисляем задержку для загрузки в

// регистр счетчика таймера

outportb(0x42, cnt & 0x00ff); // Загружаем регистр счетчика таймера - //сначала младший, затем старший байты

outportb(0x42, (cnt &0xff00) >> 8);

outportb(0x61, inp(0x61) | 3); // Включаем громкоговоритель. Сигнал от

// канала 2 таймера теперь будет проходить

// на вход громкоговорителя.

delay(time); // Выполняем задержку.

outportb(0x61, inp(0x61) & 0xfc); // Выключаем громкоговоритель.

}

Изменение частоты генерации IRQ0 .

Таймер имеет кварцевый генератор (или часы), которые "тикают" ровно 119318 раз в секунду. Нулевой канал, который мы будем рассматривать, имеет так называемый счетчик. Этот счетчик возрастает на 1 каждый "тик" часов. Когда он достигает некоторого граничного значения (которое можно установить программно), он сбрасывается, и генерируется прерывание 8.

Схематическое представление:

BIOS устанавливает это граничное значение в 0, что для таймера обозначает 65536. То есть каждый 65536-й "тик" часов генерируется прерывание 8, оно "срабатывает" примерно 119318/65536=18.2 раз в секунду.

outportb(0x43,6); /* channel state */

outportb(0x40,(char)cnt); /* low byte */

outportb(0x40,(char)(cnt>>8)); /* hi byte */

Запустим подобную программу на выполнение, скажем, со значнием cnt=65536/8. Когда она отработает, мы увидим, что часы станут идти в 8 раз быстрее! Это происходит оттого, что после выхода из программы необходимо установить старый счетчик, который устанавливал BIOS, то есть 0.

Однако и это не решит до конца проблему. Ведь на период работы программы часы все равно будут идти в 8 раз быстрее, то есть после выхода из программы собьется время. Этого можно избежать, если написать "заплату" на 8-е прерывание таким образом, чтобы BIOS-обработчик вызывался не каждый раз, а лишь каждый восьмой. При этом в остальные семь раз необходимо посылать в 20h-й порт значение 20h, чтобы разрешить следующие прерывания от таймера (если этого не делать, прерывание 8 вызовется только один раз.

Далее пример как избежать этого:

unsigned BIOSTimerSpeed=1;

unsigned TimerFreq=(unsigned)(1193181L/65536L);

void interrupt (*SvInt08)(…)=NULL;

void Set8254Counter(unsigned cnt)

{ long l=cnt;

if(!cnt) l=65536L; /* если 0, то на самом деле 65536 */

BIOSTimerSpeed=(unsigned)(65536L/l);

outportb(0x43,6);

outportb(0x40,(char)cnt);

outportb(0x40,(char)(cnt>>8));

}

void interrupt NewInt08(…)

{ static cnt=0;

cnt++; /* увеличить счетчик пропущенных тиков */

/* если пора вызывать обработчик BIOS...*/

if(cnt>=BIOSTimerSpeed) { cnt=0; SvInt08(); }

/ иначе разрешить следующие прерывания */

else outportb(0x20,0x20);

}

void DeactivateTimer(void); /* предварительное описание */

int SetTimer(unsigned cnt)

{ /* если передается 0, то отключить нашу

процедуру обработки */

if(!cnt)

{ Set8254Counter(0);

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

if(SvInt08) setvect(8,SvInt08);

return 0;

}

TimerFreq=1193181L/cnt;

Set8254Counter(cnt);

SvInt08=getvect(8); setvect(8,NewInt08);

atexit(DeactivateTimer);

return 1;

}

void SetTimerFreq(unsigned freq)

{ SetTimer((unsigned)(1193181L/freq)); }

void DeactivateTimer(void)

{ SetTimer(0); }


Демонстрационная программа :

#include <dos.h>

#include <math.h>

#include <stdlib.h>

#include <graphics.h>

#include <time.h>

#include <conio.h>

#include <bios.h>

#include <stdio.h>

unsigned BIOSTimerSpeed=1;

unsigned TimerFreq=(unsigned)(1193181L/65536L);

void interrupt (*SvInt08)(...)=NULL;

int mary[] = {

330, 294, 262, 294, 330, 330, 330,

294, 294, 294, 330, 392, 392,

330, 294, 262, 294, 330, 330, 330, 330,

294, 294, 330, 294, 262, 0

};

int del[] = {

500, 500, 500, 500, 500, 500, 1000,

500, 500, 1000, 500, 500, 1000,

500, 500, 500, 500, 500, 500, 500, 500,

500, 500, 500, 500, 2000

};

void Set8254Counter(unsigned cnt)

{ long l=cnt;

if(!cnt) l=65536L;

BIOSTimerSpeed=(unsigned)(65536L/l);

outportb(0x43,6);

outportb(0x40,(char)cnt);

outportb(0x40,(char)(cnt>>8));

}

void interrupt NewInt08(...)

{ static cnt=0;

cnt++;

if(cnt>=BIOSTimerSpeed) { cnt=0; SvInt08(); }

else outportb(0x20,0x20);

}

void DeactivateTimer(void);

int SetTimer(unsigned cnt)

{

if(!cnt)

{ Set8254Counter(0);

if(SvInt08) setvect(8,SvInt08);

return 0;

}

TimerFreq=1193181L/cnt;

Set8254Counter(cnt);

SvInt08=getvect(8);

//setvect(8,NewInt08);

//atexit(DeactivateTimer);

return 1;

}

void SetTimerFreq(unsigned freq)

{ SetTimer((unsigned)(1193181L/freq)); }

void DeactivateTimer(void)

{ SetTimer(0); }

void printtime()

{

struct time t;

gettime(&t);

printf("The current time is: %2d:%02d:%02d.%02d\n",

t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);

}

void rnd_set(int bound) {

outportb(0x43, 0xb6);

outportb(0x42, bound & 0x00ff);

outportb(0x42, (bound &0xff00) >> 8);

outportb(0x61, inp(0x61) | 1);

}

int rnd_get(void) {

int i;

outportb(0x43, 0x86);

i = inportb(0x42);

i = (inportb(0x42) << 8) + i;

return(i);

}

void tm_sound(int freq, int time)

{

int cnt, i;

outp(0x43, 0xb6);

cnt = 1193180L / freq;

outp(0x42, cnt & 0x00ff);

outp(0x42, (cnt &0xff00) >> 8);

outp(0x61, inp(0x61) | 3);

delay(time);

outp(0x61, inp(0x61) & 0xfc);

}

void main()

{

int i;

for(i=0 ;mary[i] != 0 ;i++)

tm_sound(mary[i], del[i]);

//printtime();

SetTimerFreq(182);

puts("Press any key for continue");

getch();

for(i=0 ;mary[i] != 0 ;i++)

tm_sound(mary[i], del[i]);

//delay(50000);

//printtime();

SetTimer(0);

puts("Press any key for continue");

getch();

int j;

printf("\nRandom number generator"

"\nPress any key"

"\n");

for(int k=0;k<10;k++) {

rnd_set(80);

getch();

j = rnd_get();

for(i=0; i < j; i++) putchar(219);

printf("\n");

}

puts("Thank you\n");

getch();

}

Заключение:

Таймеры важны для работы любой многозадачной системы по ряду причин. Среди многих других задач, они следят за временем суток и не позволяют одному процессу надолго занять ЦП.


Литература:

1. «Современные операционные системы», Э. Таненбаум, Издательство «Питер», 2010 г.

2. «Операционные системы», В.Столингс, 2002 г.

3. http://dklab.ru/

4. http://www.lib.csu.ru/

Оценить/Добавить комментарий
Имя
Оценка
Комментарии:
Хватит париться. На сайте FAST-REFERAT.RU вам сделают любой реферат, курсовую или дипломную. Сам пользуюсь, и вам советую!
Никита00:31:39 05 ноября 2021
.
.00:31:37 05 ноября 2021
.
.00:31:36 05 ноября 2021
.
.00:31:35 05 ноября 2021
.
.00:31:32 05 ноября 2021

Смотреть все комментарии (19)
Работы, похожие на Реферат: Программирование системного таймера

Назад
Меню
Главная
Рефераты
Благодарности
Опрос
Станете ли вы заказывать работу за деньги, если не найдете ее в Интернете?

Да, в любом случае.
Да, но только в случае крайней необходимости.
Возможно, в зависимости от цены.
Нет, напишу его сам.
Нет, забью.



Результаты(294402)
Комментарии (4230)
Copyright © 2005 - 2024 BestReferat.ru / реклама на сайте