大家好、团队、
为了支持应用内编程、我们使用的是一个标志(32位)、我们将其写入闪存中的最后一个位置。 在应用程序运行时、闪存编程请求会将此标志更新为唯一值、然后我们切换到引导加载程序。 因为闪存支持 块擦除和 块写入。 我们需要保持一个16k 的缓冲区、以备份最后一个块并仅覆盖标志存储器。 为此、我们可以占用堆栈。 但我们可以避免这种情况吗? 除了使用 EEPROM 之外、还有其他替代方法吗?
谢谢
Abhijit
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、团队、
为了支持应用内编程、我们使用的是一个标志(32位)、我们将其写入闪存中的最后一个位置。 在应用程序运行时、闪存编程请求会将此标志更新为唯一值、然后我们切换到引导加载程序。 因为闪存支持 块擦除和 块写入。 我们需要保持一个16k 的缓冲区、以备份最后一个块并仅覆盖标志存储器。 为此、我们可以占用堆栈。 但我们可以避免这种情况吗? 除了使用 EEPROM 之外、还有其他替代方法吗?
谢谢
Abhijit
Abhijit、您好!
标志的目的是否是确保当时存在有效的图像? 是否会对这方面的新申请工作进行 CRC 检查?
您设置此设置的方式似乎是提前使用值更新标志、然后将引导加载后的标志值与新的标志值进行比较。 是这样吗?
也许此功能可以为您提供所需的内容、或者为您放置标志提供另一个想法:
CHECK_CRC
在引导加载程序中启用运行时 CRC 校验。 如果未 定义此标签、则如果 映像的初始堆栈指针和复位矢量在闪存中看起来有效、引导加载程序将控制权转移到主应用程序映像。 不 执行其他检查。 但是,如果定义了此标签, 则会对照 存储在图像矢量 表顶部的标头中的值来检查固件映像的 CRC32值,并且仅在计算出的 CRC 与标头中的值匹配时才启动固件。 如果标头缺失 或计算出的 CRC 与预期值不匹 配、引导加载程序将保留控制权并等待下载新的固件映像。 作为一个特殊情况来帮助调试、 如果找到标头并且 长度字段设置为0xFFFFFFFF、则无论 CRC32字段的值如何、都会引导映像。 也可以通过定义 FORCEnforce_CRC 来禁用此调试行为。 要使用 CHECK_CRC 选项、必须 在中断 矢量表顶部附加一个8字标头来构建固件映像。 此标头必须按 如下方式填充前4个字:
报头中剩余的4个字为未来 扩展保留、应设置为0xFFFFFFF。 添加此标头时,应在项目矢量 表中所有必需条目的上方保留8个附加字(通常在启动 C 或汇编器文件中,具体取决于 所使用的工具链) 并将前 两个初始化为所需的标记字、将余数初始化为 值0xFFFFFFFF。 通过 将固件二进制文件作为输入传递到 TivaWare 版本工具目录中的 binpack.exe 工具、可以插入长度和 CRC32值。
我认为阅读您的要求是、上述过程应该是保护固件映像的合适方法。
关于维护最后一个块的缓冲区、闪存引导加载程序实际上会从 RAM 中执行、因此我想使用 RAM 是执行您描述的操作的最简单方法、除非您认为程序空间太小而无法正常工作。 但是、我不确定您打算如何实际获取所有闪存数据? 手动读取和存储每个字节是否只是一个自定义函数? 我认为上述 CRC 方法更易于使用并提供相同级别的安全性。