Обработка прерываний SD-карты
Драйверы карта secure Digital (SD) не имеют процедур обслуживания прерываний (ISR) и не получают ресурсы запроса прерывания (IRQ). Драйвер шины SD обнаруживает и перехватывает аппаратные прерывания, а затем передает их драйверу устройства с помощью процедуры обратного вызова уведомления о прерывании PSDBUS_CALLBACK_ROUTINE, как описано в разделах Secure Digital Driver Stack (SD) Driver Stack и Opening and Initializing an SD Bus Interface.
Драйверу устройства не нужно выполнять обработку прерываний в контексте процедуры обратного вызова уведомления о прерывании. Драйвер может вернуться из процедуры обратного вызова и завершить обработку прерываний в собственном контексте. Когда водитель завершает обработку прерывания, он информирует водителя шины явным вызовом процедуры подтверждения прерывания, поставляемой с интерфейсом шины SD. Дополнительные сведения о процедуре подтверждения прерывания см. в разделе PSDBUS_ACKNOWLEDGE_INT_ROUTINE. Когда водитель автобуса получает этот вызов, он повторно включает прерывание.
Драйверы sd-устройств имеют два варианта относительно уровней IRQ (IRQL), на которых они выполняются. Драйвер SD может работать исключительно в PASSIVE_LEVEL или в DISPATCH_LEVEL в контексте процедуры обратного вызова уведомления о прерывании и в PASSIVE_LEVEL остальное время. Когда драйвер sd-устройства работает исключительно в PASSIVE_LEVEL, водитель шины берет на себя ответственность за синхронизацию прерываний. Выберите этот параметр, если устройство может работать без строгих ограничений на задержку прерываний, так как это упростит структуру драйвера. Помимо разгрузки задачи прерывания синхронизации на водителя автобуса, есть и другие преимущества. Например, водители должны часто передавать данные в ответ на прерывание. Если подпрограмма обратного вызова драйвера выполняется в PASSIVE_LEVEL, она может выполнять синхронную операцию ввода-вывода, а не асинхронную. Если подпрограмма обратного вызова выполняется на DISPATCH_LEVEL, драйвер должен подождать, пока он не будет запущен на более низком уровне IRQL, прежде чем выполнять синхронные операции ввода-вывода.
Драйвер sd-устройства указывает IRQL, по которому он будет выполняться при инициализации интерфейса sd bus. Для выполнения на DISPATCH_LEVEL в подпрограмме обратного вызова уведомления о прерывании драйвер должен задать для элемента CallbackAtDpcLevel структуры SDBUS_INTERFACE_PARAMETERS значение TRUE и передать эту структуру в подпрограмму инициализации интерфейса. Описание подпрограммы интерфейса см. в разделе PSDBUS_INITIALIZE_INTERFACE_ROUTINE. Чтобы выполняться исключительно в PASSIVE_LEVEL, драйвер должен установить для CallbackAtDpcLevel значение FALSE.