gpt4 book ai didi

c - 在实时嵌入式 Linux 中记录数据时出现延迟峰值

转载 作者:太空狗 更新时间:2023-10-29 15:06:58 24 4
gpt4 key购买 nike

我有一个机器人在 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)的数据。不需要以控制速率(每 2 毫秒)记录数据,但我已将其减少到 12 毫秒,但我仍然每隔几分钟就会看到延迟峰值。

延迟可能是 fprintf 调用的问题。这是 BeagleBone Black、我的代码的限制,还是仅仅是数据记录的性质?

此处提出了类似的问题,但似乎没有解决我的问题:Finding latency issues (stalls) in embedded Linux systems

最佳答案

使用 fprintf 会耗费大量时间,尤其是对于 R/T 日志记录。以二进制形式进行日志记录,并编写一个实用程序稍后将其打印出来。

代替:

fprintf(file,"%.2f %.2f %.2f",data1,data2,data3);

做:

fwrite(&data1,sizeof(double),1,file);
fwrite(&data2,sizeof(double),1,file);
fwrite(&data3,sizeof(double),1,file);

更好的是:

struct data {
double data1;
double data2;
double data3;
time_t event_time;
...
};

struct data data;

fwrite(&data,sizeof(struct data),1,file);

如果它仍然太慢,将结构附加到环形队列并让一个单独的线程写出条目。

如果磁盘写入跟不上 [现在] 二进制数据,维护环形队列,只有在检测到 fatal error 时才转储队列事后分析


此外,考虑在写入时使用mmap 访问文件。请在此处查看我的回答 [带基准测试]:read line by line in the most efficient way *platform specific*

关于c - 在实时嵌入式 Linux 中记录数据时出现延迟峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35142253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com