Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Инициализация прерывания для устройства на ISA шине

66K
30 декабря 2010 года
bas784
1 / / 30.12.2010
Здраствуйте форумчане, очень нужна ваша помощь.
В своё время разработал драйвер для ОС Windows XP промышленного устройства на шине ISA.
Всё прекрастно работало и особых проблем с работой драйвера не наблюдалось, до тех пор пока разработчик не предоставил новое оборудование, использующее более чем одно ядро ЦП.
Теперь о проблеме :
Есть один 2-х ядерный компьютер промышленного типа на котором должна устанавливаться сборка Windows XP Embedded. На нем находится сетевое устройство которое висит на 7 прерывании.
Дополнительно разработчик предоставил флешь с установленной Windows XP Proffesional.
Но получается что в первом варианте c OC Windows XP Embedded мой драйвер не может схатить 7 - мое IRQ. Хотя инициализация проходит без ошибок.
При разговоре с разработчиками оборудования они советуют конфигурировать сборку, как одноядерный компьютер и тогда драйвер начинает функционировать, по крайней
мере удалось собрать такую сборку.

Вот работающий код для получения:
Код:
// Теперь не инициализируем объект 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;
        }

Поэтому возникает ряд
Почему на 2-х ядерном компьютере такой код не работоспособен?
А если работоспособен, как узнать кто не отдаёт 7-мое прерывание. Анализ с помощью Everest и диспечера устройств ничего не выявил.
Какие альтернатывные способы, кроме вышеизложеного, существуют для инициализации прерывания?

Заранее спасибо за ответы в этой теме!
252
10 января 2011 года
koderAlex
1.4K / / 07.09.2005
какая машина ?
260
11 января 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: bas784
Почему на 2-х ядерном компьютере такой код не работоспособен?
А если работоспособен, как узнать кто не отдаёт 7-мое прерывание.



1. Схемы генерации и обработки прерыванй в юнипроцессоре и мультипроессоре отличаются как аппаратно так и програмно.
2. Вектор то поди шаренный в случае с мультипроцессором? Да и радость от HalGetInterruptVector'а все в том же мультипроцессоре может и не наступить.

252
11 января 2011 года
koderAlex
1.4K / / 07.09.2005
если поменяли машину на промышленный комп , то для разрешения прерываний от ISA надо лезть в биос и пометить нужное прерывание как "Legacy ISA" .
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог