Создание события для ASPI

Работа с оборудованием напрямую из программы всегда являлась нетривиальной задачей. И причиной этого служит не столько правильность составления команд и запросов, сколько физические свойства конкретного устройства. Например, при работе с накопителем CD-ROM следует учитывать кроме всего прочего время достижения рабочей скорости вращения двигателя, самопроизвольную остановку вращения при отсутствии обращения и многое другое. И если в программе мы не будем этого учитывать, то никогда не удастся достичь согласованной и корректной работы между программной и аппаратной частью комплекса управления.

В расширении интерфейса ASPI все эти особенности устройств учтены, и предусмотрена эффективная поддержка их физических особенностей. Как уже говорилось ранее, функция ASPI SendASPI32Command может работать в двух режимах: синхронном и асинхронном. Синхронный режим работы подразумевает возвращение управления в программу только после завершения команды. В асинхронном же режиме возможно получать сообщения до завершения посланной устройству команды.

Когда используется асинхронная команда в функции sendASPi32Command, надо проверить возвращаемое значение. Если оно равно SS_PENDING, значит, команда еще в процессе выполнения и надо подождать. Когда возвращаемое значение не равно указанному SSPENDING, можно говорить о завершении команды и переходить к дальнейшим действиям. Для решения задачи обработки времени ожидания можно использовать несколько способов.

Первый способ состоит в применении событий Windows. Второй способ использует функцию обратного вызова для обработки происходящих действий во время выполнения команды ASPI. И есть еще один вариант, использующий метод опроса на завершение команды. Продемонстрируем все три способа обработки ожидания на примерах. Однако в реальных программах рекомендуется применять только первый вариант, поскольку он является наиболее надежным и удобным в использовании.

Итак, рассмотрим первый способ обработки задержек команд интерфейса ASPI посредством создания события.

Листинг 6.1. Обработка команды ASPI с использованием события

В этом примере мы создали объект события, установили его в несигнальное состояние (состояние занятости). Это значит, что пока команда SCSI_INQUIRY не будет завершена, наша программа не сможет продолжаться далее. Когда команда завершится, наш объект события установится в сигнальное состояние (состояние незанятости) и программа будет продолжена. С помощью функции waitForSingieObject мы определяем этот момент и передаем управление обратно в нашу программу. Как видите, все достаточно просто и эффективно.

Теперь приведем аналогичный пример для использования объекта событий, реализованный на языке Visual Basic.

Листинг 6.2. Пример использования объекта события, реализованный на Visual Basic

Перейдем ко второму способу обработки времени ожидания ASPI с использованием функции обратного вызова.

Листинг 6.3. Обработка команды ASPI через функцию обратного вызова

Итак, мы определили свою функцию обратного вызова, которая обработает результат выполнения команды SCSI после выполнения функции SendASPI32Command.

Для языка Visual Basic не имеет смысла приводить аналогичный пример, так как этот способ обработки времени ожидания ASPI в данном случае нецелесообразен.

Последний способ обработки событий, происходящих во время выполнения команды ASPI, состоит в постоянном опросе поля отчета (SRB_status) на наличие в нем значения завершения команды.

Листинг 6.4. Обработка команды ASPI методом опроса

Как видите, этот способ очень простой, но им не рекомендуется пользоваться в силу элементарной загрузки центрального процессора, у которого и без нашей программы много работы. Единственное его преимущество состоит в том, что отсутствуют попытки обращения к полям структуры SRB_Execscsicmd до завершения выполнения команды, а это повышает устойчивость кода в целом.

Для почитателей языка Visual Basic приведем пример кода обработки команды ASPI методом опроса.

Листинг 6.5. Обработка команды ASPI методом опроса на Visual Basic

Здесь для опроса завершения команды мы использовали операторы цикла While И Wend. При Желании их можно заменить на Do While и Loop.

На этом можно завершить описание способов обработки событий, ис пользуемых в интерфейсе ASPI. Теперь у нас есть все необходимые данные о работе ASPI, так что можно переходить к изучению многочисленных команд SCSI для управления разнообразными устройствами. Именно с помощью изученных функций расширения ASPI мы получаем возможность работать с оборудованием напрямую, не создавая специальных драйверов.

Для полноты информации приведем список значений, возвращаемых функциями ASPI.

  • SS_PENDING (0x00)

    Возвращается функцией SendASPi32Command, использующей одну из двух команд: SC_EXEC_SCSI_CMD или SC_RESET_DEV. Указывает на то, что команда находится в стадии выполнения.

  • SS_COMP (0x01)

    Возвращается функцией SendASPI32Command или через поле SRB_Status структуры SRB_ExecScsicmd. Указывает на успешное завершение команды.

  • SS_ABORTED (0x02)

    Выполнение команды было прервано операционной системой или был сделан сброс шины с использованием команды SC_ABORT_SRB.

  • SS_ERR (0x04)

    Возникает при выполнении команды SC_EXEC_SCSI_CMD. Указывает на то, что надо обработать поля SRB_TARGSTAT и SRB_HASTAT для получения расширенной информации о возникшей ошибке.

  • SS_INVALID_CMD (0x80)

    Поле SRB_cmd имеет недопустимое значение.

  • SS_INVALID_HA (0X81)

    Поле SRB_Haid имеет недопустимое значение. Используйте Ge-tASPi32Supportinfo, чтобы получить правильные значения.

  • SS_NO_DEVICE (0x82)

    Возвращается функцией SendASPi32Command или через поле SRB status структуры SRB_ExecScsiCmd. Указывает на отсутствие устройства по указанному адресу.

  • SS_INVALID_SRB (0xE0)

    Произошла ошибка при обработке структуры команды. Возможно, неправильно установлено поле SRB_Fiags (несовместимые флаги) или указатель буфера стал нулевым. Надо проанализировать структуру для исправления неточностей.

  • SS_BUFFER_ALING (OxE1)

    Буфер данных требует выравнивания.

  • SS_ILLEGAL_MODE (0xE2)

    Попытка использовать ASPI не под Win32 (например, для Windows 3.x).

  • SS_NO_ASPI (ОхЕЗ)

    В системе присутствует библиотека ASPI Wnaspi32.dll, но отсутствует драйвер ASPI. Следует обновить все файлы ASPI на компьютере.

  • SS_FAILED_INIT (0xE4)

    Общий сбой ASPI. Возможной причиной является неустойчивая работа системы.

  • SS_ASPI_IS_BUSY (0xE5)

    Возвращается функцией SendASPI32Command или через поле SRB_Status структуры SRB_ExecSCsicmd. Указывает на нехватку ресурсов для завершения операции.

  • SS_BUFFER_TO_BIG (ОхЕб)

    Возвращается через поле SRB_status. Указанный размер буфера не поддерживается устройством или(и) системой.

  • SS_MISMATCHED_COMPONENTS (0xE7)

    Конфликт версий файлов поддержки ASPI. Необходимо переустановить ASPI в системе.

  • SS_NO_ADAPTERS (0xE8)

    Возвращается функцией GetASPi32Supportinfo. Указывает на то, что инициализация ASPI прошла успешно, но в установленной системе отсутствуют поддерживаемые контроллеры.

 

 

2021-04-01

Google сообщил о запуске проекта Dunant

Проект Dunant, начатый в 2018 году, был запущен в эксплуатацию. Трансатлантический интернет-кабель соединяет США и континентальную Европу. Общая протяженность...

подробнее
2020-04-06

Новшества в обновленной Windows 10

Корпорация Microsoft завершила разработку обновления, в котором добавлено множество функций. Обновление содержит как доработку уже имеющихся систем, так...

подробнее

 

Все новости...

 

Научно-Техническое Объединение

Тел.: +7(4752) 55-95-86

E-mail:e-mail