器件型号: TMS570LC4357-TMS570LC4357 EP
我在开发引导加载程序时遇到了一些错误。 将所有数据写入闪存后、运行 CRC32。 但似乎第一个块(16 个 32 位值)不会更新、除非我先运行 CRC32、但这太晚了、会导致错误的 CRC。 如果我插入 CRC32 两次、第一个调用将获取闪存地址更新、并从第二个调用获得正确的 CRC 值。 如果我跳转到应用程序、则应用程序运行良好、以便我知道它被正确写入闪存。 我尝试运行一个循环(如下所示)、但这也起作用。
我还注意到 f021 闪存 API 中的第 4.4.9 节、并调用了 Fapi_flushPipeline ()、这一点没有任何影响。 我还观察到、在那里尝试 2 次虚拟读取(除了我修改过的闪存地址之外)128 个字节的注释 — 也没有解决任何问题。
我还确认在不使用调试器的情况下运行代码会导致完全相同的行为。 因此、运行 CRC32 两次或运行虚拟读取循环似乎可以正常工作、但这只是覆盖了这个问题。
有什么建议吗? 这是已知的吗? 这是 ECC、闪存还是缓存问题?
下面显示了它在运行 CRC32/循环之前和之后的外观屏幕截图。
之前:

之后: 
// This code inserted before the crc32 did seem to resolve the issue too volatile uint64_t warmup = 0ULL; // ECC warmup variablefor(uint32_t addr = VALID_APP_FLASH_BASE; addr < VALID_APP_FLASH_BASE + APP_FLASH_SIZE_WORDS; addr += 8){ warmup = *(volatile uint64_t*)addr;}

