[AutoSar NVM] 存储服务层(Memory Service)详解

专栏 《深入浅出AutoSAR》。全文 5300 字, 依AutoSAR及公开知识辛苦整理,禁止转载


接上一讲 [AutoSar NVM] 存储架构

"数据是新时代的石油" -- 克莱门特•M•杜森堡(Clement M. Dusenbury)

我们深入了解下存储服务层 (Memory Sevices). 后续的章节, 会自上而下进行学习,也会加上对底层的知识来理解上层的行为。虽然AutoSar 实现了软硬件分离, 但只有真的懂底层存储, 才能真的用好存储服务。分离的好处,是软件代码实现的时候,可以不因硬件改动而频繁改变,但也带来弊端, 就是研发不懂底层, 设备性能发挥不出来。

闲话少说, 转回正题

AutoSar NVM(Non-Volatile Memory)存储服务层是AutoSar基础软件中的一个模块,用于管理非易失性存储器(NVM)中的数据。NVM可以是EEPROM、Flash等类型的存储设备,用于存储车辆的配置数据、故障码、历史数据等。

EEPROM (Electrically Erasable Programmable Read Only Memory),电可擦可编程只读存储器--一种掉电后数据不丢失的存储设备,简称Eep。可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1。掉电后数据不丢失,具有更高的可靠性,但是电路复杂,成本也高。[1]

图 存储架构图

Autosar NVM

在基础软件的服务层中,Autosar NVM作为非易失性存储器管理工具。

首先,在数据操作方面,Autosar NVM提供了初始化、读取、写入和控制等功能。无论是处理EEPROM还是Flash模拟等不同类型的非易失性存储器,在Autosar NVM这个层级上都以相同类型进行抽象处理。

其次,在底层细节与应用程序解耦方面,Autosar NVM设计将底层细节与应用程序解耦合。具体而言,在MemIf层才会对具体存储介质进行区分。通过MemIf层,可以根据实际情况选择合适的驱动程序或算法来处理EEPROM或Flash模拟等不同类型的非易失性存储器。

此外,在错误检测和纠正机制方面,Autosar NVM支持自动监测并修复可能存在于非易失性存储器中的错误。这大大增强了系统对于数据完整性和稳定运行环境方面 的保障。

NVM Service 和上层交互?

 NVM Service 接口使用心得

  1. ReadAll函数在System Startup启动时调用,作用是把所有的Block中的数据从NV Block中拷贝到Ram中。
  2. WriteAll函数在ECU state manage里System Shutdown的时候被调用,作用是把要写到Block中的数据从Ram中拷贝到NV Block 中。
  3. NVM Queue Job执行出错时,应该读取NVM 中的默认值。
  4. 当完成某一个Block ID的写操作后,将NV Block中的数据拷贝到Ram Block中,但是在应用程序重修改了Ram Block的值,如果调用NvM_SetRamBlockStatus函数设置这个Block ID为TRUE,并且在NVM_cfg.c中设置了参数NVM_SELECT_BLOCK_FOR_WRITEALL_ON,那么ECU在进入sleep(ECU ShutDown)期间会调用WriteAll函数,把完成前述设置的block全部写到NVM中。
  5. 当Ram Block中的数据写到NV Block中后,要有回读验证的过程,即把NVM中的数据与Ram block中的original数据进行比较。
  6. 调用NvM_RestoreBlockDefaults函数可以把相应的Block的内容设置为默认值。

Memory Service 功能

提供了以下功能:

  1. 数据管理:能够读、写和擦除NVM中的数据。

  2. 数据保护:提供了对NVM中数据的完整性校验(CRC冗余校验) 和保护,避免电路信息不好导致数据出错,避免数据因为意外情况(如掉电)而损坏。

  3. 数据备份:支持将NVM中的数据备份到其他存储设备中,以便在NVM出现问题时能够恢复数据。

  4. 数据迁移:支持将NVM中的数据移到其他存储设备中,以便在需要更换NVM时能够无缝切换。

  5. 安全保护:该服务层提供了防止非授权访问非易失性存储器的保护机制。它可以通过密码(数字,指纹,人脸识别)保护、加密和权限控制来确保数据的安全性。 这主要是 eMMC 或 UFS 的 RPMB 区功能,或者是 SSD 加密算法实现。

  6. 支持多种非易失性存储器:该服务层可以支持不同类型的非易失性存储器,包括EEPROM、Flash(不会是裸Flash, 而是指的闪存存储器, 如eMMC/UFS/SSD. eMMC 在中低端手机用的多, UFS 在高端手机用, SSD 还有个名字叫固态硬盘, 主要用在电脑中)和FRAM等。它还提供了对存储器类型、大小和性能的配置选项。

  7. 故障管理:该服务层还提供了故障管理功能,可以检测和纠正非易失性存储器中的错误。它可以通过检查和修复存储器块、页面和扇区等来提高数据完整性和可靠性。

  8. 自我诊断:该服务层还提供了自我诊断和自我测试功能,以确保非易失性存储器的正确性和稳定性。它可以检查存储器中的块、段、页和扇区等,以捕获潜在的错误和故障。UFS 和 SSD 都有自检(self test) 功能, eMMC 是没有的。

Memory Service 数据来源

AutoSar NVM(Non-Volatile Memory)存储服务层的数据来源可以来自于应用程序通信栈、设备驱动程序、配置参数以及操作系统等。其中,应用程序是主要的数据来源,它们可以通过NVM存储服务层提供的API函数将数据存储到非易失性存储器中,以便在下一次启动时恢复数据。

通信栈(用于不同的ECU和应用程序之间进行通信和协作)也是一个重要的数据源,例如,通信栈可能需要在非易失性存储器中保存一些通信参数,以便在重启后自动恢复。设备驱动程序也需要将一些设备参数和状态信息保存到NVM中,以便在下一次启动时恢复,以及防止设备、系统出现意外故障时保留状态信息。

操作系统也可以使用NVM存储服务层来保存一些必要的配置参数,如网卡的MAC地址等。此外,系统也可以使用NVM存储服务层保存一些操作历史记录、日志信息以及故障信息,以便进行故障排查和问题解决。

Memory Service API接口

AutoSar NVM存储服务层的实现是基于标准API接口,

主要包括以下几个部分:

  1. Memory Mapping Service API:提供了访问内存区域的函数。

  2. Memory Block Service API:用于动态分配和释放内存块。

  3. NVRAM Manager Service API:提供了对非易失性内存的读写和管理功能。

  4. EEPROM Emulation Manager Service API:提供了对EEPROM仿真的读写和管理功能。

  5. Flash Emulation Manager Service API:提供了对Flash仿真的读写和管理功能。

  6. Memory Protection Service API:用于保护内存区域不被非授权的访问所修改。

  7. Memory Monitoring Service API:提供了对内存使用情况的监控和管理功能。

这些API接口可以被其他AutoSar模块或用户应用程序调用,来实现对NVM中数据的读、写和擦除操作。

我们挑两个最重要的来讲讲。

Memory Block Service API

AutoSAR Memory Block Service 是 AutoSAR 架构中的一个重要服务组件,主要负责管理应用所使用的内存资源。使用 AutoSAR Memory Block Service 时需要注意以下事项:

  1. 内存池的大小需要在设计阶段预估,避免内存不够用或浪费过多内存资源;

  2. 内存池的布局需要根据应用需求进行优化,例如将频繁使用的内存块放在比较靠前的位置;

  3. 使用 AutoSAR Memory Service 时应该注意内存池的锁定状态,避免多个任务同时访问导致竞争问题;

  4. 内存分配和释放需要谨慎处理,避免出现内存泄漏或非法访问等问题;

  5. 在使用 Dynamic Memory Access API 时需要注意线程安全性,避免多个任务同时分配或释放内存导致竞争问题。

NVRAM  Memory Service API

AutoSar NVRAM Manager Service是一种用于管理非易失性存储器(NVRAM)的服务。NVRAM是指在断电后可以保存数据的存储器,通常用于保存重要的配置数据、故障码、日志等信息。

AutoSar NVRAM Manager Service提供了以下功能:

  1. 数据的读写:可以对NVRAM中存储的数据进行读写操作。

  2. 数据块管理:可以将NVRAM中的数据按照不同的数据块进行管理,方便数据的组织和管理。

  3. 数据保护和恢复:可以对NVRAM中的数据进行保护,防止数据丢失或被破坏;同时,在系统启动时可以恢复已经保存的数据。

  4. 数据同步:可以将NVRAM中的数据同步到其他存储器中,以便在系统故障或NVRAM损坏时,能够及时恢复数据。

在使用AutoSar NVM存储服务层时,需要注意以下事项:

  1. NVM的大小和类型:不同类型和大小的NVM需要使用不同的读写方式和算法,所以在使用前需要确认NVM的类型和大小信息。

  2. 数据保护设置:根据实际需求,需要选择合适的数据保护方式和设置参数,以确保NVM中的数据不会因意外情况而损坏。

  3. 数据备份和迁移:在使用NVM存储数据时,需要定期备份数据并考虑将数据迁移到其他存储设备中,以确保在NVM出现问题时能够及时恢复数据。

NVRAM Block

在Autosar中规定了四种 NVRAM Block,分别为 NV Block、RAM Block、ROM Block、Administrative Block。

 

1. NV Block

NV Block是一种非易失性存储器块,用于存储需要在ECU断电后保持的数据。这种存储器的读写速度较慢,但具有高可靠性和长寿命。NV Block通常用于存储ECU的配置设置、故障码、历史数据等信息。

NV block是存储NV变量的基本结构,其中Header以及CRC校验非必须项。

2. RAM Block

RAM Block是一种随机存储器块,用于存储需要在ECU上电后才能保持的数据。这种存储器的读写速度较快,但是在ECU断电或重启后,存储的数据会丢失。RAM Block通常用于临时存储一些运行时数据,如缓存、栈、堆等。

缓存(Cache)是一种临时存储,在计算机系统中用于存储频繁使用的数据,加速计算机的运行速度。缓存由CPU内部或者外部芯片组实现,可以分为一级缓存、二级缓存等。

栈(Stack)是一种数据结构,它以先进后出的顺序存储数据,即后进先出。栈一般分配在内存的高地址,有一个指针记录下栈顶的位置。栈常用于函数调用、表达式求值、递归等操作。

堆(Heap)也是一种数据结构,它用于存储动态分配的内存。堆的内存分配和释放不是按照固定顺序进行的,也不是像栈那样有一个指针指向栈顶,而是由程序员自己控制的,因此堆中的内存可以被多个指针引用,也可以在程序的任何地方进行释放。

由于NV变量的写入与读取都是一件相对较慢的操作,而应用层逻辑操作周期速度又太快。直接操作NV block显然不合适,所以在进行读写之前,我们会建议一个同样大小的Ram空间来操作、使用、存放这些还没有被写入或者读取的NV值。

在NVM中规定了permanent,temporary 两种类型。其中永久型在项目配置时就必须输入指定的RAM地址;而临时型不需要在项目配置期间就设定

3. ROM Block

ROM Block是一种只读存储器块,用于存储只读数据。这种存储器的读取速度较快,但不能进行写操作,也不能在ECU运行时修改存储的数据。ROM Block通常用于存储ECU的程序代码、固件升级文件等。

4. Administrative Block

Administrative Block是一种系统级别的存储器块,用于存储ECU的元数据和管理信息。Administrative Block通常包含ECU的识别码、版本信息、访问权限等。

Administrative block是专门用于对NVRAM Block 与 RAM blcok 的数据安全性进行管理而设计的,它对应用层并不可见。


参考

1 怿星科技 Classic AUTOSAR专题 | 存储模块简介 - 知乎

Autosar Architecture (Learn from Scratch with Demo)

图片来源: COMIDOC

免责声明

本文根据公开信息整理,旨在介绍更多的汽车知识,所载文章仅为作者观点,不构成投资或商用建议。本文仅用于学习交流, 不允许商用。若有疑问或有侵权行为请联系作者处理。

猜你喜欢

转载自blog.csdn.net/vagrant0407/article/details/134065897
nvm