- •Монопольные (standalone) приложения
- •Периодические прикладные задачи
- •Таймер запросы на прерывания от таймера Управляющая программа реализует «Часы», отслеживает временные
- •Асинхронные (спорадические) задачи
- •События
- •Приложение – обработчик прерывания
- •Версия 0.1
- •Проблема:
- •Работа печати
- •Работа печати
- •Монопольное приложение (3 задачи)
- •Пример для N задач. Описание задачи
- •Функции, реализующие действия задачи
- •Циклический исполнитель
- •Погрешность отсчета времени
- •Разработка монопольных приложений требует:
Работа печати
|
Прерывания, Часы, |
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 |