// Теперь не инициализируем объект DPC,
// а закрепляем за объектом устройства (а значит и за обслуживаемым
// им прерыванием) единственную DpcForIsr функцию:
// IoInitializeDpcRequest( fdo, DpcForIsr );
// Создаем и подключаем объект прерываний:
KIRQL kIrql;
KAFFINITY kAffinity;
ULONG kVector =
HalGetInterruptVector(Isa, 0, 7,7,
&kIrql, &kAffinity);
// Замечание. Для Isa шины второй параметр (номер шины) обычно
// равен 0, а третий и четвертый параметры равны.
status =
IoConnectInterrupt (
&dx->pIntObj, // Здесь будет создан Interrupt Object
Isr, // Наша функция ISR
dx, // Этот указатель ISR функция будет
// получать при вызове (контекстный указатель)
NULL, // Не будем использовать spin-блокировку для
// безопасного доступа к совместно используемым
// данным
kVector, // транслированное значение прерывания
kIrql, // DIRQL
kIrql, // DIRQL
Latched
//LevelSensitive
, // Прерывание по перепаду
false, // Совместно используемое (Shared) прерывание
kAffinity, // Поцессоров в мультипроцессорной системе
FALSE ); // Не сохранять значения регистров сопроцессора
if (!NT_SUCCESS(status))
{
// В случае неудачи удаляем объект устройства
IoDeleteDevice( fdo );
DbgPrint("Error Interrapt, 0x%x",status);
return status;
}
Инициализация прерывания для устройства на ISA шине
В своё время разработал драйвер для ОС Windows XP промышленного устройства на шине ISA.
Всё прекрастно работало и особых проблем с работой драйвера не наблюдалось, до тех пор пока разработчик не предоставил новое оборудование, использующее более чем одно ядро ЦП.
Теперь о проблеме :
Есть один 2-х ядерный компьютер промышленного типа на котором должна устанавливаться сборка Windows XP Embedded. На нем находится сетевое устройство которое висит на 7 прерывании.
Дополнительно разработчик предоставил флешь с установленной Windows XP Proffesional.
Но получается что в первом варианте c OC Windows XP Embedded мой драйвер не может схатить 7 - мое IRQ. Хотя инициализация проходит без ошибок.
При разговоре с разработчиками оборудования они советуют конфигурировать сборку, как одноядерный компьютер и тогда драйвер начинает функционировать, по крайней
мере удалось собрать такую сборку.
Вот работающий код для получения:
Код:
Поэтому возникает ряд
Почему на 2-х ядерном компьютере такой код не работоспособен?
А если работоспособен, как узнать кто не отдаёт 7-мое прерывание. Анализ с помощью Everest и диспечера устройств ничего не выявил.
Какие альтернатывные способы, кроме вышеизложеного, существуют для инициализации прерывания?
Заранее спасибо за ответы в этой теме!
какая машина ?
Цитата: bas784
Почему на 2-х ядерном компьютере такой код не работоспособен?
А если работоспособен, как узнать кто не отдаёт 7-мое прерывание.
А если работоспособен, как узнать кто не отдаёт 7-мое прерывание.
1. Схемы генерации и обработки прерыванй в юнипроцессоре и мультипроессоре отличаются как аппаратно так и програмно.
2. Вектор то поди шаренный в случае с мультипроцессором? Да и радость от HalGetInterruptVector'а все в том же мультипроцессоре может и не наступить.
если поменяли машину на промышленный комп , то для разрешения прерываний от ISA надо лезть в биос и пометить нужное прерывание как "Legacy ISA" .