2011-10-22 41 views
0

我試圖監視CPU溫度並計算Linux內核模塊中的增量T.我對內核模塊知之甚少,但我正在使用do_div()來分割整數。 我不明白爲什麼我總是得到一個基地1。這裏是我的代碼:監視CPU溫度增量T內核模塊

deltaT = sfan_temp - sfan_temp_old; 
remainder = do_div (deltaT, sfan_temp); 

我的輸出總是會將DeltaT = 1和餘數= X。 我期望的輸出是deltaT = x和餘數= y。 我對ΔT的計算公式爲:

(sfan_temp-sfan_temp_old)/sfan_temp * 100; 

例如,如果sfan_temp = 75℃,並sfan_temp_old = 65℃,然後

(75-65)/75*100 = 13.3333333 

回答

1

不知是否應該使用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 

目前還不清楚如何在這種情況下獲得1而不是0deltaT

應用*100do_div()

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