2015-02-02 4 views
0

저는 I2C를 통해 Raspberry Pi의 온도 센서 값을 가져 오는 C++ 11 클래스에서 작업하고 있습니다. 중지 될 때까지 값을 폴링합니다. 별도의 스레드에서 폴링을 수행하므로 응용 프로그램 흐름이 중단되지 않습니다. https://github.com/OpenStratos/server/blob/feature/temperature/temperature/Temperature.cpp#L64속성 값을 변경할 때 분할 오류가 발생했습니다.

void Temperature::read_temperature() 
{ 
    while (this->reading) 
    { 
     #ifndef OS_TESTING 
      int value = wiringPiI2CRead(this->filehandle); 
     #else 
      int value = 16000; 
     #endif 

     float voltage = value * 5/32768; // 2^15 
     float temp = r_to_c(TEMP_R * (TEMP_VIN/voltage - 1)); 
     this->temperature = temp; // Gives segmentation fault 

     this_thread::sleep_for(chrono::milliseconds(50)); 
    } 
} 

는이 세그먼트 오류를 ​​제공합니다 : 문제는이 파일의 라인 (64)에 있다는 것입니다. 천재적 인 일은 항상 그런 것은 아니라는 것입니다. 컴파일 한 후, 바이너리를 여러 번 실행하면 시간의 75 %가 충돌합니다. https://github.com/OpenStratos/server/blob/feature/temperature/testing/temperature_test.cpp

Temperature temp(20); 
temp.start_reading(); 
AssertThat(temp.is_reading(), Equals(true)); 

// this_thread::sleep_for(chrono::milliseconds(100)); if uncommented less segmentation faults 

temp.stop_reading(); 
AssertThat(temp.is_reading(), Equals(false)); 

일이 될 수있는 무엇 :

이 코드를 invoques 파일은? 어떻게 고칠 수 있습니까?

+1

링크 대신 관련 코드를 게시하십시오. 링크가 죽어 가고 이것이 무엇인지 알 수 있다면 읽는 것이 훨씬 더 좋을 것입니다. – Soana

+0

게시물에 관련 코드를 추가했습니다. – Razican

+0

스레드가 실행되는 동안 'Temperature' 인스턴스가 범위를 벗어날 수있는 것처럼 보입니다. 테스트가 스레드가 종료 될 때까지 기다려야 할 수도 있습니다. – quamrana

답변

1

당신은 Temperature::read_temperature() 종료 때까지 기다릴 필요가있다, 그래서 당신이 필요합니다

bool reading; 
volatile bool stopped; // volatile required to make the compiler re-read 
         // the value everytime we expect it to. 
// 
bool is_stopped(){ return stopped; } 

void Temperature::start_reading() 
{ 
    if (!reading) 
    { 
     stopped = false; 
     reading = true; 
     // etc 

void Temperature::read_temperature() 
{ 
    while (this->reading) 
    { 
    // etc 
    } 
    stopped=true; 
} 

temp.stop_reading(); 
while(!temp.is_stopped(); 
AssertThat(temp.is_reading(), Equals(false)); 
+0

감사! 나는 그것을 생각하지 않았다. 하지만 새로운 문제가 생겼습니다. 스크립트는 'while (! temp.is_stopped();에 변경하면 발생하지 않습니다. while (! temp.is_stopped() {this_thread :: sleep_for – Razican

+0

아직'C++ 11 '전문가가 아니지만 정지 된 것을'volatile bool stopped;'으로 변경해 보거나, 또는''{{{{{{{{{ 중지됨 .' – quamrana

+0

퍼펙트! volatile 키워드로 트릭을 만들었습니다. 컴파일러가 코드에서 변경하지 않는 것처럼 while()이 각 반복에서 값을 확인하지 않았습니다. ,하지만 다른 스레드가 그것을 변경했다. 많이 고마워! – Razican