我需要了解“实时时钟”函数rtc_interrupt中的代码。代码是
--num-executors and --executor-cores
我无法理解为什么它是+ = 0x100和其余的代码。
答案 0 :(得分:3)
罗伯特·洛夫(Robert Love)的《 Linux内核开发》一书中的那段代码具有以下注释:
rtc_irq_data += 0x100;
rtc_irq_data &= ~0xff;
rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0xF0);
对于/*
* 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.
*/
,因此,我们知道在高字节中有一个计数器用于接收中断。因此为0x100。如果是16位十六进制数表示形式,则将最高字节加+1(计数器上有一个以上的中断)。
对于第二行,rtc_irq_data += 0x100;
rtc_irq_data与0xff取反,例如可能与0xff00进行逻辑AND运算。整数的高位部分被保留,而低位部分被丢弃。因此,假设这是第一次被调用,则该值现在可以保证为0x0100。
最后一部分rtc_irq_data &= ~0xff;
对低字节(现在为0 / 0x00)进行逻辑或rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0xF0);
,并将其作为RTC当前状态。因此,注释“我们将状态存储在低字节中”。
关于在|=
中与0xF0进行逻辑与的操作,请查阅原始的AT兼容RTC数据表,INTR_FLAGS是REGISTER C,即仅使用4个向上位的寄存器字节。 b7 = IRQF,b6 = FP,b5 = AF,b4 = UF,
b3至b0
状态寄存器1的未使用位读取为“ 0s”。他们不能是
因此,作为一种良好的标准编码实践,请确保使用AND逻辑0xF0忽略低4位。