yaboPP电子
技术文章

嵌入式固件提示和技巧:使用您的阅读内存来释放RAM

2019年9月16日经过罗伯特·凯

了解如何使用代码内存来释放MCU上的RAM。

本文为您提供了一些关于如何充分利用MCU(通常过度的)非易失性存储的想法。

必须在那里有工程师在那里定期需要由8位微控制器提供的16,32,32甚至64kB的有效部分的重要部分。如果设计人员不需要,那么制造商不包含这么多的代码空间。

我能说的是我有什么说法绝不感觉受MCU中的程序存储量的限制。然而,我感到受到数据存储量的限制,本文的目的是解释如何使用多余的代码内存来释放一些RAM。

什么是只读记忆?(AKA代码内存,AKA程序内存)

Microcontroller memory is divided into categories that correspond to electrical characteristics (e.g., volatile vs. nonvolatile) and architectural factors, such as the 8051’s distinction between internal data memory and “external” data memory (the external RAM can, somewhat confusingly, be included on-chip). For example:

MSP430内存结构。图礼貌德州仪器

代码内存,AKA程序存储器或只读存储器(ROM)是存储程序的指令的位置。我们也称为“闪存”,因为现在使用称为闪存的非易失性存储技术实现了代码存储器。

了解微控制器只读存储器的重要措施是它不是只读内存。首先,如果它真正的“只读”,那将是毫无价值的,因为MCU的程序员硬件无法将程序指令写入其中。更重要的是,MCU允许您从固件内写入此内存。因此,它实际上是可读的,可写的非易失性存储器,可用于常规数据存储。

笔记:我认为,从固件中写入代码内存的能力现在是相当标准的,但如果您遇到了一个不支持此功能的现代微控制器,请在下面的评论部分中告知我们。)

笔记!除非你必须使用,否则不要使用它

在我进一步之前,我想在这一点上清除:当您使用必须存储的数据时在计划操作期间,代码内存是RAM的最后一个度假级。

访问RAM更快,并且在我的经验中,在固件执行期间写入代码内存所需的程序是复杂的,并且需要损坏闪存的风险。

不要使用代码内存来存储需要频繁修改的变量和阵列- 这应该是数据存储器。

如果您的MCU对所有经常修改的变量没有足够的RAM,请使用不同的MCU或添加外部存储器芯片。

预运行时存储

使用代码存储器补充RAM的更好方法涉及存储不变价值观。这些可能是许多不同的东西:显示您将要的模式发送到LCD模块,将通过的固定字节或字符序列传输spi.或者UART.,预估的正弦波值将用于通过数模转换器产生不同的音频频率,等等。

在闪存中存储恒定值而不是RAM很容易,因为您只需包含固件中的值(作为正常变量或阵列),并告诉编译器您希望它们存储在代码内存中。使用我的编译器,我需要做的就是在变量名称之前的关键字“代码”(见下文);您的编译器可能是不同的。

无符号char代码UART_MESSAGE [4] = {0xAA,0xAA,0x1C,0x2D};

代码内存有时如此丰富,这种技术可用于存储某种基本形象或简短的数字化音频剪辑。

运行时存储

运行时存储是使用代码内存作为RAM更换的更复杂的方法。您必须咨询您的MCU的数据表,或甚至可能是一个相关的应用笔记,以查找所需的程序并了解潜在问题。例如,下图会传达有关16位PIC微控制器的闪存程序的信息:

图礼貌微芯片

运行时代码存储器存储可用于保存在设备操作期间生成的校准值。在这种情况下,主要优点是代码存储器是非易失性的事实,因为这些类型的数据通常不会消耗多少RAM。如果需要录制收集一次的长序列测量值,并且在操作员将测量值下载到PC之前,则需要录制收集一次的长序列测量值,这是一个情况的情况。

结论

对于那些像我这样的人,在他们用完闪光灯之前更有可能用完了RAM,程序内存是一个有价值的资源,因为它可能允许您在使用较小的微控制器时满足系统要求,并消除复杂性和成本包含外部存储器芯片。

如果您有任何用于写入闪存(在运行时)的提示,请随着您的首选微控制器家庭进行闪存(在运行时),随时将它们分享在评论部分中。

特色图片是由礼貌的史蒂夫·朱维森通过这一点CC乘2.0许可证。调整大小的照片是历史核心存储板的显示Adafruit的核心记忆室

2评论
  • 模拟场 2019年9月18日

    谨慎。使用闪存的一个问题是写入耐用性。例如,我目前正在使用NXP微控制器和最坏的情况,闪光灯的最小写入周期数为10,000个周期。我是一个项目的一部分,其中需要每天一次更新一些校准值。没什么大不了。但是,程序员是新的嵌入式,它使他的代码更简单地更新了一秒钟。闪光灯几天后失败了。

    喜欢。 回复