Всё сдал! - помощь студентам онлайн Всё сдал! - помощь студентам онлайн

Реальная база готовых
студенческих работ

Узнайте стоимость индивидуальной работы!

Вы нашли то, что искали?

Вы нашли то, что искали?

Да, спасибо!

0%

Нет, пока не нашел

0%

Узнайте стоимость индивидуальной работы

это быстро и бесплатно

Получите скидку

Оформите заказ сейчас и получите скидку 100 руб.!


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

Тип Реферат
Предмет Информатика
Просмотров
555
Размер файла
44 б
Поделиться

Ознакомительный фрагмент работы:

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

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

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

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

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

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

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

Выполнил:

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

студент ФКН гр. КС-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.%02dn",

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 youn");

getch();

}

Заключение:

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


Литература:

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

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

3. http://dklab.ru/

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


Нет нужной работы в каталоге?

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

Цены ниже, чем в агентствах и у конкурентов

Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит

Бесплатные доработки и консультации

Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки

Гарантируем возврат

Если работа вас не устроит – мы вернем 100% суммы заказа

Техподдержка 7 дней в неделю

Наши менеджеры всегда на связи и оперативно решат любую проблему

Строгий отбор экспертов

К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»

1 000 +
Новых работ ежедневно
computer

Требуются доработки?
Они включены в стоимость работы

Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован

avatar
Математика
История
Экономика
icon
159599
рейтинг
icon
3275
работ сдано
icon
1404
отзывов
avatar
Математика
Физика
История
icon
156450
рейтинг
icon
6068
работ сдано
icon
2737
отзывов
avatar
Химия
Экономика
Биология
icon
105734
рейтинг
icon
2110
работ сдано
icon
1318
отзывов
avatar
Высшая математика
Информатика
Геодезия
icon
62710
рейтинг
icon
1046
работ сдано
icon
598
отзывов
Отзывы студентов о нашей работе
63 457 оценок star star star star star
среднее 4.9 из 5
Тгу им. Г. Р. Державина
Реферат сделан досрочно, преподавателю понравилось, я тоже в восторге. Спасибо Татьяне за ...
star star star star star
РЭУ им.Плеханово
Альберт хороший исполнитель, сделал реферат очень быстро, вечером заказала, утром уже все ...
star star star star star
ФЭК
Маринаааа, спасибо вам огромное! Вы профессионал своего дела! Рекомендую всем ✌🏽😎
star star star star star

Последние размещённые задания

Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн

Подогнать готовую курсовую под СТО

Курсовая, не знаю

Срок сдачи к 7 дек.

только что
только что

Выполнить задания

Другое, Товароведение

Срок сдачи к 6 дек.

1 минуту назад

Архитектура и организация конфигурации памяти вычислительной системы

Лабораторная, Архитектура средств вычислительной техники

Срок сдачи к 12 дек.

1 минуту назад

Организации профилактики травматизма в спортивных секциях в общеобразовательной школе

Курсовая, профилактики травматизма, медицина

Срок сдачи к 5 дек.

2 минуты назад

краткая характеристика сбербанка анализ тарифов РКО

Отчет по практике, дистанционное банковское обслуживание

Срок сдачи к 5 дек.

2 минуты назад

Исследование методов получения случайных чисел с заданным законом распределения

Лабораторная, Моделирование, математика

Срок сдачи к 10 дек.

4 минуты назад

Проектирование заготовок, получаемых литьем в песчано-глинистые формы

Лабораторная, основы технологии машиностроения

Срок сдачи к 14 дек.

4 минуты назад

2504

Презентация, ММУ одна

Срок сдачи к 7 дек.

6 минут назад

выполнить 3 задачи

Контрольная, Сопротивление материалов

Срок сдачи к 11 дек.

6 минут назад

Вам необходимо выбрать модель медиастратегии

Другое, Медиапланирование, реклама, маркетинг

Срок сдачи к 7 дек.

7 минут назад

Ответить на задания

Решение задач, Цифровизация процессов управления, информатика, программирование

Срок сдачи к 20 дек.

7 минут назад
8 минут назад

Все на фото

Курсовая, Землеустройство

Срок сдачи к 12 дек.

9 минут назад

Разработка веб-информационной системы для автоматизации складских операций компании Hoff

Диплом, Логистические системы, логистика, информатика, программирование, теория автоматического управления

Срок сдачи к 1 мар.

10 минут назад
11 минут назад

перевод текста, выполнение упражнений

Перевод с ин. языка, Немецкий язык

Срок сдачи к 7 дек.

11 минут назад
planes planes
Закажи индивидуальную работу за 1 минуту!

Размещенные на сайт контрольные, курсовые и иные категории работ (далее — Работы) и их содержимое предназначены исключительно для ознакомления, без целей коммерческого использования. Все права в отношении Работ и их содержимого принадлежат их законным правообладателям. Любое их использование возможно лишь с согласия законных правообладателей. Администрация сайта не несет ответственности за возможный вред и/или убытки, возникшие в связи с использованием Работ и их содержимого.

«Всё сдал!» — безопасный онлайн-сервис с проверенными экспертами

Используя «Свежую базу РГСР», вы принимаете пользовательское соглашение
и политику обработки персональных данных
Сайт работает по московскому времени:

Вход
Регистрация или
Не нашли, что искали?

Заполните форму и узнайте цену на индивидуальную работу!

Файлы (при наличии)

    это быстро и бесплатно