Я пытаюсь заставить E1000 генерировать прерывание при получении пакета,
// enable Receiver Timer Interrupt
reg_IMS = (uint32_t *) (base + E1000_IMS);
*reg_IMS = E1000_IMS_RXT0;
К сожалению, прерывание происходит только один раз.Мое предположение, что прерывание не было очищено.В соответствии с руководством ,
Прерывание Причина Считывание Регистр ICR (000C0H; R)
Все биты регистра очищаются при чтении.В результате чтение этого регистра неявно подтверждает любые ожидающие события прерывания.
и комментарий некоторый код , чтение ICR (регистр чтения причины прерывания) очистит прерывание,
/* Clear any pending interrupt events. */
icr = E1000_READ_REG(hw, ICR);
но это не сработало.Вот соответствующие сообщения (E1000_DEBUG=TX,TXERR,RX,RXERR,RXFILTER,interrupt
),
e1000: tx disabled
e1000: set_ics 2, ICR 0, IMR 0
e1000: set_ics 0, ICR 2, IMR 80
e1000: set_ics 80, ICR 2, IMR 80
e1000: RCTL: 127, mac_reg[RCTL] = 0x84008002
e1000: set_ics 80, ICR 82, IMR 80
e1000: ICR read: 82
ICR=82
e1000: ICR read: 0
ICR=0
e1000: set_ics 0, ICR 0, IMR 80
...
e1000: set_ics 80, ICR 0, IMR 80
e1000: set_ics 3, ICR 80, IMR 80
ns: 52:54:00:12:34:56 bound to static IP 10.0.2.15
NS: TCP/IP initialized.
opened socket
trying to bind
bound
, которые показывают, что мой обработчик прерываний карты nework действительно прочитал ICR (ICR = 82 и ICR = 0 был напечатан обработчиком) впервые.Поскольку нет никакого более позднего для "set_ics 80, ICR 0".
Кто-нибудь знает, как очистить / подтвердить прерывание?На самом деле это часть проекта 6 MIT 6.828 .
Спасибо!