我有一个简单的C文件,由java应用程序启动。
此脚本管理物理传感器以检测距离。对于每个客户,我有多个传感器。访问C文件的每个Object都在一个充满活力的线程上运行。所以基本上在启动时,应用程序会为每个传感器创建一个线程。
现在我的问题是我发现有时候(不知道为什么......)一个或多个线程停止工作。他们不会崩溃,他们只是停下来。我发现在这个时刻,在客户端进程列表中,C文件从很长时间开始执行(通常持续2秒......)。所以我认为问题在于C可执行文件。我不知道怎么检查它阻塞的地方......我在等待信号的时候设置了if条件,但它不在那里..
这是脚本
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
int main(int argc, char **argv)
{
int TRIG = atoi(argv[1]);
int ECHO = atoi(argv[2]);
wiringPiSetup();
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
int a;
int totalDistance;
int steps = 10;
long travelTime;
for (a = 0; a < steps; a = a + 1){
digitalWrite(TRIG, LOW);
delay(100);
// Send trig pulse
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
// Wait for echo start
while (digitalRead(ECHO) == LOW);
// Wait for echo end
long startTime = micros();
while (digitalRead(ECHO) == HIGH) {
travelTime = micros() - startTime;
if (travelTime > 25000) {
travelTime = 25000;
break;
}
}
printf("tempo: %d", travelTime);
// Get distance in cm
int distance = travelTime / 58;
totalDistance = totalDistance + distance;
delay(100);
}
int meanDistance = totalDistance / steps;
printf("%d", meanDistance);
return 0;
}
答案 0 :(得分:0)
正如ynimous建议的那样,你可以尝试在行上设置超时
while (digitalRead(ECHO) == LOW);
即使它只是打印错误信息,至少你能说出来。像这样:
long lowStartTime = micros();
while (digitalRead(ECHO) == LOW) {
if (micros() - startTime > 100000) { // or some reasonable value
printf("error: echo timed out!");
break; // and handle error appropriately
}
}