Консалтинговая компания Консалтер.Ру
Главная Новости Библиотека Исследования Законодательство Консалтинг Бизнес-форумы Контакты

Реклама

Рекомендуем



Консалтер.Ру > Библиотека > Информационные технологии

В.А. Авдеев, В.Ф. Гузик
Компьютеры: шины, контроллеры, периферийные устройства

Учебное пособие. Таганрог: ТРТУ, 2001. - 536 с.

Предыдущая

Приложение В. Проверочные задания, основные сведения и примеры программ

Программирование контроллера НЖМД

10.1. Формулировка задания

Разработанная программа должна выполнять чтение определенного сектора или верификацию сектора, чтение состояния НЖМД или внутреннюю диагностику, чтение регистра ошибок или чтение регистра состояния НЖМД, т.е. программную реализацию на ассемблере соответствующих функций BIOS.

10.2. Основные сведения

Жесткие диски обладают высокой скоростью передачи данных (5-40 Мбит/с) и большой емкостью от 10 Мбайт до 19 Гбайт. Жесткий диск содержит набор круглых металлических пластин (платтеров), покрытых тонким магнитным слоем. Магнитные пластины вращаются со скоростью 3600 об/мин и более. Поверхность платтера имеет дорожки (концентрические кольца), разбитые на секторы. Дорожки поверхностей с одинаковыми номерами образуют цилиндр. Каждый дисковод характеризуется определенными параметрами, например, жесткий диск с 306 цилиндрами, 4 головками и 17 секторами на дорожке. Эти параметры определяют типы дисководов, которых может быть несколько десятков. В программе установки ПК обычно указывается тип дисковода.

            В этом разделе главное внимание будет уделено описанию организации обмена данными  НЖМД и П(ОП) в составе ПК PC/AT, т.е. описанию портов, команд и BIOS. На рис.1 представлена на крупном уровне схема связи НЖМД и ОП.

Рис. 1. Схема связи НЖМД и ОП

Схема связи содержит НЖМД, подключенный к контроллеру НЖМД (КНЖМД) через соответствующий интерфейс. В зависимости от типа интерфейса НЖМД порты (адресные регистры) и буферная память для хранения сектора могут размещаться в КНЖМД (в случае применения интерфейса ST506/412) или в НЖМД, например при использовании интерфейса IDE.

На рис. 2 изображена схема связи компонентов системы с помощью интерфейса SCSI.

Рис. 2. Схема применения интерфейса SCSI

КНЖМД может быть выполнен в виде съемной платы шины расширения ISA или встроен в материнскую плату ПК с использованием локальной шины  PCI или VL. В ПК PC/XT управление передачей 8-битных данных между НЖМД и ОП через КНЖМД осуществляет КПДП, а в ПК PC/AT-процессор, причем данные направляются по 16-битной  шине. Так как скорость вращения диска очень большая, то КНЖМД и П или КПДП в некоторых случаях не успевают обрабатывать данные последовательно размещенных секторов. Тогда для временного согласования работы НЖМД, КНЖМД и П секторы нумеруют с учетом фактора (коэффициента) чередования. Так, в ПК PC/XT фактор чередования - 6:1, т.е. каждый шестой сектор является следующим. Фактор чередования показывает, за сколько оборотов может быть считана вся информация одной дорожки (например, за 6 оборотов). В ПК PC/AT фактор чередования равен 2:1, т.е. информация одной дорожки считывается за два оборота платтера. С появлением быстродействующих П фактор чередования стал равен 1:1. Из НЖМД в буферную память КНЖМД считывается информация одного сектора (512 байт). К моменту подхода информации следующего сектора данные из буферной памяти должны быть уже обработаны П. В ОП для хранения принимаемых или передаваемых данных отводятся определенные области (буферы DOS), каждый из которых имеет емкость в 512 байт. КНЖМД PC/XT и PC/AT являются несовместимыми, т.к. содержат разные порты с разными адресами. Что касается совместимости различных НЖМД и КНЖМД, то здесь следует учитывать интерфейс, метод кодирования (MFM, RLL), конструктивные особенности устройств и т.д.

Формат дорожек жесткого диска так же, как и гибкого диска содержит поле идентификации и поле данных. В поле идентификации указывается адресный маркер (метка), старший и младший байты цилиндра, номер головки, размер сектора, номер сектора, контрольная сумма поля идентификации. Эта служебная информация необходима для поиска нужного сектора при записи или чтении данных и контроля этой информации. В поле данных размещаются адресный маркер, непосредственно данные (стандарт 512 байт) и контрольная сумма поля данных (4 байта ЕСС).

Схема портов НЖМД изображена на рис.3.

Рис.3. Схема портов КНЖМД PC/AT

Кратко рассмотрим назначение портов КНЖМД.

Регистр данных (1F0h) предназначен для передачи 16-битных данных между П и буферной памятью через системную шину  (СШ). При выполнении длинных операций чтения/записи этот регистр используется для пересылки четырех 8-битовых кодов ECC. Информация об ошибках хранится в регистре ошибок (1F1h). После выполнения диагностической команды содержимое этого регистра может быть следующее: 01h - нет ошибки, 02h - ошибка КНЖМД, 03h - ошибка буферной памяти, 04h - ошибка схемы ECC, 05h - ошибка П. Если выполняется какая-либо другая команда КНЖМД, то при установке бита ошибки в регистре состояния (1F7h) назначение единичных значений битов в регистре ошибок следующее: бит D0 - адресный маркер данных не найден, бит D1 - отсутствует сигнал “дорожка 0”, бит D2 - недействительная команда (уточняется содержимым регистров состояния и ошибок), бит D3 - не используется, бит D4 - не найден идентификатор сектора, бит D5 - не используется, бит D6 - ошибка контрольной суммы  в поле данных, бит D7 - дефектный сектор.

Регистр цилиндра предкомпенсации (1F1h) предназначен для хранения уменьшенного в 4 раза номера цилиндра, начиная с которого более плотно записывается информация на внутренние дорожки диска.

В регистр счетчика секторов (1F2h) заносится/считывается код числа секторов для последующей операции, который уменьшается на единицу после обработки текущего сектора. После выполнения команды содержимое регистра равно 0.

Регистр номера сектора (1F3h) доступен по записи и чтению со стороны П и хранит начальный номер сектора для последующей операции.

В регистры номера цилиндра старшего и младшего байтов (порты 1F5h и 1F4h) заносится начальный номер цилиндра выполняемой команды.

Регистр выбора НЖМД/номера головки (1F6h) содержит биты D3-D0 для выбора головки, бит D4 для выбора НЖМД и биты D6 и D5, задающие размер сектора (01- 512 байт).

Состояние НЖМД и КНЖМД отмечается в регистре состояния (1F7h), назначение битов которого следующее:

D0 = 1 - предыдущая команда завершилась с ошибкой;

D1 = 1 - наличие сигнала «индекс» от НЖМД;

D2 = 1 - данные скорректированы схемой ECC;

D3 = 1 - выполняется операция обмена данными;

D4 = 1 - завершена операция поиска;

D5 = 1 - неисправность в НЖМД;

D6 = 1 - готовность НЖМД к чтению, записи и поиску;

D7 = 1 - КНЖМД занят (проверяется перед чтением любого регистра).

Регистр управления (3F6h) содержит перечисленные ниже биты:

D0 - не используется;

D1 = 1 - прерывание запрещено;

D2 = 1 - сброс КНЖМД;

D3 = 1 - разрешение выбора головки;

D4 - D7 - не используются.

            Команда КНЖМД состоит из одного байта и выполняется сразу после занесения в регистр команд (1F7h). Поэтому предварительно следует загрузить параметры в соответствующие порты КНЖМД, если он находится в состоянии “не занят” (бит D7 регистра состояния равен 0). Перечень команд КНЖМД приведен в табл. 1.

Таблица 1

Команда

Биты

D7

D6

D5

D4

D3

D2

D1

D0

Рекалибровка

0

0

0

1

R3

R2

R1

R0

Поиск

0

1

1

1

R3

R2

R1

R0

Чтение секторов

0

0

1

0

0

0

L

T

Запись секторов

0

0

1

1

0

0

L

T

Форматирование

0

1

0

1

0

0

0

0

Верификация секторов

0

1

0

0

0

0

0

T

Инициализация параметров НЖМД

1

0

0

1

0

0

0

1

Диагностика

1

0

0

1

0

0

0

0

Обозначения:

L = 0 - нормальный режим,

L = 1 - длинный режим,

T = 0 - разрешение повтора,

T = 1 - запрет повтора,

R3 - R0 -скорость позиционирования (0000 - 35 мкс/шаг, 0001 - 0,5 мс/шаг, 0010 - 1 мс/шаг, ..., 1101 - 6,5 мс/шаг, 1110 - 3,2 мкс/шаг, 1111 –

16 мкс/шаг).

Рассмотрим назначение некоторых команд  КНЖМД. Для установки головки на заданную дорожку (цилиндр) используется команда “поиск” (7xh). Здесь знак “x” указывает на 16-ричную цифру, задающую соответствующую скорость позиционирования головки (см. табл. 1).

Команда “чтение сектора” (20h или 21h) считывает заданное число секторов (указанное в регистре счетчика секторов), начиная с заданного начального сектора. Несколько раньше следует установить головку на нужный цилиндр.

Аналогичным образом выполняется команда “длинное чтение” (22h или 23h) за исключением того, что дополнительно передаются в П четыре байта ECC. Передача данных осуществляется 16-битными данными, а код ECC - байтами.

Команда “верификация секторов” используется для обнаружения ошибок и реализуется, как и команда "чтение данных", но без обмена данными.

Встроенный диагностический тест запускается командой “диагностика”, причем замеченные ошибки заносятся в регистр ошибок (1F1h).

Для обслуживания НЖМД BIOS содержит программы, которые вызываются программным прерыванием  INT 13h с заданием одной из соответствующих функций. Рассмотрим некоторые из этих функций. Номер функции как обычно устанавливается в регистре AH процессора. При выполнении функции “чтение” (AH=02h) и длинное чтение (AH=0Ah) реализуется следующая очередность действий: вывод команды, ожидание прерывания IRQ5 от КНЖМД, считывание из буферной памяти через регистр (1F0h) 256 слов. Если производится длинное чтение, то проверяется бит D3 (запрос на обмен) регистра состояния (1F7h) с целью последующего считывания четырех байт ECC через регистр данных (1F0h). После этого проверяется состояние НЖМД и КНЖМД путем чтения содержимого регистра состояния (1F7h). Если бит D0 (ошибка) регистра состояния равен 1, то анализируется и значение регистра ошибок (1F1h).

Для выполнения функции “проверка готовности” (AH=10h) осуществляется следующая последовательность действий: опрос бита D7 (занято), регистра состояния (1F7h) с целью определения возможности доступа к КНЖМД, вывод номера НЖМД в регистр НЖМД/номер головки (1F6h), ввод содержимого регистра  состояния  (1F7h) с последующим его анализом.

Функция “поиск” (AH=0Ch) связана с выполнением следующих этапов: вывод команды (проверка готовности КНЖМД (функция 10h), пересылка параметров в порты с адресами от 1F1h до 1F7h), ожидание прерывания IRQ5, ввод содержимого регистра состояния (1F7h) с последующим его анализом.

            Функция “верификация секторов” (AH=04h) реализуется путем вывода команды, ожидания прерывания и ввода информации о состоянии НЖМД и КНЖМД.

10.3. Пример выполнения варианта задания

; Программирование КНЖМД

; Выполняем верификацию сектора (0-0-1) без анализа результата и

; диагностику с последующим анализом регистра ошибок

Ideal

Model Small

CodeSeg

StartUpCode                 ; основной модуль

        mov  dx,offset message0

        call str_out            ; вывод строки message0

        call verify             ; вызов процедуры верификации

        call delay              ; подождем немного

        call diags              ; вызов процедуры диагностики

        call delay              ; подождем немного

        call read_status     ; вызов процедуры чтения кода ошибки

        call error_out        ; вызов процедуры вывода на экран

                                      ; информации об ошибке

ExitCode                       ; конец основного модуля

;--------------------------------------- пауза ----------------------------------------

proc delay

        push cx bx

        mov cx,0ffffh

m1:     mov bx,1000

m2:     dec bx

        jnz m2

        loop m1

        pop bx cx

        ret

endp

;-------------------------------- команда запуска диагностики ---------------

proc diags

        mov dx,1F7h             ; регистр команд

        mov al,90h                ; код команды диагностики

        out dx,al                    ; передаем в порт

        ret

      endp

;------------------- верификация сектора 1 головки 0 цилиндра 0---------

proc verify

        mov dx,1F2h             ; регистр кол-ва секторов

        mov al,1                    ; проверяем  сектор 1

        out dx,al                    ; передаем в порт

        mov dx,1F3h             ; регистр номера сектора

        mov al,1                    ; сектор 1

        out dx,al                    ; передаем в порт

        mov dx,1F4h             ; регистр номера цилиндра старшая часть

        xor al,al                     ; al = 0

        out dx,al                    ; передаем в порт

        mov dx,1F5h             ; регистр номера цилиндра младшая часть

        xor al,al                     ; al = 0

        out dx,al                    ; передаем в порт

        mov dx,1F6h             ; регистра устройства и номера головки

        xor al,al                     ; al = 0

        out dx,al                    ; передаем в порт

        mov dx,1F7h             ; регистр команд

        mov al,40h                          ; команда верификации с разрешением повтора

        out dx,al                    ; передаем в порт

        ret

      endp

;----------------чтение состояния КНЖМД -----------------------------------;вход:

;выход : al - код ошибки

proc read_status

        mov dx,1F1h             ; регистр ошибок

        in al,dx                      ; al = коду ошибки

        ret

      endp

;----------------------------------------------вывод ошибки на экран-----------

; вход - al - код ошибки

      proc error_out

        mov dx,offset message1  ; смещение сообщения

        call str_out                       ; вывод на экран

        cmp al,6

        ja  m3

        dec al                              ; код ошибки уменьшили на 1, теперь al - индекс строк

        mov dl,32                                      ; длина текстового сообщения

        mul dl                             ; получаем смещение нужной строки относительно первой

        mov dx,offset err01                    ; начало текстовых строк

        add dx,ax                     ; получаем смещение нужной строки

                                                ; относительно начала сегмента данных

        call str_out                    ; выводим на экран

        jmp  end_out

m3:     mov  dx,offset err06

        call str_out

end_out:

        ret

      endp

;------------------------вывод строки на экран----------------------------------

; вход - ds:dx - адрес строки для вывода

      proc str_out

        push ax

        mov ah,09h                  ; функция вывода на экран строки

        int 21h                                            ; вызываем

        pop ax

        ret

      endp

DataSeg

      message0 db 'Идет диагностика КНЖМД...',10,13,'$'

      message1 db 'После операции диагностики регистр ошибок : ',10,13,'$'

; размер каждой строки - 32 байта

; это для правильной индексации при выводе строки об ошибке

      err01 db '01h - нет ошибки                 ',13,10,'$'

      err02 db '02h - ошибкa КНЖМД               ',13,10,'$'

      err03 db '03h - ошибка буфферной памяти    ',13,10,'$'

      err04 db '04h - ошибка схемы EСС           ',13,10,'$'

      err05 db '05h - ошибка П                   ',13,10,'$'

      err06 db '??h - неизвестная ошибка (возможно запущен Windows)',13,10,'$'

END

10.4. Варианты заданий

Варианты заданий определяются морфологическим графом (рис.4).

Рис.4. Морфологический граф вариантов заданий

Вариант задания указывается маршрутом в графе, например, 1-7-10. Морфологический граф устанавливает 24 варианта заданий. Вершины 1 и 2 соответствуют выполнению команд верификации определенных секторов, например, вершина 1 соотносится с сектором 1, а вершина 2 - с сектором  2 цилиндра 0. Вершины 3 и 4 указывают на выполнение чтения определенных секторов, а вершины 5 и 6 - длинное чтение заданных секторов. Выполнение команды “чтение состояния” соотносится с вершиной 7, а выполнение команды “внутренняя диагностика” - с вершиной 8. Вершины 9 и 10 указывают соответственно на необходимость чтения и вывода на экран дисплея содержимого регистра ошибок или регистра состояния.

Предыдущая

Похожие материалы:
Программирование контроллера НГМД
Программа предоставления государственных финансовых и государственных экспортных кредитов - ст.125 БК РФ
Программа оптимизации и отчет консультанта
Программируемый периферийный интерфейс
Программный обмен - Авдеев В.А. и др., 2001
Программы для ЭВМ



О сайте   Авторам   Реклама и услуги   Контакты
Copyright © 2007-2021, Консалтер.Ру