嵌入式固件提示和技巧:使用只读内存释放RAM

本文就如何充分利用mcu的非易失性存储提供了一些想法。

一定有工程师经常需要8位微控制器提供的16、32、甚至64 KB的程序内存的很大一部分。那么如何充分利用MCU的非易失性存储呢?本文将会介绍如何使用多余的代码内存来释放一些Ram。

什么是只读存储器?

微控制器存储器被分为对应于电气特性(例如,易失性与非易失性)和结构因素的类别,例如8051在内部数据存储器和“外部”数据存储器之间的区别(外部ram可能有点混乱,包括在芯片上)。

代码存储器,又称程序存储器或只读存储器(rom),是存储程序指令的地方。我们还称之为“闪存”,因为现在代码存储器是使用一种称为闪存的非易失性存储技术实现的。

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

根据经验,在固件执行期间写入代码内存所需的过程非常复杂,并且存在损坏flash的风险。不要使用代码内存来存储需要频繁修改的变量和数组,这些应该在数据内存中。

如果您的MCU没有足够的RAM来存储所有经常修改的变量,请使用其他MCU或添加外部内存芯片。

运行前存储

使用代码存储器补充ram的更好方法是存储常量值。这些可能是许多不同的东西:将发送到LCD模块的显示模式、将通过SPI或UART传输的固定字节或字符序列、将用于通过数模转换生成不同音频频率的预计算正弦波值等等。

用flash而不是ram存储常量值很容易,因为只需在固件中包含这些值(作为普通变量或数组),并告诉编译器您希望它们存储在代码内存中。对于我的编译器,我只需要在变量名之前放置关键字“code”(参见下面的示例);编译器可能会有所不同。

无符号字符代码uart_消息[4]=;

代码存储器有时非常丰富,可以用来存储某种基本图像或简短的数字化音频片段。

运行时存储

运行时存储是使用代码内存作为ram替换的更复杂的方法。你必须查阅MCU的数据表,甚至是相关的应用程序说明,才能找到所需的过程并了解潜在的问题。

运行时代码内存存储对于保存设备操作期间生成的校准值非常有用。在这种情况下,主要的优点是代码存储器是非易失性的,因为这些类型的数据通常不会消耗太多的ram。运行时代码内存存储可以帮助您处理ram限制的一个例子是,如果您需要记录一长串测量值,这些值收集一次,然后单独保存,直到操作员将测量值下载到pc。

结论

对于那些像我一样,在闪存耗尽之前更可能耗尽内存的人来说,程序存储器是一种有价值的资源,因为它可以使您在使用较小的微控制器时满足系统要求,并消除合并外部存储器芯片的复杂性和成本。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190920A0L95500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励