Мне нужно понять код в функции "Часы реального времени" rtc_interrupt. Код
rtc_irq_data += 0x100;
rtc_irq_data &= ~0xff;
rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0xF0);
Я не могу понять, почему это += 0x100 и остальной код.





Из книги Роберта Лава «Разработка ядра 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 логически объединяется с отрицанием 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
The unused bits of Status Register 1 are read as "0s". They cannot be writen.
От Техническое описание часов реального времени
Следовательно, в качестве хорошей стандартной практики кодирования следует убедиться, что с помощью логического И 0xF0 игнорируются младшие 4 бита.