我正在尝试监视CPU温度并计算Linux内核模块中的T。我对内核模块了解不多,但我使用do_div()除以一个整数。我不明白为什么总是以1为底。下面是我的代码:
deltaT = sfan_temp - sfan_temp_old;
remainder = do_div ( deltaT, sfan_temp );
我的输出总是deltaT = 1, remainder = x。我想要的输出是deltaT = x, remainder = y。T的公式是
(sfan_temp-sfan_temp_old)/sfan_temp * 100;
例如,如果sfan_temp = 75°C, sfan_temp_old = 65°C,则
(75-65)/75*100 = 13.3333333
我不知道你是否应该使用do_div()
。但是如果你使用它,那么:
源自div64.h
:
// the semantics of do_div() macros are:
uint32_t do_div(uint64_t *n, uint32_t base) {
uint32_t remainder = *n % base;
*n = *n / base;
return remainder;
}
在你的例子中:
n = 75 - 65 = 10
base = 75
// =>
remainder = 10 % 75 = 10
deltaT = n = 10 / 75 = 0
尚不清楚在这种情况下,deltaT
如何获得1
而不是0
。
在do_div()
之前应用*100
:
n = (sfan_temp - sfan_temp_old)*100;
remainder = do_div(n, sfan_temp)
// =>
remainder = 1000 % 75 = 25 // remainder/sfan_temp = 0.3333
n = 1000/75 = 13