合并BIN文件的两种方法

简介: 在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一个文件,方便烧写和生产。下面结合STM32的IAP Bootloader Code和Application Code的合并,介绍两种合并BIN文件的方法。

     在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一个文件,方便烧写和生产。下面结合STM32的IAP Bootloader Code和Application Code的合并,介绍两种合并BIN文件的方法。

     首先简单介绍一下STM32的IAP。IAP(In-application-programming),即在应用中编程。有了它,产品发布之后,仍然可以方便的升级固件,而不需要拆机并用JTAG等方式更新程序。IAP系统的固件一般有两部分组成,IAP BootLoader Code和Application Code,如下图所示。

     image

     系统启动时,首先运行IAP BootLoader Code,并检测相应状态,判断是执行升级的流程还是直接运行本地的Application Code。 一般来说,BootLoader和Application是分别编译的,会生成两个二进制文件。在工厂生产时,如果分别烧写这两个文件,显然有些麻烦。这时,我们就可以将两个BIN文件合并成一个,直接烧写。假设Application Code的偏移地址为0x1000,IAP固件在Flash中的分布如下图所示。

     image

     下面介绍第一种方法,使用二进制文件合并工具(UBIN.exe),这个小工具是以前在S3C2410上开发uCOS时做的,功能比较简单,满足一般的需求。

     首先,添加第一个文件1.bin,其地址为0x0000,所以,偏移量设置为0x00000000,设置完偏移量后点击“添加”按钮。

     image

     然后添加第二个文件,偏移量根据需要设置为0x00001000,如下图所示。

     image 

     设置目标文件为C:\dst.bin,然后点击“合并”按钮。

     image

     正常情况下,会成功生成目标文件,并有如下图所示的提示信息。

     image 

     这种方法相对比较灵活,对合并文件的个数和偏移地址没有限制。缺点是不支持配置文件,不能保存所设的配置,所以,每次合并都得手动做很多重复工作。在调试阶段会比较浪费时间。

     下面介绍一种通过命令行工具合并两个文件的方法。该方法需要用到fsutil.exe、cat.exe和hbin.exe。写一个批处理文件,分别调用这三个工具,最终将1.bin和2.bin合并成dest.bin。批处理文件的内容如下:

del dest.bin
fsutil  file createnew dest.bin
4096 
cat
2.bin >>dest.bin
hbin
1.bin dest.bin

      批处理文件各行的简单说明,

  •      del dest.bin,删除原来的目标文件
  •      fsutil  file createnew dest.bin 4096,创建一个大小为4096字节的空白文件dest.bin,该值的大小由偏移地址0x1000决定
  •      cat 2.bin >>dest.bin,将2.bin追加到空白文件dest.bin之后
  •      hbin 1.bin dest.bin,将1.bin放到dest.bin的头上,填充dest.bin头上4KB的空白

     dest.bin就是我们最终需要的合并完成的文件。将它与第一种方法合并的文件dst.bin对比一下,如下。

     image

     可以看到两种方法合并出的文件,完全一样。

     第二种方法的好处在于,可以在集成开发环境中设置编译选项,在编译完成之后自动执行该批处理,这样,编译完成后即得到能够直接固化到Flash中的二进制文件,节省了一些时间。


目录
相关文章
|
1月前
|
PyTorch TensorFlow API
大模型中 .safetensors 文件、.ckpt文件、.gguf和.pth以及.bin文件区别、加载和保存以及转换方式
本文讨论了大模型中不同文件格式如`.safetensors`、`.ckpt`、`.gguf`、`.pth`和`.bin`的区别、用途以及如何在TensorFlow、PyTorch和ONNX等框架之间进行加载、保存和转换。
282 2
|
2月前
|
Shell
9-1| cp: 无法获取"884/*" 的文件状态(stat): 没有那个文件或目录 这是什么意思
9-1| cp: 无法获取"884/*" 的文件状态(stat): 没有那个文件或目录 这是什么意思
cp mv rm命令,cp 第一个是复制的文件夹,第二个表示复制去的地方,如果复制文件夹需带-r,mv test.txt Desktop/移动文件,mv test2.txt test3.txt不存
cp mv rm命令,cp 第一个是复制的文件夹,第二个表示复制去的地方,如果复制文件夹需带-r,mv test.txt Desktop/移动文件,mv test2.txt test3.txt不存
rm用于文件和文件夹的删除,rm里可以接收参数1,-r表示可以删除目录,-f表示强制删除,通配符*匹配任意内容,test*以test开头,*test以test结尾,*test*匹配任何包含test内容
rm用于文件和文件夹的删除,rm里可以接收参数1,-r表示可以删除目录,-f表示强制删除,通配符*匹配任意内容,test*以test开头,*test以test结尾,*test*匹配任何包含test内容
|
6月前
|
弹性计算 运维 Shell
批量将txt 文件修改为doc 文件
【4月更文挑战第29天】
53 1
|
Shell 开发工具
写一个脚本/root/bin/sumspace.sh,传递两个文件 路径作为参数给脚本,计算这两个文件中所有空白行之和
写一个脚本/root/bin/sumspace.sh,传递两个文件 路径作为参数给脚本,计算这两个文件中所有空白行之和
74 1
|
Shell 开发工具
写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
139 1
|
Linux 数据安全/隐私保护 知识图谱
6.2.2 复制、删除与移动: cp, rm, mv
6.2.2 复制、删除与移动: cp, rm, mv
123 0
|
SQL Shell Perl
[20180413]bash 位置参数.txt
[20180413]bash 位置参数.txt --//上午在测试hugepage时,链接http://blog.itpub.net/267265/viewspace-2152888/ --//脚本写的太不灵活,不应该每次测试修改脚本,应该采用传位置参数.
949 0