Понимание кода в rtc_interrupt - PullRequest
0 голосов
/ 24 февраля 2019

Мне нужно понять код в функции "Часы реального времени" rtc_interrupt.Код

rtc_irq_data += 0x100; 
rtc_irq_data &= ~0xff; 
rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0xF0);

Я не могу понять, почему это + = 0x100 и остальной код.

1 Ответ

0 голосов
/ 24 февраля 2019

Из книги «Разработка ядра 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 битаигнорируются.

...