【发布时间】:2016-08-02 06:52:15
【问题描述】:
我无法让 ARM 执行存储在外部 RAM 中的指令。
我写了一个基于LPC3250架构的可以闪烁led的小程序。如果我通过 IAR 在线调试将程序下载到 LPC3250 的内部 RAM,则程序可以正常运行。但如果我把它放在外部 RAM 中,它就无法运行。
外部RAM是SPARTAN-6(Xilinx FPGA)内置的一块SRAM,DATA宽度为32位,存储器深度为4096,即地址宽度为12位。此 RAM 可以通过 COE 文件进行初始化。
于是我通过IAR得到Program的BIN文件,然后将BIN文件转换成COE文件,用于初始化SRAM。 但是每次处理器只执行SRAM开头的三个E59FF018(LDR PC,(PC,#0X18))指令,不能跳转到main()。
我不知道为什么。 根据LPC3250的要求,在生成COE文件之前,我通过UltraEditor在BIN文件的开头添加了4个字节(0x13579BD2)。 LPC3250的UM表示它将开始执行外部地址0xE0000004处的代码如果 0xE0000000 中的值为 0x13579BD2,则为 ram。从COE文件我可以看到0x13579BD2后面有5条相同的指令(E59FF018)。
请告诉我我哪里错了,我需要做什么才能把它改正。
【问题讨论】:
-
你有一个 LPC3250 和一个连接到外部接口的 fpga? SDRAM 会在哪里?为了从外部 ram 执行,它必须无法在其他地方找到代码,你有没有探测到它实际上是在尝试从外部接口读取?
-
这是根据 LPC3250 用户手册。
-
是的,我可以看到处理器试图从外部 SRAM 读取。外部 SRAM 是使用 IP 核(块存储器)创建的。而且我不使用SDRAM。而且没有SPI设备。我确信处理器访问了外部 SRAM 中的前四个 32 位字。
-
现在,我想这可能是因为如果我想从外部 RAM 执行代码,我没有为 IAR 链接器做正确的配置。其实我不知道如何配置链接器。有什么建议吗?
-
我使用gnu工具而不是IAR,不知道如何控制IAR链接器。