如何使用 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
这可以任意复杂,但我希望这能提供一些想法。
我正在制作印刷电路板,在电路板内有一个连接到 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
这可以任意复杂,但我希望这能提供一些想法。