Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРВ_04_21_01_Монопольные__приложения.ppt
Скачиваний:
5
Добавлен:
20.06.2023
Размер:
931.33 Кб
Скачать

Работа печати

 

Прерывания, Часы,

1

 

 

2

2

2

1

 

 

3

 

6

6

 

6

3

6

 

Занятое Ожидание

 

 

 

 

 

 

 

 

 

 

 

 

Секция запуска

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Управление

 

5

 

 

 

 

5

 

 

 

 

 

 

 

 

 

 

 

Драйвер печати

 

 

 

7

7

 

8

 

 

 

 

 

 

 

 

 

 

1.

Прерывания от таймера

 

 

5.

Управление

 

 

 

2.

Прерывания печати

 

 

6.

Занятое ожидание while(true) do end

3.

Часы

 

 

7.

Обработка прерывания печати

 

4.

Секция запуска драйвера печати

 

8.

Драйвер прерывается таймером (!)

Некорректно реализован возврат из процедуры обработки прерывания таймера . Вследствие этого зависает драйвер печати

4. Standalone приложения

2015 v.01

11

 

Версия 0.2

 

Таймер

Прерывание

 

 

 

Часы

Монопольное приложение

 

Возврат

while(true){

 

 

 

if (flag_1) {

 

 

Секция

Управление;

 

 

flag_1:= false;}

 

 

запуска

if (flag_2) {

 

 

Прерывание

ВыводНаПечать(Данное: X);

 

flag_2:= false;}

 

 

 

};

 

Печать

Передача Xi

 

 

 

Возврат

Часы – операция

 

 

должна быть неделимой !

ОУ

Управление

Драйвер печати –тоже! Ошибка

разработчика

 

4. Standalone приложения

2015 v.01

12

 

Использование cаllback функции

 

Генератор

Управляющая

Приложение

 

программа

 

 

1.1931816 МГц

сlock()

 

 

 

 

Аппаратный

 

StartTimer(сlock)

 

таймер,

 

 

делитель на 11931

 

 

 

 

 

T==t1

Работа с таймером

 

Задача_1

 

 

через функции:

 

T==tn

А)

void startTimer (<указатель на функцию >, <интервал>)

 

В)

long getTime(void)

 

Задача_n

 

 

 

 

clock()

 

 

 

4. Standalone приложения

2015 v.01

13

Монопольное приложение (3 задачи)

Ready1

Ready2

Ready3

Массив функций

 

 

 

 

 

 

run[3] = (Task_1,

Task_1

Task_2

Task_3

Task_2,

 

 

 

Task_3)

void clock() { for(i=0; i<3; i++)

счетчик_процесса[i]++;

if (счетчик_процесса[i])>=Ti) {

setReady(i, true); счетчик_процесса[i] = 0;

}

}

clock()

Таймер

main() {

. . .

startTimer( clock, 1)

.. .

for(; ;) {

for (i=0; i<3; i++) { if (getReady(i)) {

run[i]; setReady(i, false);

}

}

}

4. Standalone приложения

2015 v.01

14

Пример для N задач. Описание задачи

typedef void(*CallBackProcedure)(void);

class Process { public:

Process(CallBackProcedure, int, int);

bool checkTime();

# Часы прикладной задачи

bool getReady();

# Чтение признака готовности

void setReady(bool);

# Установка признака готовности

CallBackProcedure run; # Функция, реализующая действия задачи private:

int id, period, time; bool ready = false;

};

Process::Process(CallBackProcedure r, int i, int p) { run = r; id = i; period = p; time = 0;

};

4. Standalone приложения

2015 v.01

15

Функции, реализующие действия задачи

Прикладные функции: оприсание

void task_1() {

. . . . . .

};

void task_2() {

. . . . . .

};

void task_3() {

. . . . . .

};

Прикладные функции: Условия активизации

bool Process:: checkTime() { if(++time >= period) {

time = 0; return true;

}else{

return false;

}

};

Прикладные функции: инициализация

Process* process[3];

process[0] = new Process(task_1, 1, 4); process[1] = new Process(task_2, 2, 5); process[2] = new Process(task_3, 3, 6);

4. Standalone приложения

2015 v.01

16

Циклический исполнитель

void clock() { for(i=0; i<3; i++)

process[i]->setReady(checkTime());

}

main() {

Инициализация прикладных функций

startTimer( clock,1);

. . .

for(; ;) {

for (i=0; i<3; i++) {

if ( process[i]->getReady()){ process[i]->run(); process[i]->setReady(false);

}

}

}

4. Standalone приложения

2015 v.01

17

Погрешность отсчета времени

Относительный таймер – отсчет времени ведется от текущего момента (сформировать событие через 12ч 33м 23с)

Период «тика» 10 мс

1193181.6 гц / 11931 = 100.00684 гц 9.99931 10-

3Погрешность

0.00790 10-3с

в сутки (86400с) 0.682с

 

за месяц 20.476с за год 4.09 минуты

Абсолютный таймер – обеспечивается заданный интервал

3мс

10мс

10мс

10мс

23мс

Запрос на запуск измерения через 20мс

4. Standalone приложения

2015 v.01

18

Разработка монопольных приложений требует:

написания последовательно выполняющихся процедур, обрабатывающих события от параллельно развивающихся физических процессов и отслеживать возможные конфликты, возникающие в процессе их выполнения

написания собственных обработчиков прерываний

решений вопросов синхронизации и обеспечения неделимости

программирования ввода/вывода

4. Standalone приложения

2015 v.01

19