当前位置: 首页 > news >正文

Windows bat脚本学习九(srec_cat)

一、简介

        srec_cat是一个在嵌入式开发中,使用非常频繁的软件,这里做个常用功能的介绍。

二、常用参数

        文件类型

        在使用srec_cat指令时,在输入文件和输出文件时,要指明文件的类型,如:

input.hex -intel    ::因特尔的十六进制文件
output.bin -binary    ::二进制文件

        -o 文件名 文件类型(输出)

        见如下代码:

srec_cat 输入文件 文件类型 -o 输出文件 文件类型

        实例:合并两个hex文件

        在平时开发中,使用频率很高的一个功能就是合并两个hex,即bootapp。那这里准备3个文件boot.hex、app.hex、boot_app.hex。boot_app.hex是提前通过jflash合并的

        执行下面的代码:

@echo off
chcp 65001
setlocal enabledelayedexpansion:: 合并两个hex文件
srec_cat boot_jf.hex -intel app_jf.hex -intel -o merge.hex -intelecho 转化结束	pause	endlocal	

        得到merge.hex文件,我们对比merge.hex和boot_app.hex文件。

        可以看到,除了第一行,其他全都一样。第一行是因为jflash转化的机制问题,不用管

        -offset 地址(设置偏移地址)

        在对二进制文件操作的时候,经常会用到这个参数

srec_cat 输入文件 文件类型 -offset 偏移地址 -o 输出文件 文件类型

        实例:bin文件转hex文件

        之前介绍过hex转bin文件的方法,这里再介绍一下把bin转hex的方法。hex2bin不会的可以看这篇文章:hex文件转bin文件-CSDN博客

         这里,准备2个文件,boot.hex和boot.bin。boot.bin是通过jflash转化来的。

        执行如下代码:

@echo off
chcp 65001
setlocal enabledelayedexpansionsrec_cat boot_jf.bin -binary -offset 0x000 -o boot_srec.hex -intelecho 转化结束	pause	endlocal

        对比boot_srec.hex和boot.hex文件。

        发现有好多不一样,为什么会这样?

        直接看一下hex的内容。

        原来是因为源文件每行是16个字节,srec转化出来的显示32个字节

        实例:hex文件转bin文件

        scre_cat同样也是可以把hex转换为bin文件的。

@echo off
chcp 65001
setlocal enabledelayedexpansion:: hex转Bin
srec_cat boot_jf.hex -intel -o boot_srec.bin -binaryecho 转化结束	pause	endlocal	

        对比boot_srec.bin和boot_jf.bin

 

        只是空白区域填充不一样而已

        -Output_Block_Size=长度(限制输出文件每行记录的字节长度)

srec_cat 输入文件 文件类型 -offset 偏移地址 -o 输出文件 文件类型 -Output_Block_Size=限制长度

        实例:bin文件转hex文件。

        还是准备boot.bin和boot.hex两个文件。

        调用如下指令:

@echo off
chcp 65001
setlocal enabledelayedexpansion:: bin转hex,限制每行记录16个字节
srec_cat boot_jf.bin -binary -offset 0x000 -o boot_srec.hex -intel -Output_Block_Size=16echo 转化结束	pause	endlocal	

         再对比boot_srec.hex和boot,hex文件。

        这次前面已经完全一样了,但是后面还是不一样。

        直接打开内容。

        可以看到,boot.hex文件,从0x193c-0x1e40中间是没有任何数据的。而boot_srec.hex是将这些空白内容全部填充为0xff。

        实例:起始地址非零的bin文件转hex文件。

        很多时候,bin文件的起始地址非零,比如app.bin。此时如果要把其转化为hex,就必需要设置偏移地址,否则转出来的hex将是错误的。

        这里准备2个文件,app.bin和app,hex。app.bin是通过jflash转出来的。

        执行如下代码:

@echo off
chcp 65001
setlocal enabledelayedexpansion:: bin转hex,限制每行记录16个字节
srec_cat app_jf.bin -binary -offset 0x000 -o app_srec.hex -intel -Output_Block_Size=16echo 转化结束	pause	endlocal	

        对比app_srec.hex和app.hex。

        很多地方不一样。直接看hex内容。

        可以看到,app_srec.hex的偏移地址是0,而app.hex的偏移地址为0x2000

        修改代码:

@echo off
chcp 65001
setlocal enabledelayedexpansion:: bin转hex,偏移地址为0x2000,限制每行记录16个字节
srec_cat app_jf.bin -binary -offset 0x2000 -o app_srec.hex -intel -Output_Block_Size=16echo 转化结束	pause	endlocal	

        再次对比两个文件。

        一样了。

        -fill 填充数据 填充起始地址 填充结束地址

        在合并Bin文件的时候,会用到该参数

srec_cat 输入文件 文件类型 -fill 填充内容 填充起始地址 填充结束地址 输入文件 文件类型 -o 输出文件 文件类型

        实例:合并两个bin文件,并填充内容。

        准备三个文件,boot.bin、app.bin、boot_app.bin。boot_app.bin是通过jflash转化来的。

        执行如下代码:

@echo off
chcp 65001
setlocal enabledelayedexpansion:: 合并两个bin文件,不填充
srec_cat boot_jf.bin -binary app_jf.bin -binary -offset 0x2000 -o merge.bin -binaryecho 转化结束	pause	endlocal	

        对比merge.bin和boot_app.bin

        可以看到,这里有一段不一样。merge.bin的数字是0,而boot_app.bin是0xff。

        看一下boot.bin文件

        数据到0x1e43就已经结束了,所以0x1e43-0x2000是无数据的。srec_cat就默认填充了0.

        使用-fill参数,将空白内容填充为0xff。运行如下代码:

@echo off
chcp 65001
setlocal enabledelayedexpansion:: 合并两个bin文件,填充0xff
srec_cat boot_jf.bin -binary -fill 0xff 0x00000000 0x00002000 app_jf.bin -binary -offset 0x2000 -o merge.bin -binaryecho 转化结束	pause	endlocal	

        再对比merge.bin和boot_app.bin。

        完全一样了。

        -CRC16_Little_Endian 地址(计算文件CRC16并以小端输出)

        在进行OTA的时候,需要提供一个校验值来保证数据传输完成后的正确性。此时CRC就是一个很常用的方式。

srec_cat 输出文件 文件类型 -CRC16_Little_Endian 地址 -o boot_crc.bin -binary

        实例:计算bin文件的CRC,并记录

@echo off
chcp 65001
setlocal enabledelayedexpansion:: 计算crc
srec_cat boot_jf.bin -binary -CRC16_Little_Endian 0x00001e50 -o boot_crc.bin -binaryecho 转化结束	pause	endlocal	

        查看boot_crc.bin文件。

        在0x1e50的位置,已经有了计算的CRC。

        注:如果要计算CRC32,可以把参数修改为 -CRC16_Little_Endian

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • openGauss 之索引回表
  • 【Netty】netty中都是用了哪些设计模式
  • 端口安全老化细节
  • 软件测试之UI自动化测试
  • 被审稿人批得体无完肤?参考文献这样引用就对了!
  • 抠像拍照技术在展厅设计中的应用,实现了哪些新颖的互动体验?
  • uniapp vite3 require导入commonJS 的js文件方法
  • mysql可重复读不能解决幻读吗?
  • 安宝特科技 | AR眼镜在安保与安防领域的创新应用及前景
  • 实时地图+瞬移,黑神话地图工具来了
  • LLM模型:代码讲解Transformer运行原理
  • 快速排序的深入优化探讨
  • RedisCache存入redis的数据key为何name和id的分隔符是两个冒号::
  • 2024年高教社杯全国大学生数学建模竞赛A题思路(2024数学建模国赛A题思路)
  • 【Effective Java】多构造器参数使用构建器 (快速上手)
  • Android Studio:GIT提交项目到远程仓库
  • Angular2开发踩坑系列-生产环境编译
  • CentOS7简单部署NFS
  • HTML中设置input等文本框为不可操作
  • JavaScript类型识别
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Python爬虫--- 1.3 BS4库的解析器
  • SegmentFault 2015 Top Rank
  • Unix命令
  • 从零开始的无人驾驶 1
  • 订阅Forge Viewer所有的事件
  • 分布式任务队列Celery
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • Android开发者必备:推荐一款助力开发的开源APP
  • # 计算机视觉入门
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #if 1...#endif
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (1)Android开发优化---------UI优化
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (pycharm)安装python库函数Matplotlib步骤
  • (六)激光线扫描-三维重建
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net 流——流的类型体系简单介绍
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NetCore发布到IIS
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET技术成长路线架构图
  • /tmp目录下出现system-private文件夹解决方法
  • @RequestBody与@ResponseBody的使用
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [ACM] hdu 1201 18岁生日
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息