Лабораторна робота №.2



Тема роботи: Створення різних процесів із одного тіла функції. Передача параметрів процесу при ініціалізації.

 

Завдання до роботи: розробити програму в якій створюються 3 різних задачі, використовуючи ідентичний код самого процесу. Кожен із процесів повинен виводити лічильник, значення якого інкрементується через заданий інтервал часу. Задачі передаються 3 параметри: координати рядку, в якому виводиться лічильник, значення інкременту і період затримки в тіках системного таймеру, через які повинен лічильних інкрементуватися.

В системі UCOS-II функція процесу являє собою функцію, яка не повертає значення і в якості параметру отримує нетипізований вказівник:

void Task (void *par);

Саму вказівник par використовується для передачі задачі параметрів. Для передачі задачі параметрів необхідно створити структуру, полями якої будуть необхідні для задачі параметри і передати при створенні задачі вказівник на неї. Оскільки при створенні задачі за допомогою функції OSTaskCreate копіюється лише сам вказівник, а не структура із параметрами, то для кожної задачі доцільно мати окрему структуру, адреса якої передається при створенні процесу (задачі).

 

Лабораторна робота №3..

Тема роботи: Функції обліку часу виконання програми в системах реального часу.

Завдання до роботи. Проаналізувати механізми обліку часу в системах реального часу, навчитися вимірювати часові інтервали, реалізації функцій затримки і механізми очікування надходженні подій. Виміряти час виконання системних функцій системи UCOS-II використовуючи RDTSC інструкцію Pentium процесора.

При розробці програмного забезпечення систем реального часу часто постають задачі вимірювання часових інтервалів виконання визначених фрагментів коду із достатньо високою точністю. Із цими задачами пов’язані питання формування визначених затримок, зокрема при роботі із апаратними засобами. Для вирішення таких питань можуть бути використані декілька механізмів.

1. Використання системного таймера операційної системи. Практично будь-яка операційна система реального часу використовує переривання від системного таймера для реалізації механізму квантування часу процесора, реалізації системних затримок, таймаутів. В системі UCOS-II всі функції із використанням таймаутів, системна функція затримки OSTimeDly використовують лічильники, які змінюються кожного переривання таймера. При виклику функцій затримки, які використовують цей механізм, ресурси процесора, які використовують цей механізм перерозподіляються між іншими задачами, тобто, процесор може виконувати корисну роботу. Час затримки обмежується тільки розрядністю змінних, використаних під внутрішні лічильники переривань таймера і може бути великим. Використання цього механізму характеризується наступними недоліками:

· фактичний час затримки визначається біжучими станами процесів в системі і може змінюватись як в більшу так і меншу сторони, тобто спостерігається дрожання (jitter) затримки.

· затримки, які можуть бути отримані в такий спосіб не можуть бути дуже малими. Типові значення – одиниці, десятки мілісекунд. Це зумовлено тим, що частота переривання системного таймера не може бути встановлена занадто високою. Чому? (пояснити самостійно!)

2. Використання годинника реального часу. В багатьох системах передбачена наявність апаратного годинника реального часу, який інкрементується певну кількість разів на секунду, наприклад, раз в секунду. Оскільки дискретність такого годинника є достатньо великою, то він не може бути використаний для вимірювання/формування малих затримок.

Використання апаратно-залежних механізмів. Розглянемо їх на прикладі архітектури IBM сумісного комп’ютера. Перший спосіб полягає у використанні другого каналу системного таймера для обліку часових інтервалів. Всі ЕОМ даного класу містять 16-розрядний таймер-лічильник, сумісний із Intel8254, вхід якого подається сигнал із частотою 1.19318 MHz. Оскільки лічильник є 16 розрядний, то максимальний інтервал часу може бути виміряний рівний 65536*0.838097 = 55мс. Цей механізм підтримується системою UCOS-II. В бібліотеці функцій, прототипи яких наведено в pc.h, вказано три функції:

PC_ElapsedInit() ініціалізація системи обліку часу.

PC_ElapsedStart() – встановлення часової мітки. Використовується для позначення першої ділянки коду, час виконання якого слід виміряти.

PC_ElapsedStop() – обчислення часу виконання фрагменту програми із моменту виклику функції PC_ElapsedStart, в мікросекундах.

Інший, більш досконалий механізм, полягає у використанні інструкції RDTSC (Real Time Stamp Counter) процесорів Pentium і вище. В процесорі вмонтований 64-лічильник, який інкрементується кожен машиннимй такт. В результаті виконання цієї інструкції значення лічильника заносяться в пару 32 розрядних регістрів. edx, eax. Оскільки лічильник 64 розрядний, то необхідно виконувати операції над 64 розрядними числами, і вносити поправку на можливе переповнення лічильника. Для обчислення конкретних часових інтервалів перш за все необхідно визначити частоту процесора, використовуючи точні часові мітки. Їх зручно сформувати, використовуючи годинник реального часу комп’ютера. Для визначення тактової частоти можна скористатись функцією biostime(), яка повертає значення лічильника, який інкрементується приблизно 18 раз щосекунди.

При використанні цієї функції слід забезпечити точне дотримання інтервалу між двома базовими точками. Можна запропонувати наступний алгоритм:

1. Зчитуємо значення лічильника, пов’язаного з таймером.

2. Чекаємо поки значення лічильника зміниться.

3. Зчитуємо значення лічильника RDTSC процесора .

4. Чекаємо визначену кількість інтервалів таймера.

5. Знову зчитуємо значення лічильника RDTSC .

6. Обчислюємо тактову частоту процесора в наступний спосіб:

При виконанні роботи необхідно передбачити можливість роботи із 64 розрядними числами. Найпростіше це можна зробити, використовуючи числа з плаваючою комою подвійної точності чи реалізувавши спеціальні процедури для роботи із числами, представленими у вигляді структур.

Приклад реалізації використання RDTSC:

unsigned long int a,b;

asm {

DB 0FH

DB 031H

mov a,edx

mov b,eax

}

В результаті виконання цієї функції значення змінних будуть містити значення лічильника. Після його можна перетворити у число з плаваючою комою і використовувати для подальших обчислень.


Дата добавления: 2015-12-17; просмотров: 10; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!