亲爱的恩智浦支持/恩智浦专家,
我正在为 S32K341 处理器开发引导加载程序。
我从一个示例 (Mem_InFls_Example_S32K344) 开始。
首先,我修改了 memap 文件,以便将 pflash 工作所涉及的所有功能都放在 RAM 中,而且成功了,但我想使用原始生成的文件(c40 文件除外,根据我的理解,有必要更改该文件的 pragma 声明)。
因此,我启用了 "任务启动时记忆加载访问代码 "功能
il_ciancio_0-1753171185572.png
擦除和写入地址位于内存区的末端
1) 是这样吗?还是我必须把这些指针放在其他区域?
下面是地图文件中的公羊代码部分:
il_ciancio_1-1753171422314.png
2) 我是否遗漏了某些功能?
问题是一个硬故障处理程序,它从
基本上靠近"跳转" 到闪存驱动器。
il_ciancio_3-1753171549471.png
3) 有什么想法吗?
我有点被困住了。
非常感谢、
Ciancio
你好,@il_ciancio、
很高兴听到它有所帮助
出现这个问题可能是因为内核将数据写入了 SRAM,而 SRAM 会受到数据缓存的影响,如果内核读取数据,就不会出现问题。然而,当内核试图从同一内存区域执行代码时,它需要依赖指令缓存。 如果指令缓存未正确失效或更新,则内核最终可能会获取未初始化的指令——在 LSB 处执行 0x00 字节而不是使用 0x1 的实际代码。
此致,
丹尼尔
关于拇指地址,我有点困惑,因为宏MEM_43_INFLS_AC_CALL 是用 ARM_FAR_CALL2THUMB_CODE_BIT0_U32 编译的,所以跳转本身应该有效。也许闪存驱动程序内部存在这个问题?
顺便说一下,正如我所写的,启用缓存后,代码就能正常工作了。
如果您对MEM_43_INFLS_AC_CALL有其他意见,我将等待您的回复,然后关闭该邮件。
非常感谢,再次感谢您的出色工作!
Ciancio
1. 转到项目属性,删除此符号。
danielmartynek_0-1753192518255.png
2。这个 INVSTATE 故障是由分支到非缩略地址引起的-缩略图地址的最低有效位设置为 1。这有可能是缓存造成的--核心会分支到缓存中的任何内容。
此致,
丹尼尔
我会尝试两种方法,只是有些问题:
非常感谢,干得漂亮!
Ciancio
这也可能是高速缓存(由 MPU 管理)造成的。
可以在启动代码中禁用 MPU,这样就可以轻松进行测试。
不过,你可以启用下面的选项来清理缓存。
danielmartynek_0-1753191322052.png
这与此有关:
il_ciancio_0-1753189857242.png
il_ciancio_1-1753189870001.png.
查找存储在内存中的数据,从硬盘故障开始(Mem_43_INFLS_IPW_Erase 中的 MEM_43_INFLS_AC_CALL):
IR 指令:
0x40dc05
非常感谢。
你好,@il_ciancio、
在故障处理程序中,读取可配置故障状态寄存器 (CFSR) 以确定故障原因。
有关详细信息,请参阅 ARM 官方文档:
https://developer.arm.com/documentation/dui0646/c/Cortex-M7-Peripherals/System-control-block/Configu...
如果将故障确定为 MemManage 故障,则检查地址为 0x20407E00 的内存区域的内存保护单元 (MPU) 配置。
感谢您的回复。
这就是我的配置,通过调试器,我可以在 RAM 区域看到访问代码已加载。应用程序不使用擦除/写入指针。
il_ciancio_0-1753187073096.png
我能检查什么?
谢谢!
你好,@il_ciancio、
我刚刚用默认的 Mem_InFls_Example_S32K344 示例进行了测试。
我把扇区改为 BLOCK_0 扇区。
#define EXAMPLE_SECTOR_START_ADDR (0x004F0000U)
danielmartynek_0-1753177378036.png
我发现这些 SRAM 位置未被应用程序使用,因此就使用了它们:
danielmartynek_1-1753177385883.png
代码被复制到这里:
danielmartynek_2-1753177391938.png
该示例如预期般正常工作。
你能在你那边测试一下吗?
谢谢、
此致,
丹尼尔