当前位置: 首页 > 知识库问答 >
问题:

实时嵌入式Linux中数据日志记录时的延迟峰值

荆修明
2023-03-14
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
        );
    }
}

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

这里提出了一个类似的问题,但似乎没有解决我的问题:在嵌入式Linux系统中查找延迟问题(stalls)

共有1个答案

云慈
2023-03-14

使用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);

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

 类似资料:
  • 我想更改我的嵌入式数据库的日志记录。每次我打开一个连接,atm都会记录“......创建新的JDBC驱动程序连接到......”。在我的测试套件中,我为每个请求打开一个新的连接,现在有很多这样的消息。 我没有找到任何类型的日志级别。我只是可以设置PrintWriter。但是我想看看错误msgs。我在Spring之外运行这个作为常规单元测试。 有什么想法吗?

  • 我正在寻找一种方法来集中分布式软件(用Java编写)的日志问题,这将非常简单,因为所讨论的系统只有一台服务器。但请记住,未来很可能会运行更多特定服务器的实例(并且需要更多的应用程序),因此必须有类似日志服务器的东西,它负责处理传入日志,并使支持团队能够访问这些日志。 目前的情况是,一些java应用程序使用log4j将其数据写入本地文件,因此,如果客户机过期出现问题,支持团队必须要求提供日志,这并不

  • 如何让log4j记录jetty请求延迟? 另外,我看到logback内置了对自己的RequestLogImpl https://logback.qos.ch/access.html的支持 和application insights支持日志备份https://docs.microsoft.com/en-us/azure/azure-monitor/app/java-trace-logs 然而,我似乎

  • 问题内容: 因此,我有一个在Linux系统上运行的守护程序,我想要记录其活动:日志。问题是,完成此任务的“最佳”方法是什么? 我的第一个想法是简单地打开一个文件并将其写入。 用这种方式记录日志有天生的错误吗?有没有更好的方法,例如Linux内置的某些框架? 问题答案: Unix长期以来一直使用一种称为syslog的特殊日志记录框架。输入您的外壳 您将获得C接口的帮助。 一些 例子

  • 更新:到目前为止,性能最好的算法就是这个。 这个问题探索了检测实时时间序列数据中突然峰值的鲁棒算法。 考虑下面的示例数据: 此数据的示例为Matlab格式(但此问题与语言无关,而与算法有关): 你可以清楚地看到有三个大峰和一些小峰。此数据集是问题所涉及的timeseries数据集类的一个特定示例。此类数据集具有两个一般特征: 存在具有一般平均值的基本噪声 存在明显偏离噪声的大“峰值”或“更高数据点

  • 问题内容: 默认情况下,使用以下格式打印: 其中638是毫秒。我需要将逗号更改为点: 要格式化时间,我可以使用: 但是,文档未指定如何设置毫秒格式。我已经找到了这个关于微秒的问题,但是a)我更喜欢毫秒,并且b)由于以下原因,以下内容在Python 2.6(我正在开发)上不起作用: 问题答案: 请注意,[ 克雷格·麦克丹尼尔(CraigMcDaniel)的解决方案显然更好。 这也应该工作: logg