Федеральное агентство по образованию
Государственное образовательное учреждение
Высшего профессионального образования
Тульский государственный университет
Кафедра электронных вычислительных машин
Эксплуатация ЭВМ.
Лабораторная работа №6.
«РАЗРАБОТКА программного обеспечения ТЕСТИРОВАНИЯ НГМД»
Выполнили:
|
студенты гр. 250261
Косухин К.Ю.
Сафронова А.Д.
Мантаева З.М.
Грибченков Р.Ю.
|
Проверил:
|
Лебеденко Ю.И.
|
Цель и задачи работы:
Целью работы является изучение принципов функционирования и освоение методов тестирования накопителей на гибких магнитных дисках (НГМД) и их реализация в программном обеспечении.
Задание на работу:
В соответствии с вариантом задания, выданным преподавателем, разработать программу, реализующую тестирование исправности накопителя ГМД и поверхности носителя информации.
Задания:
1) Тестирование исправности датчика нулевой дорожки с использованием команд рекалибровки и позиционирования блока головок на нулевую дорожку.
2) Тестирование исправности шагового двигателя с использованием команд пошагового перемещения блока головок.
3) Тестирование исправности блока головок и поверхности носителя с использованием команд чтения записи и чтения произвольного сектора.
4) Тестирование исправности датчика защиты дискеты от записи.
-
Краткие теоретические сведения:
Дисковая подсистема персональных компьютеров оказывает значительное влияние на эффективность функционирования вычислительного устройства в целом. Она обеспечивает постоянное хранение системного и прикладного программного обеспечения, файлов данных пользователя и т.п.
Стандартный формат дискеты типа HD (High Density – высокая плотность) – 80 дорожек на каждой из сторон, 18 секторов по 512 байт на дорожке. Уплотненный формат – 82 или 84 дорожки, до 20 секторов по 512 байт, или до 11 секторов по 1024 байта.
Операционная система MS-DOS предоставляет широкий набор функций для работы с дисковыми накопителями [6].
Для определения наличия того или иного оборудования в системе используется прерывание 11h.
Выход: AX = битовые флаги оборудования
Нижний уровень работы с дисками образуют функции прерывания INT 13h.
Функция 00h – сброс системы контроллера дисковода
Операция осуществляет полный сброс контроллера дисковода. Используется в случаях, когда после других дисковых операций возвращается код серьезной ошибки.
Функция 01h – определить состояние дисковода
Возвращает в AL байт состояния дисковода после последней операции ввода-вывода.
Функция 02h – чтение сектора
Функция 03h – запись сектора
Функция 04h – верификация секторов
Функция 05h – форматирование дорожки
Функция 08h – параметры дискового накопителя
Функция 15h – тип дискового накопителя
Функция 16h – смена диска
-
Листинги программ:
-
Тестирование исправности датчика нулевой дорожки с использованием команд рекалибровки и позиционирования блока головок на нулевую дорожку.
|
#include
REGISTERS regs;
extern void intr(int, REGISTERS* regs); // вызов прерывания
short floppy_check() {
intr(11h, ®s);
return regs.ax;
}
short floppy_write_sector(char* buffer, short len) {
regs.ah = 03h; // функция записи в сектор
regs.al = 1; // пишем один сектор
regs.ch = 0; // номер трека
regs.cl = 0; // пишем в нулевой сектор
regs.dh = 0; // номер поверхности (головки)
regs.dl = 0; // номер накопителя
regs.es = buffer; // начало массива
regs.bx = len; // длина массива
intr(13h, ®s);
return regs.cf;
}
short floppy_read_sector(char* buffer, short len) {
regs.ah = 02h; // функция чтения из сектора
regs.al = 1; // читаем один сектор
regs.ch = 0; // номер трека
regs.cl = 0; // читаем из нулевого сектора
regs.dh = 0; // номер поверхности (головки)
regs.dl = 0; // номер накопителя
regs.es = buffer; // начало массива
regs.bx = len; // длина массива
intr(13h, ®s);
return regs.cf;
}
void main() {
char buffer[512];
short result;
result = check_floppy();
if(result && 0x1 == 0) { // нулевой бит содержит показывает присутствие дискового накопителя
printf("дискета отсутствует");
return;
}
buffer = "test";
if(floppy_write_sector(buffer, 512) == 1) {
printf("ошибка записи сектора");
return;
}
if(floppy_read_sector(buffer, 512) == 1) {
printf("ошибка чтения сектора");
return;
}
if(strcmp("test", buffer) != 0) {
printf("ошибка чтения сектора");
return;
}
printf("Дисковод работает без ошибок");
}
|
-
Тестирование исправности шагового двигателя с использованием команд пошагового перемещения блока головок.
|
#include
REGISTERS regs;
extern void intr(int, REGISTERS* regs); // вызов прерывания
short floppy_check() {
intr(11h, ®s);
return regs.ax;
}
short floppy_write_sector(short sector_index, char* buffer, short len) {
regs.ah = 03h; // функция записи в сектор
regs.al = 1; // пишем один сектор
regs.ch = 0; // номер трека
regs.cl = sector_index; // пишем в сектор с индексом sector_index
regs.dh = 0; // номер поверхности (головки)
regs.dl = 0; // номер накопителя
regs.es = buffer; // начало массива
regs.bx = len; // длина массива
intr(13h, ®s);
return regs.cf;
}
short floppy_read_sector(short sector_index, char* buffer, short len) {
regs.ah = 02h; // функция чтения из сектора
regs.al = 1; // читаем один сектор
regs.ch = 0; // номер трека
regs.cl = sector_index; // читаем сектора с индексом sector_index
regs.dh = 0; // номер поверхности (головки)
regs.dl = 0; // номер накопителя
regs.es = buffer; // начало массива
regs.bx = len; // длина массива
intr(13h, ®s);
return regs.cf;
}
void main() {
char buffer[512];
short result;
short i;
result = check_floppy();
if(result && 0x1 == 0) { // нулевой бит содержит показывает присутствие дискового накопителя
printf("дискета отсутствует");
return;
}
// тестируем первые 3 сектора
for(i = 0; i < 3; i++) {
buffer = "test";
if(floppy_write_sector(i, buffer, 512) == 1) {
printf("ошибка записи сектора");
return;
}
if(floppy_read_sector(i, buffer, 512) == 1) {
printf("ошибка чтения сектора");
return;
}
if(strcmp("test", buffer) != 0) {
printf("ошибка чтения сектора");
return;
}
}
printf("Дисковод работает без ошибок");
}
|
-
Тестирование исправности блока головок и поверхности носителя с использованием команд чтения записи и чтения произвольного сектора.
|
#include
#include
REGISTERS regs;
extern void intr(int, REGISTERS* regs); // вызов прерывания
short floppy_check() {
intr(11h, ®s);
return regs.ax;
}
short floppy_count_sectors() {
short result;
regs.ah = 08h; // функция сбора параметров дискового накопителя
regs.dl = 0; // номер накопителя
intr(13h, ®s);
if(regs.cf) // если была ошибка
result = -1; // устанавливаем количество секторов в -1
else
result = regs.cl && 0x3f; // количество секторов хранится в первых шести битах
return result;
}
short floppy_write_sector(short sector_index, char* buffer, short len) {
regs.ah = 03h; // функция записи в сектор
regs.al = 1; // пишем один сектор
regs.ch = 0; // номер трека
regs.cl = sector_index; // пишем в сектор с индексом sector_index
regs.dh = 0; // номер поверхности (головки)
regs.dl = 0; // номер накопителя
regs.es = buffer; // начало массива
regs.bx = len; // длина массива
intr(13h, ®s);
return regs.cf;
}
short floppy_read_sector(short sector_index, char* buffer, short len) {
regs.ah = 02h; // функция чтения из сектора
regs.al = 1; // читаем один сектор
regs.ch = 0; // номер трека
regs.cl = sector_index; // читаем сектора с индексом sector_index
regs.dh = 0; // номер поверхности (головки)
regs.dl = 0; // номер накопителя
regs.es = buffer; // начало массива
regs.bx = len; // длина массива
intr(13h, ®s);
return regs.cf;
}
void main() {
char buffer[512];
short result;
short sectors_count;
short section_index;
result = check_floppy();
if(result && 0x1 == 0) { // нулевой бит содержит показывает присутствие дискового накопителя
printf("дискета отсутствует");
return;
}
sectors_count = floppy_count_sectors();
if(sectors_count == -1) {
printf("Не удается собрать информацию о дисковом накопителе");
return;
}
section_index = rand() % sectors_count;
buffer = "test";
if(floppy_write_sector(section_index, buffer, 512) == 1) {
printf("ошибка записи сектора");
return;
}
if(floppy_read_sector(section_index, buffer, 512) == 1) {
printf("ошибка чтения сектора");
return;
}
if(strcmp("test", buffer) != 0) {
printf("ошибка чтения сектора");
return;
}
printf("Дисковод работает без ошибок");
}
|
-
Тестирование исправности датчика защиты дискеты от записи.
|
#include
#include
REGISTERS regs;
extern void intr(int, REGISTERS* regs); // вызов прерывания
short floppy_check() {
intr(11h, ®s);
return regs.ax;
}
short floppy_count_sectors() {
short result;
regs.ah = 08h; // функция сбора параметров дискового накопителя
regs.dl = 0; // номер накопителя
intr(13h, ®s);
if(regs.cf) // если была ошибка
result = -1; // устанавливаем количество секторов в -1
else
result = regs.cl && 0x3f; // количество секторов хранится в первых шести битах
return result;
}
short floppy_write_sector(short sector_index, char* buffer, short len) {
regs.ah = 03h; // функция записи в сектор
regs.al = 1; // пишем один сектор
regs.ch = 0; // номер трека
regs.cl = sector_index; // пишем в сектор с индексом sector_index
regs.dh = 0; // номер поверхности (головки)
regs.dl = 0; // номер накопителя
regs.es = buffer; // начало массива
regs.bx = len; // длина массива
intr(13h, ®s);
return regs.cf;
}
short floppy_read_sector(short sector_index, char* buffer, short len) {
regs.ah = 02h; // функция чтения из сектора
regs.al = 1; // читаем один сектор
regs.ch = 0; // номер трека
regs.cl = sector_index; // читаем сектора с индексом sector_index
regs.dh = 0; // номер поверхности (головки)
regs.dl = 0; // номер накопителя
regs.es = buffer; // начало массива
regs.bx = len; // длина массива
intr(13h, ®s);
return regs.cf;
}
void main() {
char buffer[512];
short result;
result = check_floppy();
if(result && 0x1 == 0) { // нулевой бит содержит показывает присутствие дискового накопителя
printf("дискета отсутствует");
return;
}
printf("убедитесь, что у используемой дискеты используется защита от записи\n");
if(floppy_read_sector(section_index, buffer, 512) == 1) {
printf("ошибка чтения сектора");
return;
}
buffer = "test";
if(floppy_write_sector(section_index, buffer, 512) == 0) {
printf("датчика защиты дискеты от записи неисправен");
return;
}
printf("Дисковод работает без ошибок");
}
|
Тула 2011