Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
23
Добавлен:
02.05.2014
Размер:
203.26 Кб
Скачать

4.2.2. Принципы программирования процедур управления диском

Рассмотрим случай одного буфера (N = 1), объем которого равен одной дорожке.

С буфером связано два признака:

  1. ДОР_ЗАГР – номер загруженной дорожки (0, если пусто);

  2. ИЗМ – ИСТИНА, если содержимое буфера изменялось после загрузки.

Интерфейс контроллера предлагает следующие функции:

  1. ВЫБРАТЬ_ДИСКОВОД(ДВД) – выбирает дисковод в качестве рабочего устройства;

  2. НАЙТИ_ДОРОЖКУ(НД) – подводит головку чтения-записи к дорожке нд;

  3. ПЕРЕДАТЬ_СЕКТ(АДР, НД, НС, НАПР) – передает содержимое между сектором НС текущей дорожки, и памятью, начиная с адреса АДР, в зависимости от направления (чтение, запись);

  4. ПЕРЕДАТЬ_ДОРОЖКУ(НД, АДР, НАПР) – передает содержимое между дорожкой и памятью, в зависимости от направления;

  5. ПРОВЕРИТЬ (ТЕСТ) – позволяет проверить признаки ГОТОВ, КОНЕЦ, ОШИБКА в слове состояния контроллера.

Учитывая сделанные замечания, процедура ЗАПИСАТЬ_СЕКТОР(№ ДОРОЖКИ, № СЕКТОРА, ОТКУДА) должна включить параметр РЕЖИМ, который может принимать следующие значения:

  1. нормальная_запись

  2. непосредственная_запись

  3. первая_запись

В случае сбоя передачи операция повторяется. Если ошибка, приводящая к сбою продолжает повторяться, то после ЧМАКС числа попыток драйвер осуществляет прерывание программы с выдачей сообщения об ошибке.

procedure ПЕРЕДАТЬ_СЕКТОР(АДР,НД,НСЕКТ,ЗНАЧЕНИЕ);

begin

НСЕКТ := СООТВ(НСЕКТ);

НПОПЫТКИ := 0;

СНОВА:case ЗНАЧЕНИЕ in

ЧТЕН: ПРОЧИТАТЬ_СЕКТ(АДР,НД,НСЕКТ);

ЗАП: ЗАПИСАТЬ_СЕКТ(АДР,НД,НСЕКТ);

end_case;

ТЕСТ: ПРОВЕРИТЬ;

if ОШИБКА then begin

НПОПЫТКИ := НПОПЫТКИ + 1;

if НПОПЫТКИ < НМАКС then begin

goto СНОВА;

end else begin

ПРИЧИНА := ФАТАЛЬНАЯ_ОШИБКА;

ВОЗБУДИТЬ_ИСКЛЮЧЕНИЕ;

end_if;

end_if;

if  КОНЕЦ then begin

goto ТЕСТ;

end_if

end_procedure;

procedure ПЕРЕДАТЬ_ДОРОЖКУ(НД,БУФЕР,ЗНАЧЕНИЕ);

begin

НАЙТИ_ДОРОЖКУ(НД);

ТЕСТ: ПРОВЕРИТЬ;

if  КОНЕЦ then begin

goto ТЕСТ;

end_if

for НС := 0 to КС-1 do begin

ПЕРЕДАТЬ_СЕКТОР(БУФЕР[НС],НД,НС,ЗНАЧЕНИЕ);

end_for;

ИЗМ := ЛОЖЬ;

if ЗНАЧЕНИЕ = ЧТЕН then begin

ДОР_ЗАГР := НД;

end_if;

end_procedure;

procedure ПРОЧИТАТЬ_СЕКТОР(НД,НСЕКТ,НАЗНАЧ);

begin

if НД <> ДОР_ЗАГР then begin

if ИЗМ then begin

ПЕРЕДАТЬ_ДОРОЖКУ(ДОР_ЗАГР,БУФЕР,ЗАП);

end_if;

ПЕРЕДАТЬ_ДОРОЖКУ(НД,БУФЕР,ЧТЕН);

end_if;

НАЗНАЧ := БУФЕР[НСЕКТ];

end_procedure;

procedure ЗАПИСАТЬ_СЕКТОР(НД,НСЕКТ,НАЧ,РЕЖИМ);

begin

if НД <> ДОР_ЗАГР then begin

if ИЗМ then begin

ПЕРЕДАТЬ_ДОРОЖКУ(ДОР_ЗАГР,БУФЕР,ЗАП);

end_if;

if РЕЖИМ = ПЕРВАЯ_ЗАПИСЬ then begin

ДОР_ЗАГР := НД;

end else begin

ПЕРЕДАТЬ_ДОРОЖКУ(НД,БУФЕР,ЧТЕН);

end_if;

end_if;

БУФЕР[НСЕКТ] := НАЧ;

if РЕЖИМ = НЕПОСРЕДСТВЕННАЯ_ЗАПИСЬ then begin

ПЕРЕДАТЬ_СЕКТОР(НАЧ,НД,НСЕКТ,ЗАП);

end else begin

ИЗМ := ЛОЖЬ;

end_if;

end_procedure;

Как видно, существуют еще более низкоуровневые функции:

ПРОЧИТАТЬ_СЕКТ(АДР,НД,НСЕКТ);

ЗАПИСАТЬ_СЕКТ(АДР,НД,НСЕКТ);

которые реализуются в самом контроллере диска.

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в папке Шпоры по СПО