Skip to main content

解决IAR固件非4字节对齐问题

嵌入式开发中, 使用 IAR 编译的固件不像 keil 一样, 不会自动补齐 4字节 , 为避免有些协议对字节数敏感, 因此需要我们使用 4字节对齐的bin文件, 因此我们介绍一下bin文件4字节对齐的方法

bin文件4字节对齐

如下三个文档因为是demo测试, 因此放到一个根路径下

  • Byte.bin - 用于补充的单字节文件

    • 其中内容建议使用 非FF 非00 的任意字符, 因为某些场景可能会导致问题
    • 实现方法: 使用软件HxD, 下载链接如下
  • 准备一个任意2字节的测试文件, 生成方式如上所述, 命名为 source.bin

  • 生成新文件后, 输出的文件为 test.bin, 也是最终的目标文件

  • 创建 four_byte_alignment.bat 文件为四字节对齐文档

    •   @echo off
      setlocal enabledelayedexpansion

      @REM 配置源文件, 测试文件, 填充文件路径
      @REM 注意根据实际工程不同, 存在嵌套时, 使用相对路径修改
      set "bin_file=source.bin"
      set "output_file=test.bin"
      set "byte=Byte.bin"

      @REM 获取文件大小
      for %%F in ("%bin_file%") do set "file_size=%%~zF"

      @REM 计算余数
      set /a "remainder=file_size %% 4"

      @REM 如果已经对齐到4字节边界
      if %remainder% equ 0 (
      echo File is already aligned to 4 bytes.
      goto next
      )

      @REM 计算需要填充的字节数
      set /a "padding=4 - remainder"

      @REM 根据需要填充的字节数进行填充
      if %padding% equ 1 (
      copy /b "%bin_file%"+"%byte%" "%output_file%"
      ) else if %padding% equ 2 (
      copy /b "%bin_file%"+"%byte%"+"%byte%" "%output_file%"
      ) else if %padding% equ 3 (
      copy /b "%bin_file%"+"%byte%"+"%byte%"+"%byte%" "%output_file%"
      )

      :next
      echo Alignment complete. Output file: %output_file%

      pause exit
    • setlocal enabledelayedexpansion: 启用延迟变量扩展,以便在循环中正确处理变量。

    • for %%F in ("%bin_file%") do set "file_size=%%~zF": 获取源二进制文件的大小,并存储在file_size变量中。

    • set /a "remainder=file_size %% 4": 计算文件大小除以4的余数,并存储在remainder变量中。

    • if %remainder% equ 0 (...): 如果余数为0,说明文件已经对齐到4字节边界,输出提示信息并跳转到next标签。

    • set /a "padding=4 - remainder": 计算需要填充的字节数,并存储在padding变量中。

    • if %padding% equ 1 (...): 如果需要填充1个字节,使用copy /b命令将源文件和填充字节文件合并,并生成输出文件。

    • else if %padding% equ 2 (...): 如果需要填充2个字节,使用copy /b命令将源文件和两个填充字节文件合并,并生成输出文件。

    • else if %padding% equ 3 (...): 如果需要填充3个字节,使用copy /b命令将源文件和三个填充字节文件合并,并生成输出文件。

测试固件

双击运行对齐脚本, 创建新的输出文件 test.bin , 源文件保持