Системное программное обеспечение персональных ЭВМ


Пример 8 - часть 2


Значение initF[0] станет отличным от 1 при выполнении условия окончания */ while(initF[0]==1); /* Завершение работы, восстановление вектора */ writevect(TIMEINT,oldtime); } /*==== Обработчик прерывания от таймера ====*/ /* Выполняет роль диспетчера процессов */ void interrupt RTS() { switch(initF[0]) { case 0: /* Ветвь инициализации */ initF[nproc]++; /* Установка флага инициализации */ newSP[nproc]=_SP; /* Запоминание стека процесса */ newSS[nproc]=_SS; break; case 1: TimeCount--; /* Подсчет тиков */ if(TimeCount==0) { /* Рабочая ветвь. Переключение процессов */ /* Подсчет переключений */ if (++Nswitch>NSWITCH) initF[0]++; newSP[nproc]=_SP; /* Сохранение стека прерванного newSS[nproc]=_SS; /* процесса */ if (++nproc>2) nproc=1; /* Переключ.номера проц.*/ _SS=newSS[nproc]; /* Назнач.стека нового проц.*/ _SP=newSP[nproc]; TimeCount=TimeC[nproc]; /* Назнач.времени активности */ } break; case 2: _SS=newSS[0]; /* Назнач.стека пусковой программы */ _SP=newSP[0]; break; } (*oldtime)(); /* Системный обработчик */ } /*==== Процесс 1 ====*/ process1() { /* Выводимый текст */ byte out[18]= { 'P',0x12,'R',0x12,'O',0x12,'C',0x12,'E',0x12, 'S',0x12,'S',0x12,' ',0x12,'1',0x12}; word i,off; /* == Часть инициализации == */ /* В этом цикле процесс крутится при инициализации, пока его не прервут для запоминания состояния */ while(initF[1]==0); /* Если общая инициализация еще не выполнена, процесс завершается */ if(initF[0]==0) return; /* == Прикладная часть == */ for(;;) { /* Вывод текста. delay вставлено для того, чтобы было видно, что прерванный процесс возобновляется с того же места, где был прерван */ for(i=0,off=180;i

Описанный подход легко распространить на 3 и более процессов. Следует, однако, предупредить читателя, что эта программа предназначена для демонстрации только принципиальной возможности разделения времени. Для более серьезных прикладных частей переключение контекстов потребует значительно более сложных действий. Эти проблемы обсуждаются в разделе, посвященном резидентным программам.




- Начало -  - Назад -  - Вперед -