2011-10-22 5 views
0

리눅스 커널 모듈에서 CPU 온도를 모니터링하고 델타 T를 계산하려고합니다. 커널 모듈에 대해서는별로 잘 모르지만 do_div()를 사용하여 정수로 나눕니다.CPU 온도 델타 T 커널 모듈 모니터

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

내 출력이 항상 델타 T = 1, 나머지 = x는 : 난 항상 여기에베이스 (1)을 얻을 내 코드가 왜 는 이해가 안 돼요. 원하는 출력은 deltaT = x이고 나머지는 y입니다. 델타 T에 대한 나의 공식은 다음과 같습니다 당신이 do_div()을 사용할지 여부를

(sfan_temp-sfan_temp_old)/sfan_temp * 100; 

예를 들어 sfan_temp = 75 ° C 및 sfan_temp_old = 65 ° C는

(75-65)/75*100 = 13.3333333 

답변

1

알 수없는 경우. 하지만 당신은 그것을 사용하는 경우 :

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; 
} 

당신의 예에서 : 당신이 경우 deltaT에 대한 1 대신 0을 얻을 수있는 방법 불분명하다

n = 75 - 65 = 10 
base = 75 

// => 
remainder = 10 % 75 = 10 
deltaT = n = 10/75 = 0 

.

적용 *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