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