Защищенный режим процессоров Intel 80286 80386 80486



Пример мультизадачного монитора - часть 4


Таким образом, задача TASK_2 управляет работой задачи FLIP_TASK.

Задача KEYB_TASK (процедура keyb_task) вводит символы с клавиатуры и выводит скан-коды нажатых клавиш, а также состояние переключающих клавиш. Как только оказывается нажатой клавиша ESC, задача устанавливает семафор с номером 0, что приводит к завершению работы главной задачи (ожидающей установки этого семафора). Листинг 7. Задачи, которые будут работать параллельно. Файл tasks.c ----------------------------------------------------------- #include <stdio.h> #include <dos.h> #include <conio.h> #include <stdlib.h> #include "tos.h" word dispatcher(void); // Номер текущей строки для вывода на экран extern unsigned int y; // Задача TASK_1 void task1(void) { while(1){ vi_print(0,y++," Запущена задача TASK_1, " "переходим к главной задаче", 0x70); jump_to_task(MAIN_TASK_SELECTOR); // После повторного запуска этой задачи // снова входим в цикл. } } // Задача TASK_2 word flipflop1 = 0; long delay_cnt1 = 0l; void task2(void) { while(1){ // Периодически выводим на экран строки // FLIP/FLOP, каждый раз переключая // семафор номер 1. Этот семафор однозначно // соответствует выведенной на экран строке. asm sti if(delay_cnt1 > 150000l ) { asm cli if(flipflop1) { vi_print(73,3," FLIP ", 0x4f); sem_clear(1); } else { vi_print(73,3," FLOP ", 0x1f); sem_set(1); } flipflop1 ^= 1; delay_cnt1 = 0l; asm sti } delay_cnt1++; } } word flipflop = 0; long delay_cnt = 0l; void flipflop_task(void) { // Эта задача также периодически выводит на экран // строки FLIP/FLOP, но выводит строкой выше и // с меньшим периодом. Кроме того, эта задача // работает только тогда, когда установлен // семафор номер 1. while(1){ asm sti if(delay_cnt > 20000l ) { sem_wait(1); // ожидаем установки семафора asm cli if(flipflop) vi_print(73,2," FLIP ", 0x20); else vi_print(73,2," FLOP ", 0x20); flipflop ^= 1; delay_cnt = 0l; asm sti } delay_cnt++; } } word keyb_code; extern word keyb_status; void keyb_task(void) { // Эта задача вводит символы с клавиатуры // и отображает скан-коды нажатых клавиш // и состояние переключающих клавиш на экране. // Если нажимается клавиша ESC, задача // устанавливает семафор номер 0. // Работающая параллельно главная задача // ожидает установку этого семафора.


Содержание  Назад  Вперед