首页 > 新能源汽车

数据存储在非易失性存储器中

来源:新能源汽车网
时间:2023-03-07 17:10:49
热度:

数据存储在非易失性存储器中尽管闪存和其他非易失性存储器技术被广泛用于实现嵌入式文件系统,但这对于某些嵌入式应用程序来说可能过于复杂。在许多情况下,内存可能有效地用作已预初始化的数据

尽管闪存和其他非易失性存储器技术被广泛用于实现嵌入式文件系统,但这对于某些嵌入式应用程序来说可能过于复杂。在许多情况下,内存可能有效地用作已预初始化的数据结构。这种方法需要对数据完整性进行一些管理。本文介绍了挑战并提供了一些使用 NVRAM 的简单解决方案。

NVRAM简介 
在现代计算机系统中,有大量的内存。其中大部分是名称不合时宜的随机存取存储器 (RAM)。这个名字没什么意义,因为现在所有的内存都是随机访问的。当工程师谈论 RAM 时,他们指的是易失性半导体存储器,只要通电,就可以无限期地写入和读取。它并不总是这样。在计算机的早期,常见的程序/数据存储形式是“内存”。按照现代标准,这是笨重的(更不用说昂贵了!),但有一个有用的特性:它是非易失性的。读取或写入数据需要电源,但不需要电源来保留数据。在内存断电的情况下,数据将无限期保持不变。有趣的是,跌落或振动内存可能会破坏其内容,

尽管现代计算机和大多数嵌入式系统的工作内存主要是 RAM,但拥有一定数量的非易失性 RAM (NVRAM) 仍然很有用。这可以使用闪存或其他一些具有非易失性(如 MRAM)的存储技术来实现,或者它可以是具有受保护电源(即电池)的常规 RAM。NVRAM 在嵌入式系统中有多种可能的用途:

在启动时复制到 RAM 中的程序代码和常量数据的存储。尽管在 NVRAM 之外执行通常是一种选择,但某些 NVRAM 技术的速度(访问时间)使其没有吸引力。在电源循环之间保留设备设置参数。许多设备都是用户可配置的;这些信息需要存储在某个地方。长时间缓冲获取的数据,不受电源故障影响。一个简单的例子可能是在数码相机中存储照片。

NVRAM管理

从广义上讲,可以通过以下两种方式之一使用 NVRAM:

类似于硬盘驱动器上使用的文件系统,可以在 NVRAM 中实现。它需要以一种优化介质(如闪存)使用的方式实现,并且能够适应写入数据期间发生的电源故障。实施数据加密等安全功能也可能是谨慎的做法。数据结构可以简单地位于 NVRAM 中并直接从 NVRAM 访问。这需要针对非易失性进行特定调整。

许多供应商提供专为在 NVRAM 中使用而设计的现成文件系统软件。除非需要某些专门的功能,否则开发人员自己设计在经济上是有问题的。数据结构的存储更特定于应用程序,因此将进一步解决。

适应非易失性 
使用普通的易失性 RAM 很简单。它必须在加电时初始化为已知值,然后可以根据需要写入和读取。使用 NVRAM 有两个新的挑战:

上电时,软件需要识别 NVRAM 是否已初始化,如果没有,则执行该初始化。数据的完整性,尤其是在断电一段时间后,需要是可验证的。


NVRAM 初始化 
当 NVRAM 次上电时,与普通 RAM 一样,它包含不确定的数据,需要进行初始化。在随后的情况下,软件需要识别 NVRAM 已初始化并且不会覆盖此保存的数据。

实现这种识别的简单方法是使用签名,它只是一个可以快速识别的字节序列,不能随机出现。当然,这种理想是不可能的,因为任何字节序列,无论多长,都可能随机出现。这只是将这种可能性降到的问题,同时仍然使检查变得快速和容易。如果签名只有 4 个字节,则它随机出现的几率为 40 亿比 1。这对于几乎任何可以想象的应用程序来说已经足够了。并且可以快速检查 32 位值。

通过仔细选择签名值,可以减少意外发生的机会。直觉上,一系列连续的数字(例如 1、2、3、4)感觉比“随机”集合更不可能。毕竟,彩票产生连续的数字序列是什么时候?当然,这样的序列与任何其他序列一样有可能或不太可能。然而,通过思考记忆是如何工作的,可能会增加特定序列的可能性。内存在首次通电时可能具有哪些值?大致有四种可能:

完全随机全为零所有的反映芯片架构的一些规则模式(如交替的 1 和 0)

如果是 (1),那么任何签名都会给我们 40 亿比 1 的机会。任何其他人都可以通过使用正确的签名来检测。一种可能性如下:0x00、0xff、0xaa、0x55。这应该涵盖所有 (2)、(3) 和 (4),并且仍然只有 32 位。

需要注意初始化序列。必须设置有效数据,然后将签名初始化为过程中的一件事。

NVRAM 完整性 
当然,使用签名并不能保证数据的完整性。明智的做法是使用校验和或 CRC 进行错误检查,甚至是数据自校正机制。

使用 NVRAM 启动系统 
当使用 NVRAM 时,启动逻辑需要同时支持签名验证和数据完整性检查:

结论 
在嵌入式设计中使用 NVRAM 很简单,但需要仔细考虑其功能,如此处所述。使用全局签名和错误检查的方法适用于许多应用程序。对于非常大的数据库,对每个数据块进行单独检查可能会更有效。也可能值得使用 C++ 向应用程序代码开发人员隐藏 NVRAM 管理,从而限度地减少程序员错误的可能性。