gpt4 book ai didi

c - 如何检查整个程序是否在ARM上烧录?

转载 作者:行者123 更新时间:2023-11-30 14:53:01 29 4
gpt4 key购买 nike

我正在使用arm-none-eabi-gcc 5.3 为STM32L4 生成二进制文件。我正在使用引导加载程序来刷新程序。问题是我无法确定是否正在刷新整个文件。我没有任何可用的 CRC。 Flash 在 0x800000000x80040000(用于引导加载程序和主程序的 2 个存储体)启动。目前我假设如果0x80040004在0x800400000x80080000之间,程序就会被刷新。但如何检查程序是否有效呢?我找不到应该写入闪存的二进制文件的大小,因此我可以检查最后几个整数。

这是 BIN 的前几个字节(抱歉,无法发布整个文件): enter image description here最后一个未编程的字节是 0x80051C00(程序有 72704 字节)。

最佳答案

最可能的错误是传输过程中数据连接丢失,导致图像仅部分写入。尽管您的传输协议(protocol)应包括某种数据完整性检查,但接收数据后出现编程错误的可能性可能可以忽略不计。为此,您可以简单地验证十六进制文件记录的校验和或使用具有 CRC 错误检查的协议(protocol),例如 XMODEM-CRC 或 XMODEM-1K。

确保您不会尝试启动部分加载的应用程序镜像很简单。没有必要按照地址顺序甚至数据到达的顺序对闪存进行编程。鉴于此,当接收到 0x80040004 处的复位 vector 数据时,您可以将其保留在 RAM 中并进行编程最后。这样,如果编程未完成,复位 vector 值将始终为 0xFFFFFFFF:

伪代码:

WHILE receiving data

IF program_address in range
// Write all data except address at reset vector
IF program_address == 0x80040004
start_address = program_data
ELSE
write( program_address, program_data )
ENDIF
ENDIF
ENDWHILE

// Write reset vector *LAST*
write( 0x80040004, start_address )

然后在启动代码中:

IF @0x80040004 == 0xFFFFFFFFFF
NO APPLICATION - DO SOMETHING!
ELSE
START APPLICATION
ENDIF

关于c - 如何检查整个程序是否在ARM上烧录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47451819/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com