저는 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 파일은? 어떻게 고칠 수 있습니까?
링크 대신 관련 코드를 게시하십시오. 링크가 죽어 가고 이것이 무엇인지 알 수 있다면 읽는 것이 훨씬 더 좋을 것입니다. – Soana
게시물에 관련 코드를 추가했습니다. – Razican
스레드가 실행되는 동안 'Temperature' 인스턴스가 범위를 벗어날 수있는 것처럼 보입니다. 테스트가 스레드가 종료 될 때까지 기다려야 할 수도 있습니다. – quamrana