如何使用 avrdude 通过 10 针 ISP 连接器获取程序的版本号?

How to get program's version number through 10-pin ISP-connector with avrdude?

我正在制作印刷电路板,在电路板内有一个连接到 AVR 微控制器的 10 针 ISP 连接器。这样我就可以将新代码写入 AVR。

我有几个相同的板,但其中的代码不同。我不想每次需要知道那个特定的 AVR 里面有什么时都闪现它。我只是想通过 avrdude 以某种方式提取该代码的版本号。
最简单的方法是什么?

感谢 Juraj 的建议。
用这样的东西写入 eeprom 完成工作。

write_version:
avrdude -U eeprom:w:0x76,0x31,0x2e,0x31,0x32,0x33:m

read_version:
avrdude -U eeprom:r:-

如果您可以通过连接器读取 flash 的内容,则可以编译您的构建过程并 link 以包含版本号或其他一些版本信息的明确定义的格式生成 flash 内容.

然后您可以使用 avrdude 读取并编写您自己的程序来解析(部分)flash 的内容,然后可能编写脚本。这有助于避免出现以下情况:您的 EEPROM 包含一个版本,但闪存已经包含一个新版本,反之亦然。

您获得奖励积分

  • 无需阅读大量 flash 即可快速找到位置
  • 使用 CRC 或类似的校验和防止意外字节看起来与您的版本信息相同
  • 存储比 "1.2.3|main|dirty"
  • 更详细的信息

您需要扩展现有的构建系统来完成所有必要的步骤。这些可能涉及 linker 脚本、linker 部分、C 或汇编语言源代码以及其他内容。

使用基于 avr-libc 和 avr-gcc 的工具链继续我的 AVR 体验,我将首先添加类似

的内容
        jmp     skip_version_number

        .global version_number
        .type   version_number, @object
        .balign 8
version_number:
        .quad   0xdeadcafef00d0001
        .asciz  VERSION_STRING
        .asciz  GIT_BRANCH_NAME
        .asciz  GIT_DIRTY_FLAG
        .asciz  ""
        .size   version_number, . - version_number

skip_version_number:

.initN 部分之一:

  • .initN 部分 link 相对靠近图像的前面,因此无需阅读大量 flash

  • 它包含一个对齐到8字节边界的64位魔法数字,所以版本结构应该很容易找到。

  • 当我最终想通过添加例如更改格式时,可以轻松更改神奇数字以允许不同格式的不同数字。尚未包含的校验和。

  • 解析以 NUL 结尾的 C 字符串列表直到出现空字符串应该相对容易编写并且仍然灵活。

然后验证反汇编转储和映射文件的结果。

添加校验和可能涉及在构建时为有效负载生成二进制文件,然后将该文件的校验和计算为单独的二进制文件,并将上述内容定义替换为

        .balign 8
version_number:
        .incbin "version_number.bin"
        .balign 8
        .incbin "version_number_checksum.bin"
        .size   version_number, . - version_number

这可以任意复杂,但我希望这能提供一些想法。