我有一个机器人运行控制代码,在Beaglebone Black上的PREEMPT-RT补丁Linux操作系统上具有实时优先级.所有代码都用C语言编写,运行频率为500Hz.
在运行代码时,我经常注意到几百毫秒的延迟,我已将其跟踪到我编写的数据记录功能.这种延迟导致我的机器人控制失败,因为我有很多,具体取决于实时功能.
代码的相关部分如下.为了清晰起见,我已经删除了很多代码,但如果需要的话,我会编辑这篇文章.
FILE *file;
int main(int argc, char** argv) {
file = fopen(logname, "w");
while (1) {
/* Control code stuff*/
logData();
time_msec = time_msec + controlLoopTime;
}
}
void logData() {
if (time_msec - logTimer_msec >= LOG_TIMER) {
logTimer_msec = time_msec;
if (!bLogCreated) {
fprintf(file,
"SensorData1 SensorData2 SensorDataN"
);
bLogCreated = TRUE;
}
// log data to file
fprintf(file,
"%.2f %.2f\n",
sensorData1, sensorData2, sensorDataN
);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要以很好的速率(可能是100-125Hz)记录来自多个变量(可能是20-50)的数据.数据不需要以控制速率(每2ms)记录,但我已经将其减少到12ms,我仍然看到每隔几分钟出现延迟峰值.
延迟可能是fprintf呼叫的问题.这是BeagleBone Black的限制,我的代码,还是数据记录的本质?
这里也提出了类似的问题,但似乎没有解决我的问题:在嵌入式Linux系统中查找延迟问题(停顿)