我有一个Zynq7020芯片与250MB的DDR内存连接到它放在ECC模式(所以125MB有效)。它连接到NAND闪存,并具有一系列引导加载程序,这些引导加载程序最终加载VxWorks以运行某些程序。
我们即将进行一项测试,要求我在执行后读取设备上的所有内存、闪存和FPGA配置内存。
我还有另一个小程序,我将在运行后通过JTAG安装,并让它写出RAM的其余部分,然后是所有闪存和FPGA配置内存。该程序由Xilinx SDK编译,并且是裸机(无操作系统/引导加载程序)。
当我加载这个程序时,我重置了处理器(JTAG命令),运行一个ps7_init.tcl脚本,该脚本将所有CPU寄存器设置为Vivado设置的良好配置,将elf文件加载到设备上,然后运行处理器。然后,这个程序尝试从地址0x0开始读取内存,但它很快就崩溃了。我告诉它从1 MB (1<<20)的地址开始(因为我知道开头有一些奇怪的内存映射东西,所以我试了一下以防万一),然后它读取了更多的内容,然后再次崩溃。
崩溃似乎是因为CPU不允许我读取RAM的这些区域。
为什么不行?我怎么做才能读取内存125 MB中的每一个字节?
发布于 2019-11-21 03:02:43
Xilinx提供了一个模板项目,它与您正在尝试做的事情非常接近。它是“内存测试”模板,它遍历附加的内存范围并测试读/写操作。默认情况下,它测试DDR内存范围和ps7_ram_1。应用程序的链接器脚本将程序放在ps7_ram_0中,而不测试该范围,因为您不能覆盖应用程序的指令和数据内存。
模板的代码可以在这里找到:
<SDK installation directory>\data\embeddedsw\lib\sw_apps\memory_tests我建议您从这个模板创建一个新项目,并根据您的需要更改memorytest.c ytest.c文件。
更直接地回答您的问题:您可能会遇到处理器、内存管理单元(内存管理单元)和缓存管理方面的问题。如果您的应用程序正在被加载到DDR中,那么它可能会阻止您访问应用程序指令和数据内存。如果您的应用程序被加载到OCM (如模板)中,则缓存中的内存可能会出现访问问题。如果使用以下命令禁用缓存
Xil_DCacheDisable();然后,您应该能够读取整个DDR内存空间(只要它存在)。确保配置应用程序链接器脚本(*.ld),以便应用程序知道哪些存储设备在那里,它们的基地址和大小。
https://stackoverflow.com/questions/57468852
复制相似问题