RT-Thread 下的文件内容对比 MSH shell cmd 命令实现方法

news2025/1/16 11:03:35

前言

  • 在使用 RT-Thread 时,需要对两个文件的内容进行比较,顺手写了一个测试的 MSH shell 命令,经过优化,发现功能可以使用

  • RT-Thread 下支持多种文件系统,如FAT等,可以通过 USB、串口 的 Ymodem 等协议把文件导出到电脑上进行内容的分析,如果文件一时间无法导出,需要确认两个文件内容是否相同,怎么办?就写个简单的文件内容对比测试命令即可

相关代码

  • RT-Thread 的 MSH shell cmd 代码,存放的位置可以随意,如可以放在专门的测试代码目录的文件中,或者main.c 中,只有构建编译到即可
#ifdef DFS_USING_POSIX
#include <unistd.h>
#include <fcntl.h>
#endif /* DFS_USING_POSIX */

static void _buffer_dump(char *buffer, int size)
{
    int i;
    for(i = 0; i < size / 8; i++)
    {
        rt_kprintf("%02x %02x %02x %02x ",
            *(buffer + i * 8),
            *(buffer + i * 8 + 1),
            *(buffer + i * 8 + 2),
            *(buffer + i * 8 + 3));

        rt_kprintf("%02x %02x %02x %02x\r\n",
            *(buffer + i * 8 + 4),
            *(buffer + i * 8 + 5),
            *(buffer + i * 8 + 6),
            *(buffer + i * 8 + 7));
    }
}

int file_compare(int argc, char **argv)
{
    int fd1 = -1;
    int fd2 = -1;
    int diff_count = 0;
    int dump_line = 1;
    int total_count = 0;

    char *rbuf1 = RT_NULL;
    char *rbuf2 = RT_NULL;

    rt_kprintf("%s : argc = %d\n", __func__, argc);

    if (argc < 3)
    {
        rt_kprintf("[Usage] : %s : file_path1 file_path2 \n", __func__);
        return -1;
    }

    if (argc > 3)
    {
        dump_line = atoi(argv[3]);
    }

    rt_kprintf("%s : argv[0] = %s \n", __func__, argv[0]);
    rt_kprintf("%s : file_path1= %s \n", __func__, argv[1]);
    rt_kprintf("%s : file_path2= %s \n", __func__, argv[2]);

    fd1 = open(argv[1], O_RDONLY, 0);
    if (fd1 < 0)
    {
        rt_kprintf("%s : file_path1 open fail\n", __func__);
        return -1;
    }

    fd2 = open(argv[2], O_RDONLY, 0);
    if (fd2 < 0)
    {
        rt_kprintf("%s : file_path2 open fail\n", __func__);
        close(fd1);
        return -1;
    }

    rbuf1 = rt_malloc(4096);
    if (!rbuf1)
    {
        rt_kprintf("%s : rbuf1 memory failed\n", __func__);
        close(fd1);
        close(fd2);
        return -1;
    }

    rt_memset(rbuf1, 0, 4096);

    rbuf2 = rt_malloc(4096);
    if (!rbuf2)
    {
        rt_kprintf("%s : rbuf2 memory failed\n", __func__);
        rt_free(rbuf1);
        close(fd1);
        close(fd2);
        return -1;
    }

    rt_memset(rbuf2, 0, 4096);

    rt_kprintf("%s : compare enter\n", __func__);

    while (read(fd1, rbuf1, 4096) > 0)
    {
        total_count++;
        if ((read(fd2, rbuf2, 4096) > 0))
        if (rt_memcmp(rbuf1, rbuf2, 4096) != 0)
        {
            diff_count++;
            rt_kprintf("%s : compare fail, count = %d\n", __func__, total_count);
            if (dump_line > 0x00)
            {
                rt_kprintf("%s : dump file1 = %s \n", __func__, argv[1]);
                _buffer_dump(rbuf1, 4096);
                rt_kprintf("%s : dump file2 = %s \n", __func__, argv[2]);
                _buffer_dump(rbuf2, 4096);
                dump_line--;
            }
            //return -1; /* continue compare */
        }
    }

    close(fd1);
    close(fd2);
    rt_kprintf("%s : compare end!\n", __func__);
    rt_kprintf("%s : total_count = %d, diff_count = %d!\n", __func__, total_count, diff_count);
    rt_free(rbuf1);
    rt_free(rbuf2);

    return 0;
}
MSH_CMD_EXPORT(file_compare, file_compare);

命令解释

  • 命令的格式: file_compare file1 file2 diff_page_number

  • file1 与 file2 是 两个文件,可以有路径,没有路径就是当前 shell 运行的目录下

  • diff_page_number 默认打印一个page,这里是 4K 字节,也就是每次4K 字节进行对比,如果发现内容不相同,就打印出这4K字节的数据

运行效果

msh />file_compare output/batch_0_ts_0.bin ref_output/rf_009_CONV_005_ts_DWH_bid0.bin
file_compare : argc = 3
file_compare : argv[0] = file_compare 
file_compare : file_path1= output/batch_0_ts_0.bin 
file_compare : file_path2= ref_output/rf_009_CONV_005_ts_DWH_bid0.bin 
file_compare : compare enter
file_compare : compare fail, count = 83
file_compare : dump file1 = output/batch_0_ts_0.bin 
14 00 0f 00 17 00 02 00
00 1e 00 00 0b 04 0d 00
00 1c 00 00 14 00 18 00
07 03 10 06 0d 02 3d 00
12 12 2f 03 00 00 17 00
17 00 0c 00 14 00 01 00
00 1d 03 00 07 06 0f 00
00 13 00 00 10 00 17 00
07 0e 16 0a 0f 04 37 00
0d 15 26 08 00 00 10 00
16 00 0f 00 16 00 00 00
00 1b 00 00 0b 01 0d 00
00 1c 00 00 11 00 16 00

.....


file_compare : dump file2 = ref_output/rf_009_CONV_005_ts_DWH_bid0.bin 
14 00 0f 00 17 00 02 00
00 1e 00 00 0b 04 0d 00
00 1c 00 00 14 00 18 00
07 03 10 06 0d 02 3d 00
12 12 2f 03 00 00 17 00
17 00 0c 00 14 00 01 00
00 1d 03 00 07 06 0f 00
00 13 00 00 10 00 17 00
07 0e 16 0a 0f 04 37 00
0d 15 26 08 00 00 10 00
16 00 0f 00 16 00 00 00
00 1b 00 00 0b 01 0d 00
00 1c 00 00 11 00 16 00
07 05 10 08 0c 03 3c 00
11 0e 30 02 00 00 16 00
18 00 0d 00 18 00 01 00
00 1e 02 00 07 07 10 00

.......


0d 00 00 1f 00 00 00 00
file_compare : compare fail, count = 84
file_compare : compare fail, count = 85
file_compare : compare fail, count = 86
file_compare : compare fail, count = 87
file_compare : compare fail, count = 88
file_compare : compare fail, count = 89
file_compare : compare fail, count = 90
file_compare : compare fail, count = 91
file_compare : compare fail, count = 92
file_compare : compare fail, count = 93
file_compare : compare fail, count = 94
file_compare : compare fail, count = 95
file_compare : compare fail, count = 96
file_compare : compare fail, count = 97
file_compare : compare fail, count = 98
file_compare : compare fail, count = 99
file_compare : compare fail, count = 100
file_compare : compare fail, count = 101
file_compare : compare fail, count = 102
file_compare : compare fail, count = 103
file_compare : compare fail, count = 104
file_compare : compare fail, count = 105
file_compare : compare fail, count = 106
file_compare : compare fail, count = 107
file_compare : compare fail, count = 108
file_compare : compare fail, count = 109
file_compare : compare fail, count = 110
file_compare : compare fail, count = 111
file_compare : compare fail, count = 112
file_compare : compare fail, count = 113
file_compare : compare fail, count = 114
file_compare : compare fail, count = 115
file_compare : compare fail, count = 116
file_compare : compare fail, count = 117
file_compare : compare fail, count = 118
file_compare : compare fail, count = 119
file_compare : compare fail, count = 120
file_compare : compare fail, count = 121
file_compare : compare fail, count = 122
file_compare : compare fail, count = 123
file_compare : compare fail, count = 124
file_compare : compare fail, count = 125
file_compare : compare fail, count = 126
file_compare : compare fail, count = 127
file_compare : compare fail, count = 128
file_compare : compare fail, count = 129
file_compare : compare fail, count = 130
file_compare : compare fail, count = 131
file_compare : compare fail, count = 132
file_compare : compare fail, count = 133
file_compare : compare fail, count = 134
file_compare : compare fail, count = 135
file_compare : compare fail, count = 136
file_compare : compare fail, count = 137
file_compare : compare fail, count = 138
file_compare : compare fail, count = 139
file_compare : compare fail, count = 140
file_compare : compare fail, count = 141
file_compare : compare fail, count = 142
file_compare : compare fail, count = 143
file_compare : compare fail, count = 144
file_compare : compare fail, count = 145
file_compare : compare fail, count = 146
file_compare : compare fail, count = 147
file_compare : compare fail, count = 148
file_compare : compare fail, count = 149
file_compare : compare fail, count = 150
file_compare : compare fail, count = 151
file_compare : compare fail, count = 152
file_compare : compare fail, count = 153
file_compare : compare fail, count = 154
file_compare : compare fail, count = 155
file_compare : compare fail, count = 156
file_compare : compare fail, count = 157
file_compare : compare fail, count = 158
file_compare : compare fail, count = 159
file_compare : compare fail, count = 160
file_compare : compare end!
file_compare : total_count = 160, diff_count = 78!
  • 如以上,比对结果是失败的,默认把比对失败的第一个4K 大小的 buffer 二进制打印出来,可以复制出来使用文件对比工具,如 Beyond Compare 进行数据差异对比

  • 两个文件内容相同时的对比结果

msh />file_compare output/batch_0_ts_0.bin ref_output/rf_009_CONV_005_ts_DWH_bid0.bin
file_compare : argc = 3
file_compare : argv[0] = file_compare 
file_compare : file_path1= output/batch_0_ts_0.bin 
file_compare : file_path2= ref_output/rf_009_CONV_005_ts_DWH_bid0.bin 
file_compare : compare enter
file_compare : compare end!
file_compare : total_count = 160, diff_count = 0!

小结

  • 熟悉 RT-Thread MSH shell cmd 命令的编写方法,如命令行后面的参数的个数、参数的处理方法

  • shell cmd 参数的个数:argc ,命令本身算一个,也就是 file_compare f1 f2,argc = 3,其中 argv[0] = file_compare , argv[1] = f1, argv[2] = f2

  • 默认 RT-Thread 的 shell cmd 长度有限制,如果命令行很长,需要在RT-Thread 中进行配置

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv5-seg数据集制作、模型训练以及TensorRT部署

YOLOv5-seg数据集制作、模型训练以及TensorRT部署版本声明一、数据集制作&#xff1a;图像 Json转txt二、分割模型训练三 tensorRT部署版本声明 yolov5-seg:官方地址&#xff1a;https://github.com/ultralytics/yolov5/tree/v6.2 TensorRT&#xff1a;8.x.x 语言&#xff1a;…

基于stm32单片机体重秤电子秤超重提醒

资料编号&#xff1a;107 下面是相关功能视频演示&#xff1a; 107-基于stm32单片机体重秤电子秤称重超重报警Proteus仿真&#xff08;源码仿真全套资料&#xff09;功能介绍&#xff1a; 采用stm32单片机&#xff0c;可以设置称重上限制&#xff0c;LCD1602显示重量&#xf…

04_tcp

知识点1【多播】 多播地址&#xff1a; 多播地址向以太网MAC地址的映射 UDP多播工作过程&#xff1a; 多播地址结构体&#xff1a; 多播套接口选项&#xff1a; 知识点2【TCP面向链接编程】 1、创建tcp套接字 2、做为客户端需要具备的条件 3、connect链接服务器的函数…

地图下载白嫖神器!你该怎么用好它

今天介绍一下做数据可视化网站比较好的两个平台。一个是阿里云的Datav&#xff0c;另一个是易智微easyv. 一、DataV.GeoAtlas 前段时间 我们就给大家分享过阿里云的DataV.GeoAtlas地理小工具系列。我们可以通过这个平台下载高德比较新的地图数据&#xff0c;数据的时效性是有较…

如何查看SAP版本及HANA版本?

目录 一、查SAP NetWeaver版本 二、查看S/4 HANA版本 在SAP运维及系统集成时&#xff0c;经常外面公司问及本公司的SAP版本及HANA版本。其实是每一个登录SAP的用户都可以查到的。方法如下&#xff1a; 一、查SAP NetWeaver版本 SAP界面上选择菜单&#xff1a;系统-状态&am…

哈夫曼树与哈夫曼编码

哈夫曼树&#xff1a;结点中赋予一个某种意义的值&#xff0c;称为结点的权值&#xff0c;从根结点开始&#xff0c;到目标结点经过的边数&#xff0c;称为路径长度&#xff0c;路径长度乘以权值&#xff0c;称为带权路径长度&#xff1b; 例如&#xff1a;根结点代表着快递集…

上位机工业协议-S7COMM

1、S7协议主要针对西门子相关设备通信。先了解基本通信对象、通信环境、通信报文&#xff0c;再处理S7COMM通信库的封装与测试。 2、西门子设备通信 - PLC&#xff1a;系列 LOGO、200、200Smart、300、400、1200、1500 - PLC&#xff1a;LOGO、200、200Smart、300、400、1…

Elastic Stack容器化部署拓展(Https、AD域集成)并收集Cisco设备的日志信息

前言&#xff1a; 还记得在去年的笔记中提到过EFK&#xff08;Elasticsearch-Filebeat-Kibana&#xff09;的部署&#xff0c;但是其中的内容相对简单&#xff0c;也没有提到一些额外的Elastic Stack的特性。链接如下&#xff1a;https://blog.csdn.net/tushanpeipei/article/…

JSTL使用

目录 简介&#xff1a; 组成 使用&#xff1a; code核心库使用 ​编辑 fmt格式化 ​编辑 简介&#xff1a; 全称:JSP Standard Tag Library 中文名:JSP标准标签库 作用:用于扩展JSP中的标签&#xff0c;能够为JSP页面提供流程控制、类型转换等功能的标签。替换JSP中代码…

【Spring Cloud实战】Ribbon负载均衡

gitee地址&#xff1a;https://gitee.com/javaxiaobear/spring-cloud_study.git 在线阅读地址&#xff1a;https://javaxiaobear.gitee.io/ 1、概述 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。 简单的说&#xff0c;Ribbon是Netflix发布的开源项…

jenkins持续集成 自动化部署

一、环境准备 1.1 Java环境 &#xff08;1&#xff09;安装jdk1.8 yum -y install java-1.8.0-openjdk* &#xff08;2&#xff09;执行以下命令查看是否安装成功 java -version 1.2 安装maven &#xff08;1&#xff09;将安装包上传到Linux服务器&#xff0c;解压缩 tar -…

对笔记本电池的研究

文章目录设计容量&完全充电容量笔记本电池报告显示电池设计与系统电池的全部充电容量之间的差异解释电池损耗正确做法查看笔记本的电池使用报告方法第一步&#xff1a;WinR键输入cmd&#xff0c;打开命令提示符窗口第二步&#xff1a;输入powercfg /batteryreport&#xff…

代码规范-对抗软件复杂度

1、为什么需要代码规范 任何系统性的项目都需要架构设计&#xff0c;而架构设计的核心命题是控制复杂度。 但随着项目的不断迭代&#xff0c;复杂度就会不断上升&#xff0c;研发效率就会不断下降。 而代码规范正是对抗软件复杂度的有效手段&#xff0c;通过约定俗成的规则…

[附源码]计算机毕业设计JAVA户籍管理系统

[附源码]计算机毕业设计JAVA户籍管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

docker安装redis详细教程

1、下载最新redis镜像 docker pull redis //表示拉取最新的镜像 如果要指定版本 docker pull redis:latest//表示拉取最新的镜像 2、创建redis映射目录 mkdir /redisData/redis/conf 配置文件挂载在我指定的redisData/redis/conf/ 文件夹中&#xff0c;方便后续的修改 创建re…

Linux上单机部署RocketMq

Linux上单机部署RocketMq1、安装jdk2、下载rocketmq并解压3、创建日志文件夹4、启动namesrv5、启动broker6、查看和关闭7、rocketmq控制台7.1、控制台idea启动7.2、控制台jar包启动1、安装jdk rocketmq的运行是建立在jdk之上的&#xff0c;所以&#xff0c;我们要搭建rocketmq服…

uView u-slider 自定义滑块

有个需求UI设计的滑动选择器中的滑块如下所示&#xff1a; 项目中集成的是vView2.0组件库&#xff0c;u-slider组件中有 blockStyle 属性&#xff0c;看着是用来设置自定义滑块的。但是试了下&#xff0c;没有效果&#xff0c;不知怎么回事。看了一下uView1.0组件库 u-slider组…

大学生想做兼职应该怎么找,适合大学生的线上线下靠谱兼职推荐

大学生现在有很多兼职工作可以在网上和实体上做。他们可以根据个人能力和喜好进行选择。以下是一些低门槛的在线和离线兼职工作&#xff0c;希望能帮助到你。 线下兼职 1.勤工助学岗位 学校&#xff1a;通过学校提供的勤工俭学岗位&#xff0c;如办公室助理、图书馆助理等&am…

Java 线上机器 CPU 100% 的一次排查过程

文章目录1. 问题发生2. 数据库连接关闭问题排查3. 问题的进一步排查4. 解决方法1. 问题发生 日常敲代码突然收到生产环境异常告警&#xff0c;线上有一台机器 CPU 使用率飙升到 100 触发扩容&#xff0c;工作群里一下子鸡飞狗跳。 出现问题&#xff0c;首先当然是查看监控和日…

如何画架构图?

平时做过一些系统设计&#xff0c;也写过一些系统分析文章&#xff0c;从组件、关系、交互等方面提供一些建议&#xff0c;并用我之前写文章画的一些图举些例子。构成系统的组件通过形状、颜色、名称来逼近其概念。LevelDB 主要构件如上面 LevelDB 的架构图&#xff0c;包含的主…