我有一个机器人运行控制代码,在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
);
}
}
我需要以很好的速率(可能是100-125Hz)记录来自多个变量(可能是20-50)的数据.数据不需要以控制速率(每2ms)记录,但我已经将其减少到12ms,我仍然看到每隔几分钟出现延迟峰值.
延迟可能是fprintf调用的问题.这是BeagleBone Black的限制,我的代码,还是数据记录的本质?