Из книги «Разработка ядра Linux» Роберта Лава этот фрагмент кода имеет следующие комментарии:
/*
* Can be an alarm interrupt, update complete interrupt,
* or a periodic interrupt. We store the status in the
* low byte and the number of interrupts received since
* the last read in the remainder of rtc_irq_data.
*/
Что касается rtc_irq_data += 0x100;
Итак, мы знаем, что есть счетчикдля прерываний, полученных в старшем байте.Отсюда 0x100.Если 16-битное шестнадцатеричное числовое представление, где старший байт добавляется +1 (более одного прерывания на счетчике).
Что касается второй строки, rtc_irq_data &= ~0xff;
rtc_irq_data логически ANDED с отрицанием 0xff, например, возможно с 0xff00.Высокая часть целого числа сохраняется, а нижняя часть отбрасывается.Таким образом, если предположить, что это был первый раз, значение, которое теперь гарантированно будет равно 0x0100.
Последняя часть rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0xF0);
выполняет логическое ИЛИ |=
младшего байта (то есть теперь 0 / 0x00) с текущим статусом RTC.Отсюда и комментарий «Мы храним статус в младшем байте».
Что касается выполнения логического И с 0xF0 в (CMOS_READ(RTC_INTR_FLAGS) & 0xF0)
, обращающегося к исходной AT-совместимой таблице данных RTC, INTR_FLAGS - это REGISTER C, регистровый байт, гдеиспользуются только 4 верхних бита.b7 = IRQF, b6 = FP, b5 = AF, b4 = UF,
b3 до b0
Неиспользуемые биты регистра состояния 1 читаются как «0».Они не могут быть записаны.
Из таблицы RTC
Следовательно, в качестве хорошей стандартной практики кодирования, убедившись в логическом 0xF0 AND, что младшие 4 битаигнорируются.