为什么要从RAM执行代码?


27

我刚刚遇到了一些宏,供我的微控制器编译器强制(或建议)从RAM执行函数。

https://siliconlabs.github.io/Gecko_SDK_Doc/efr32mg1/html/group__RAMFUNC.html#gac6abbc7f869eec9fb47e57427587c556

http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM

https://www.iar.com/support/tech-notes/linker/controlling-placement-of-the-section-where-__ramfunc-functions-reside-ewarm-5.x--6.x/

https://community.nxp.com/thread/389099

在什么情况下有价值?如果好处只是提高速度,为什么我不总是从RAM中执行?这通常会导致更高的电流消耗吗?


13
从RAM执行代码消耗的电流更少(我不确定所有CPU / SoC是否都适用)。我曾经做过一个项目,我们将大部分代码存储到RAM中,因为它是电池设备,并且我们希望其寿命尽可能长。如果您只能从RAM执行代码,则您甚至可以关闭某些SoC上的闪存块,从而节省更多电量。
Al Bundy

4
@pipe-我想使它成为注释而不是答案的原因是它没有回答实际的问题,这就是为什么您不想总是使用RAM来执行代码。
Jules

1
@Jules是的,我想它的意思是“有益的轶事”。出于非常充分的理由,Stack Exchange旨在防止发生这种情况。
管道

1
因为您没有足够的寄存器才能从寄存器执行。(我有那个筹码。)
约书亚

除了所有内容之外:从动态 RAM 执行代码特别可能是精心设计的软件hack的一部分,以实现DRAM刷新。:)
Kaz

Answers:


32

除了其他人已经提到的速度和其他功能外,从RAM执行代码在需要重新编程Micro Flash的引导加载程序中很有用-您无法从正在擦除&中间的Flash执行代码。重新编程。


4
取决于您拥有多少个闪存块以及允许修改引导加载程序的闪存块,剩余多少内存以暂存下一个块的数据,等等。但是对于从闪存上蹦蹦床来说,您可以修改闪存ram是很好...
old_timer

1
这似乎只能回答一半的问题(标题部分)。OP还问:“为什么不我总是从RAM中执行,如果效益仅增加速度?”,而这个答案并不能解释为什么人们可能希望从RAM中执行。
Doktor J'9

2
到目前为止,一切都很好,但是如果您在重写闪存的过程中断电(进而丢失RAM),会发生什么情况?可以解决这个问题,但是就像其他任何引导加载程序设计一样,必须予以考虑。
AaronD

19

我没看过那个微型的数据表。但是,在这种情况下,通常情况是,从RAM取数据要比从实现程序存储器的闪存取数据快。

闪光灯的优点是大量可以相对便宜。因此,微控制器制造商有时会在芯片上放置大量闪存,然后提供可以执行代码的更有限的RAM空间。这允许将对时间要求严格的例程复制到RAM中,然后从那里执行它们。

您引用的编译器开关可能与链接器配合使用,并标记将从复位开始运行的编译器运行时代码将该段闪存复制到RAM。不同的实现将在细节上有所不同。


17

当您想以更快的速度在RAM中执行时,通常是因为RAM是片上SRAM。这是一种稀缺资源,您可能会需要用于需要读/写访问权限的数据。

当您已经在ROM /闪存中拥有代码时,将其用于代码意味着您需要X数量的闪存和额外的X数量的RAM。

在启动时或您要运行它时,它也需要一个额外的复制阶段,尽管它几乎无关紧要。

传统上,这是通过指令缓存解决的,但在微控制器中,保持内部SRAM通用可能更有意义,因为您不使用微控制器,因为您想要最快的执行速度。

还有一个可靠性问题-在实际ROM中执行的代码很难被错误的代码修改。


14

除了所有好的答案:

如果好处只是提高速度,为什么我不总是从RAM中执行?

因为在嵌入式系统中,通常您没有所需的RAM数量。例如,具有32kB或RAM和512kB EEPROM的STM32。为了能够在RAM中执行整个程序,您将需要一个大于EEPROM的RAM。


5
“因为在嵌入式系统中,通常您没有所需的RAM数量。”-并且因为如果您确实有足够的RAM来执行此操作,则可以肯定地通过切换到具有较少RAM的便宜MCU来降低成本。因为如果您问这个问题,总是有一个便宜的MCU,而且RAM更少(最小,最便宜的MCU使用哈佛架构,因此无法从RAM执行)
Jules

13

其他答案似乎并没有过多讨论功耗,您曾特别询问过。

答案是,它在某种程度上取决于微控制器,但是通常从RAM执行可以减少功耗,因为从RAM读取指令所需的能量比从闪存读取能量要少。

一种典型的用法是从RAM中运行低功耗的“睡眠”功能,同时关闭闪存。不仅降低了功耗,而且如果微控制器需要快速唤醒(例如响应外部中断),则在再次打开闪存电源时没有延迟。

某些部件(例如Atmel SAM系列的某些部件)具有可用于此目的的特殊超低功耗RAM。这样可以将少量代码加载到特殊RAM中,同时关闭大量可用RAM和所有其他存储器的电源,并使微控制器进入深度睡眠模式。


7

除了其他人提到的潜在的速度优势外,RAM代码也是动态的,可以根据需要通过FLASH中的一些定制代码即时修改。

这可以像更改几个参数一样简单,也可以是整个处理程序例程远程上传。


或者可以从磁盘(例如SD)或网络中加载RAM中的代码
teambob

4

从RAM执行代码比从闪存执行代码要快得多。大多数CPU经过严格优化,以实现最快的RAM访问,甚至最快的闪存也仅达到RAM速度的一小部分。

但是请记住,将代码从闪存移动到RAM也需要时间。如果代码仅执行一次,则只需读取一次,因此实际上会浪费时间来将其首先复制到RAM中,而不是直接执行。如果偶尔执行代码(因此将其复制到RAM会增加第二次调用的执行力),但是系统通常处于空闲状态,那么通过将其复制到RAM可以更快地执行该代码,但是没人管,因为系统有足够的时间来度过。

因此,只有在频繁执行代码并且将其视为系统的瓶颈时,这种优化才值得付出努力。

另一方面,RAM需要主动保存数据,而闪存则不需要,因此如果RAM需要保持活动状态,则总功耗会增加。但是,只有在根本不使用RAM的情况下,这才有意义,但是大多数现代系统将以一种或另一种方式使用可用的RAM,因此已经使其保持活动状态。


4

从RAM执行代码有两个很常见的原因:

  1. 一些微处理器无法在闪存编程期间从闪存执行-尽管只要代码与要写入的闪存位于不同的块中,许多微处理器就可以执行该操作。Flash写入可能正在重新编程应用程序(引导加载程序情况),或者当Flash用于存储非易失性程序信息(配置,校准等)时

  2. 在许多微处理器上,RAM比闪存快得多。对于这些设备,可以从RAM中执行对速度有严格要求的小型例程,尽管通常RAM的电源要比闪存短得多。


2

RAM的另一个用例是针对随机位翻转的执行安全性。我们在小型cubesat上使用此模型,因为主计算机板具有可承受辐射引起的位翻转的ECC内存。当启动时的虚拟磁盘在ECC环境中完全运行时,整个OS都加载到ram中。

闪存不受ECC保护(标准的现成Micro SD卡),但是我们还有其他方法来检查是否损坏(多个图像,校验和等)。


我本来以为像EEPROM或闪存之类的东西很难通过辐射进行位翻转,也就是说,需要更多的能量。
管道

确实如此,但是由于我们只使用没有特殊ECC功能的标准闪存,因此使用ram更好。
Tejas Kale
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.