如何从外部存储器运行ARM代码?

时间:2010-04-12 18:08:16

标签: memory embedded arm

我正在使用LPC2132 ARM芯片开发程序。但是,我的程序比芯片上的空间大了。

如何将芯片连接到某种外部存储器芯片以保存其他可执行代码?这可能吗?如果没有,人们在芯片空间耗尽时通常会做些什么?

6 个答案:

答案 0 :(得分:10)

马克的回答很好。一个问题 - 你是缺少RAM,还是闪存,或两者兼而有之?解决方案/答案可能取决于......

几年前,我发现自己处于类似情况(LPC2148上没有房间(闪存和RAM)。在引脚兼容的部件中,这是最大的闪存和最大的RAM。所以它是一个不幸的情况是“用你所拥有的东西”。正如马克所说,选择了错误的芯片(实际上,要求和功能的增长超出了原本应该做的芯片......我肯定不会其他人曾经历过这种情况;-))

无论如何,我发现自己陷入了“字节战”。以下是我记得要做的事情(请注意,我从客户那里继承了很多代码......)

  • [+ RAM,-ROM] 制作任何可以
  • 的const
  • [+ ROM] 尽可能使用Thumb(请参阅Mark的评论)
  • [+ ROM] 尽可能使用查找表
  • [+ ROM] 重新考虑因素&结合常用功能(特别是将使用频繁的函数式宏转换为子程序)
  • [+ ROM] 任何从一个地方调用的函数 - 将其直接放入行中而不是函数中
  • [+ ROM,+ RAM] 将所有浮点用法更改为定点
  • [+ ROM,+ RAM] 消除未使用的变量+常量(使用lint&链接器映射查找/消除/验证)
  • [+ ROM] 尝试更换开关w / if / else,反之亦然
  • [+ ROM] 确保您的链接器配置为消除“死”(未使用)代码
  • [+ ROM] 重新处理字符串+常量,以便只在一个地方定义相同的“事物”
  • [+ ROM] (喘气,叹气)用宏替换数据隐藏功能(如果可以,则替换内联) - 注意抢占,竞争条件,互斥等...... / LI>
  • [+ ROM,+ RAM] - 消除所有调试/临时代码 - 通常有I / O引脚切换/打印/等...没有有条件编译出来

男人还有更多,但我必须参加一个会议。我记得的是,这是进步,数十&一次数百个字节,最终产生了相当大的节省。我最终从闪光灯和闪光灯中恢复了约20% RAM,这足以完成项目。我花了大约2个星期来清理这些东西,但节省的成本非常值得。

我会尝试回来&发布更多战术,我现在不能。为了记录,我一直处于需要加载/交换代码的情况下。根据需要(算法,表等等)在串行闪存的运行时从RAM中运行,这很糟糕。首先,尝试尽可能收紧当前代码。这也是一种有点智力的练习,它会迫使你进入引擎盖。了解你的编译器到底在做什么。

最后一点:在项目的整个中编写好的紧密代码,但在最后进行这种优化,必要时和业务案例证明它是正确的

答案 1 :(得分:8)

查看该部分的数据表:

http://www.keil.com/dd/docs/datashts/philips/lpc2131_32_34_36_38.pdf

它似乎没有内存映射外部闪存或sdram的接口,也没有MMU。

它有SPI端口,可用于连接SD卡,EEPROM或串行闪存以进行片外存储,但这些不会被内存映射,您必须处理移出的代码段,因为在该芯片上非常有限的内存,这将是困难的。

将数据移动到外部存储器并仅将代码存储在片上ROM中可能“足够”,这将以访问数据时增加的延迟为代价来简化您的挑战。您还可以查看使用拇指指令集,它会以某种速度为代价减少代码大小,并使编译器针对代码密度而不是速度进行优化。

  

如果没有,人们通常会做什么   什么时候他们的芯片空间不足?

这里不幸的答案是你为你的应用程序选择了错误的芯片和/或需要重新思考你的应用程序的架构如何使它适合这个芯片。

修改

看起来还有一些几乎与引脚兼容的部件有更多的资源。 LPC2138具有512kB的闪存和32kB的RAM(与您的64/16相比)。两者之间也有两种尺寸可供选择。

快速浏览一下引脚看起来唯一的区别就是板载的第二个ADC与其他一些引脚复用。显然可以完全看到这一点,但看起来你可以换掉更高端的部件,而无需修改其余的电路板。

答案 2 :(得分:2)

如果必须连接外部存储器(意味着需要更改硬件),为什么不使用内存较大的芯片。事实上,一些芯片将完全引脚兼容并具有更多闪存,因此您可以避免重新设计(仅更换芯片)。

答案 3 :(得分:1)

  

如果没有,人们通常会做什么   什么时候他们的芯片空间不足?

他们要做的第一件事就是优化他们的应用程序。我不是在讨论运行编译器优化器(虽然这可能是解决方案的一部分),但是应用Dan等技术已经提出了建议。查看数据结构和算法的空间效率,通常在空间和执行速度之间存在折衷,但您可能不需要尽可能快的算法,但您确实需要节省空间。

你需要知道你的目标以及它是否可行。您的应用程序超出可用空间的程度,以及当前有多大?链接器映射或构建日志应该告诉您这一点。如果你还没有解决优化问题,我很少看到一个应用程序,即使在使用优化器之前,也不会有相对无痛的情况下至少有5%的应用程序被淘汰,而且更多的是通过协同努力。

链接器映射还会告诉您每个函数/模块使用的内存量,因此您可以将优化定位到最有效的位置。您可能会对地图文件感到惊讶,因为它已经链接了哪些库代码,您可以问问自己为什么以及是否可以将其删除。

使用编译器优化限制了轻松使用调试器的能力,但您不需要优化每个模块。因此,如果您需要调试但也使用编译器优化,请优化除您在任何特定时间调试的模块之外的所有模块。

请注意,在编译器优化之后,看似有效但有缺陷或使用未定义语言行为的代码可能会改变其行为(即失败);让你的代码失败,但无法调试。帮助避免这种情况的最佳策略是使用编译器允许的最大警告级别构建代码(并将警告设置为错误),并消除所有警告。如果可能,请使用静态分析工具,如Lint。

如果你还没有这样做,你的情况下最快和最大的节省可能是编译到Thumb而不是ARM指令集。

最后,当所有其他方法都失败时,您的部件是LPC2131 / 32/34/36/38设备系列的成员,“最大”部件具有512K闪存/ 32K RAM,因此您可以更改为其他部分相同的家族,并在很大程度上保持软件兼如果您还需要引脚兼容性,请检查datasheet

答案 4 :(得分:-1)

寻找TI OMAP处理器。所有这些都运行来自DDR3(或DDR2)内存的代码,对于某些型号可以在1GHz下运行。这里唯一的缺点是这些类型的处理器都是BGA和DDR2 / 3内存,PCB布局不是简单或第一次容易搞定。

答案 5 :(得分:-2)

您将不得不开发某种热插拔模块代码,并在某种内存芯片中连接外部模块。