Розробили: проф. Сидоренко В.В., викл. Дóренський О.П., 2013
Лабораторна робота №4
ТЕМА: Таймер операційної системи DOS та Windows.
МЕТА: Набути практичних навичок з програмування таймера операційної системи DOS та системного часу ОС Windows.
Короткі теоретичні відомості
Таймер операційної системи DOS
Комп’ютери ІВМ РС у своєму складі містять годинники системного та реального часу. Функціональна схема з’єднань пристроїв, які утворюють системний та реальний час ПК наведено на рис. 1.
Системний час утворюється операційною системою (ОС) комп’ютера за допомогою інтервального таймера (1), комірок пам’яті за адресою 046Ch-0470h (4) та годинника реального часу (5).
Для утворення системного часу в ІВМ РС використовується канал 0 інтервального таймера, який запрограмований на генерацію прямокутних сигналів з частотою 18,206 Гц (тіків). Вихід канала 0 (OUT0) з’єднано зі входим IR0 контролера переривань (2, рис. 1). Таким чином генерується апаратне переривання IRQ0. Контролер переривань видає адресу програми обробника цього переривання (INT 8h). Виконуючи цей обробник, центральний процесор (3) інкрементує комірки таймера ОС 046Сh-046Fh з частотою 18,206 Гц, а при досягненні кількості тіків, яка рівна добі (1572480 тіків), у комірці пам’яті за адресою 0470h обробник встановлює 1, яка є сигналом для ОС про виклик переривання INT 1Ah, яке здійснює скид значень комірок пам’яті 046Сh-046Fh (запис значення 0) та корекцію календаря. Таким чином, відбувається перехід системного таймера на наступну добу.
Рисунок 1 – Функціональна схема системного та реального часу на платі ІВМ РС:
1 – інтервальний таймер; 2 – контролер переривань; 3 – центральний процесор;
4 – таймер операційної системи; 5 – годинник реального часу (RTC).
При ввімкненні персонального комп’ютера (ПК) системний час встановлюється на основі даних годинника реального часу (RTC) і надалі працює незалежно від нього. Велика частина прикладних та системних програм використовує цей час для розв’язування різних задач. Наприклад, ОС записує на диск дату та час створення файлів, встановлює різного роду паузи під час роботи тощо. Прикладні програми можуть періодично виконувати певні команди. Наприклад, зберігати документ на диску через кожні дві хвилини. Крім того, різні системи керування використовують системний час для своїх потреб, наприклад, для визначення термінів різних операцій, планування руху транспорту тощо.
Реальний час комп’ютера ІВМ РС реалізовано на базі мікросхеми МС46818, яка живиться від акумулятора, що дозволяє контролювати час незалежно від стану ввімкнення/вимкнення ПК. RTC містить 64 комірки пам’яті, які дозволяють утворювати календар, годинник, будильник, який може видавати сигнал у встановлений програмістом час, а також зберігає інформацію про склад і налаштування комп’ютера.
Інтервальний таймер (2) реалізовано на базі мікросхеми і8253/і8254, яка є однокристальним програмуємим пристроєм, призначеним для отримання програмно-керованих часових затримок та генерації прямокутних імпульсів програмно-керованої частоти.
Програма обробки переривання INT 1Ah здійснює керування таймером ОС, а також встановлення та зчитування даних RTC. Для отримання часових затрмок і інтервалів використовуються функції 83h та 86h програмного переривання INT 15h.
Слід зазначити, що при вимкненні ПК дані годинника операційної системи втрачаються, а RTC, який живиться від автономного джерела, – продовжує відлік часу і календаря.
Структурну схему реалізації системного часу на в ІВМ РС наведено на рис. 2.
Рисунок 2 – Структурна схема системного часу на платі ІВМ РС
Таймер операційної системи (інколи його ще називають таймером BIOS) – це 32-розрядна комірка пам’яті, яка знаходиться за початковою адресою 0000:046Сh. Ці комірки пам’яті інкрементуються перериванням Int 8h, яке генерується запитом на контролер переривань IRQ0 від OUT0 інтервального таймера (рис. 1).
При досягненні значення цих комірок, яке рівне 24 год., ОС скидає таймер в 0 і встановлює 1 в комірці пам’яті 0470h. Це служить сигннатурою кінця доби і виклику переривання корекції таймера ОС.
На лістингу 1 наведено приклад читання поточного (системного) часу з таймера ОС та виведення його у правий куток екрана.
Лістинг 4.1 – Виведення системного часу DOS
#include <stdio.h>
#include <conio.h>
#include <dos.h>
void main()
{
unsigned int hour, min, sec;
unsigned long ticks;
min=peek(0x0000,0x046c);
hour=peek(0x0000,0x046e);
ticks=hour;
ticks<<=16;
ticks|=min;
hour=ticks/65543;
min=(ticks%65543)/1092; перетворення тіків у год., хв., сек.
sec=((ticks%65543)%1092)/18.2;
printf(“%02d:%02d:%02d”,hour, min, sec);
}
Системний та локальний час Windows
Після завантаження Windows встановлює значення часу, використовуючи годинник реального часу RTC. Для забезпечення роботи ПК у глобальних мережах та зберігання правильного часу для файлыв й папок під час копіювання інформації ведення системного часу здійснюється на основі всесвітнього часу (UTC від англ. Universal Time Coordinated).
Системний час Windows – поточне значення дати й часу за Гринвічем, у нульовому часовому поясі. Додаток (програма) Windows може отримати значення системного часу викликом підпрограми (функції) GetSystemTime, яка заповнює структуру TSystemTime. Структура struct_SYSTETIME наступна:
Typedef struct_SYSTETIME
{
word wYear;
word wMonth;
word wDayOfWeek;
word wDay;
word wHour;
word wMinute;
word wSecond;
word wMillisecond;
}
Локальний (місцевий) час може відрізнятись від системного та залежить від налаштувань Windows. Додаток може отримати поточне значення локального часу викликом функції GetLocalTime.
Для роботи з таймером ОС Windows використовує функції GetSystemTime та SetSystemTime, прототипи яких містяться у бібліотеці winbase.h. GetSystemTime здійснює вибір даних зі структури SystemTime, в якій містяться дані часу.
Приклад – Программа виведення локального часу ОC Windows
#include <stdio.h>
#include <winbase.h>
void main()
{
SYSTIME st;
//читання системного часу Ос Windows GetlocalTime;
GetLocalTime(&st);
//виведення часу у форматі год:хв:сек:мілісек
printf (“ Системний час Windows: %02d:%02d:%02d:%02d”,
st.wHour, st.wMinute, st.wSecond, st.wMillisecodns);
}
Приклад – Программа виведення локальної дати ОC Windows
#include <stdio.h>
#include <winbase.h>
void main ()
{
SYSTEMTIME st;
//читання ситемного часу та календаря ОС Windows
GetLocalTime(&st);
//виведення дати у форматі "день.місяць.рік"
printf("Дата: %02d.%02d.%02d", st.wDay, st.wMonth, st.wYear);
}
Огляд компілятора C++ Builder 6
C++ Builder – це середовище швидкої розробки, в якому використовується мова С++. На сьогоднішній день цей продукт є найбільш популярним для розробки додатків (програм) для ОС Windows.
Початок роботи. Вигляд екрану після завантаження C++ Builder дещо незвичний. Замість одного вікна на екрані з’являються п’ять:
головне вікно C++ Builder 6;
вікно стартової форми – Form1;
вікно редактора властивостей об’єктів – Object Inspector;
вікно перегляду списку об’єктів – Object TreeView;
вікно редактора коду – Unit1.cpp.
У головному вікні знаходиться меню команд, панелі інструментів та палітра компонентів.
В рядку заголовку головного вікна відображається ім’я відкритого у даний момент проекта. Рядок меню вміщує команди, необхідні для розробки та тестування додатків, а також команди керування ними.
Панель інструментів вміщує кнопки, що відповідають певним командам меню, наприклад, командам Save, Run тощо.
У палітрі компонентів відображаються компоненти, за допомогою яких користувач створює свої додатки.
Компоненти є основними елементами кожного Builder-додатка і, одночасно, основою бібліотеки візуальних компонентів (VCL) С++ Builder. Піктограми стандартних компонентів розділені на групи відповідно функціям, які вони виконують. Кожна з цих груп піктограм розміщена на окремій сторінці палітри компонентів. Після запуску С++Builder активною є сторінка Standard.
Вікно стартової форми (Form1) представляє собою заготовку головного вікна додатка, що розробляється. І робота над новим проектом починається саме зі створення стартової форми, оскільки кожен додаток має хоча б одну форму, яка служить головним вікном. Стартова форма створюється шляхом зміни значень властивостей форми Form1 та додавання до форми необхідних компонентів (командних кнопок, позначок, полів введення текстової інформації тощо) з палітри компонентів.
Для розміщення компонента в формі необхідно вибрати в палітрі компонентів кнопку, що відповідає необхідному компоненту. Далі клацнути на формі. Компонент з’явиться на формі, причому його верхній лівий кут буде там, де знаходився курсор миші в момент кліка.
Крім того можна легко зробити відразу кілька копій компонента. Для цього під час вибора компонента необхідно утримувати натиснутою клавішу Shift. В такому режимі при кожному кліці на формі буде розміщуватися новий компонент. Для зупинки цього процесу необхідно клікнути на кнопці покажчика (кнопка зі стрілкою) в палітрі компонентів.
Ще С++ Builder забезпечує спрощений спосіб розміщення компонентів на формі. Якщо просто двічі клікнути на потрібній кнопці в палітрі компонентів, то компонент з’явиться на формі. При цьому він буде відцентрований горизонтально та вертикально. Такий компонент буде мати розмір за замовчуванням. Вікно Object TreeView містить ієрархічний список об’єктів, що є елементами проекту.
Для зміни значень властивостей об‘єктів, в тому числі і форми, використовується інспектор об‘єктів (Object Inspector).
У термінології візуального проектування об’єкти – це діалогові вікна та елементи управління (поля введення та виведення, командні кнопки, перемикачі тощо). А властивості об’єкта – це характеристики, які визначають вигляд, положення та поведінку об’єкта.
На вкладці Properties в лівій колонці перераховані властивості вибраного об’єкта, а в правій – вказані їхні значення.
На вкладці Events перелічені оброблювачі подій вибраного об’єкта.
Подія (Event) – це те, що відбувається під час роботи програми. В С++Builder кожній події надано ім’я. Наприклад, клік кнопкою миші – це подія OnClick, подвійний клік мишею – подія OnDblClick, натиснення клавіші клавіатури – подія OnPressKey.
Реакцією на подію має бути якась дія. Наприклад, натиснення кнопки „Close” має призводити до завершення роботи додатка, а натиснення кнопки „Обчислити” – до обчислення результату за певною формулою.
В С++Builder реакція на подію реалізується як функція обробки події. Т. б., для того, щоб програма виконала певну роботу у відповідь на дії користувача, програміст повинен написати функцію обробки відповідної події.
Отже, в лівій колонці укладки Events перераховано події, які може сприймати вибраний компонент. В правій колонці з’являється згенероване С++Builder ім’я функції обробки відповідної події.
С++Builder надає функції обробки події ім’я, що складається з двох частин. Перша частина ідентифікує форму, що містить об’єкт компонент, для якого створена функція обробки події. Друга частина імені ідентифікує сам об’єкт та подію. Наприклад:
void __fastcall TForm1::Button1Click(Tobject *Sender)
void __fastcall TMainForm::FormCreate(TObject *Sender)
Вікно редактора коду (Unit1.cpp) розділене на дві частини. У правій частині слід набирати програмний код. Проте, навіть на початку роботи над новим проектом ця частина вікна редактора коду не порожня. Вона вже містить шаблон програми C++ Builder.
Ліва частина, яка називається навігатор класів, полегшує навігацію по тексту програми. В ієрархічному списку, структура якого залежить від проекту, перелічені об’єкти проекту (форми і компоненти) та функції обробки подій. Вибравши елемент списку, можна швидко перейти до потрібного фрагменту коду.
Під час набирання тексту програми редактор коду автоматично виділяє елементи програми: напівжирним шрифтом – ключові слова мови програмування, курсивом – коментарі. Це робить текст програми більш виразнішим, що полегшує сприйняття структури програми.
Запуск програми на виконання виконується за допомогою команди Run (Пуск) головного меню C++ Builder, кнопки Run панелі інструментів або клавішею F9.
ЗАВДАННЯ
Розробити блок-схеми алгоритмів і програм для операційної системи DOS, які:
Виводить на екран значення таймера операційної системи (4-байтової комірки пам’яті з початковою адресою 046Ch);
Встановлює системний час ОС DOS N:N+10:N+15, де N – порядковий номер студента у списку;
Розробити блок-схеми алгоритмів і додатки (програми) для операційної системи Windows, які:
Після натиснення кнопки «Дата» виводить системну дату Windows;
Після натиснення кнопки «Системний час» виводить системний час Windows, а після натиснення «Локальний час» – локальний час.