【AUTOSAR】 项目和代码详解(十五)----AUTOSAR NvM 配置

NvM

概要

 

NvM (NVRAM Manager,非易失性存储器管理器)是AUTOSAR存储服务层的核心模块,它将ECU的持久数据存储设施组织在称为“NvM块”的单独可管理单元中。NvM组件独立于它们的实际存储位置管理这些块(比如闪存设备中的串行EEPROM或EEPROM模拟),并提供读取、写入、恢复、使NvM块无效和擦除的服务,将Nv Data存储到对应的NvRAM Block。其中Nv Data指的是存储在非易失性存储器中的数据,这些数据中被分为两类一类是不能有延时需要立即写入存储器中的数据,这一类数据被称为crash data ;另一类为普通的数据,其写入存储器的可以存在一定的延时。而NvRAM Block是指整个管理和存储非易失数据的结构,它的基本单位称为Nv Block7Nv Block驻留在非易失存储中,它是读、写等操作的基本单位。若Nv Block 中存储的 NvData 为 Crash Data,则该 Nv Block 称为 Immediate Block。另外,AUTOSAR 标准中,对每个Nv Block都设置了一个优先级,优先级的范围为O到255,ImmediateBlock的优先级为0,0为最高优先级。每一个读写任务即是把数据从一个NvBlock读取或写入的过程,故该Nv Block的优先级即是对应读写任务的优先级。

AUTOSAR标准中规定对Nv Block的读、写过程采用异步的方式实现,即用户调用特定的函数发出读、写请求,将读、写请求任务存储到队列中(AUTOSAR标准规定,同一时间,队列中只能存储一个针对同一个Nv Block的任务)。通过另一个周期性调用的函数从队列中抓取Nv Block的读、写请求任务,完成对应的读、写操作。AUTOSAR标准中从读写队列中读取Nv Block读写请求任务的顺序根据用户配置参数NvmJobPrioritization(布尔型用户配置参数)是否为Ture,被分为基于Nv Block优先级的顺序处理和先来先服务的顺序处理两种方式。AUTOSAR NvM 378中规定在基于Nv Block优先级任务处理的方式下, NvM模块需要使用两个队列,一个为立即队列,它仅存放crash data的写任务,而另一个为普通队列,它存储除Crash Data写任务以外的其他任务。立即队列中的任务可以抢占普通队列中任务的执行(即取消普通队列中正在进行的任务,执行立即任务队列中的写任务), 普通任务队列不能抢占其他任务,但也需要根据读写任务Nv Block优先级的顺序执行。

模块配置

ETAS ISOLAR中主要配置或修改内容如下:

NvMCommon

 

NvMApiConfigClass

预处理程序切换,以启用一些与NVM API配置类相关的API调用。

NvMBswMMultiBlockJobStatusInformation

此参数指定是否通知BswM关于多块作业的当前状态。

NvMCompiledConfigId

关于NV内存布局的配置ID。这个配置ID应该配置,当一个SW-C有写入NV内存的可能性。

NvMCrcNumOfBytes

如果CRC配置为至少一个NVRAM块,则此参数定义在一个作业处理周期内应处理的最大字节数。

NvMDatasetSelectionBits

在内存硬件抽象的接口中,定义应使用用于处理NVRAM块的特定数据集的最低有效位的数量。

0 . .8:用于数据集或冗余块寻址的比特数。

0:完全不配置数据集或冗余NVRAM块,不需要选择位。

1:如果配置了冗余NVRAM块,但是没有数据集NVRAM块。

NvMDevErrorDetect

打开或关闭开发错误检测和通知。

NvMDrvModeSwitch

在执行NvM_ReadAll和NvM_WriteAll期间,启用切换内存驱动程序到快速模式的预处理程序切换。

NvMDynamicConfiguration

预处理器切换,通过NvM_ReadAll请求启用动态配置管理处理。

NvMJobPrioritization

预处理器切换以启用操作优先级处理。

NvMMainFunctionPeriod

连续调用主函数之间的周期(以秒为单位)。

NvMMultiBlockCallback

公共回调例程的入口地址,在每个异步多块请求终止时调用。

NvMPollingMode

在NVRAM管理器中启用/禁用轮询模式的预处理程序开关,同时禁用/启用较低层可以使用的回调函数。

NvMRepeatMirrorOperations

定义在延迟当前操作之前,允许应用程序在NvM模块的镜像中复制数据的重试次数。

NvMSetRamBlockStatusApi

预处理程序切换,以启用API NvM_SetRamBlockStatus。

NvMSizeImmediateJobQueue

定义当前优先级操作队列的队列条目数。

NvMSizeStandardJobQueue

定义标准操作队列的队列条目数。

NvMVersionInfoApi

预处理程序切换,启用/禁用API来读取模块版本信息。

NvM/NvMBlockDescriptor

用于管理结构的容器,用于配置给定NVRAM块管理类型的组合。它的多重性描述了配置的NVRAM块的数量,需要配置一个块。NVRAM块描述符被压缩在NVRAM块描述符表中。

 

NvMBlockCrcType

定义NVRAM块的CRC数据宽度。默认:NVM_CRC16,即当NVM_BLOCK_USE_CRC==true时使用CRC16。

NvMBlockHeaderInclude

定义头文件,其中NVRAM块的所有者声明了永久RAM数据块、ROM数据块(如果配置)和每个配置回调的回调函数原型。如果没有配置永久RAM块、ROM块或回调函数,则应忽略此配置参数。

NvMBlockJobPriority

定义NVRAM块的操作优先级(0 =当前优先级)。

NvMBlockManagementType

定义NVRAM块的块管理类型。

NvMBlockUseAutoValidation

定义在关闭阶段是否自动验证RAM块。

NvMBlockUseCrc

定义NVRAM块的CRC用法,即CRC的内存空间保留在RAM和NV内存中。

NvMBlockUseCRCCompMechanism

定义在写作业期间是否将RAM块的CRC与上一次成功读写作业期间计算的CRC进行比较。

NvMBlockUseSetRamBlockStatus

定义NvMSetRamBlockStatusApi是否为该块应使用。

注意:如果NvMSetRamBlockStatusApi被禁用,这个配置参数将被忽略。

NvMBlockUseSyncMechanism

定义NV块是否使用带有RAM镜像的显式同步机制和用于在NvM模块的RAM镜像之间传输数据的回调例程。

NvMBlockWriteProt

定义NV块的初始写保护。

NvMBswMBlockStatusInformation

此参数指定是否通知BswM指定块的当前状态。

NvMCalcRamBlockCrc

为配置为使用显式同步机制的永久RAM块或NVRAM块定义CRC计算。

NvMInitBlockCallback

一个特定于块的回调例程的入口地址,如果没有可用的ROM数据来初始化NVRAM块,该回调例程将被调用。

如果未配置,则不应调用任何特定的回调例程来初始化具有默认数据的NVRAM块。

NvMMaxNumOfReadRetries

定义读取重试的最大次数。

NvMMaxNumOfWriteRetries

定义NVRAM块的最大写重试次数。

NvMNvBlockBaseNumber

配置参数,用于执行SW-Cs使用的NVM_NVRAM_BLOCK_IDENTIFIER与内存抽象模块期望的FEE_BLOCK_NUMBER之间的链接。

参数值等于由NvMDatasetSelectionBits位右移的FEE_BLOCK_NUMBER或EA_BLOCK_NUMBER。

NvMNvBlockLength

定义以字节为单位的NV块数据长度。

NvMNvBlockNum

根据给定的块管理类型定义相邻区域中的多个NV块的数量。

1-255用于将NVRAM块配置为块管理类型NVM_BLOCK_DATASET。

1为NVRAM块配置的块管理类型NVM_BLOCK_NATIVE

2为NVRAM块配置的块管理类型NVM_BLOCK_REDUNDANT

NvMNvramBlockIdentifier

通过唯一块标识符标识NVRAM块。

NvMNvramDeviceId

定义NVRAM块所在的NVRAM设备ID。

NvMRamBlockDataAddress

定义RAM块数据的起始地址。

如果未配置此属性,则所选的块管理类型没有可用的永久RAM数据块。

NvMReadRamBlockFromNvCallback

为了让应用程序将数据从NvM模块的镜像复制到RAM块,需要调用一个特定于块的回调例程的入口地址。

NvMResistantToChangedSw

定义NVRAM块是否应进行抗配置更改处理。如果在配置时没有可用的默认数据,则应用程序应负责提供默认的初始化数据。在这种情况下,应用程序必须使用NvM_GetErrorStatus()来区分第一次初始化和损坏的数据。

NvMRomBlockDataAddress

定义ROM块数据的起始地址。

如果未配置,则所选的块管理类型没有可用的ROM块。

NvMRomBlockNum

根据给定的块管理类型定义相邻区域中的多个ROM块的数量。

0-254用于将NVRAM块配置为块管理类型NVM_BLOCK_DATASET。

0-1用于将NVRAM块配置为块管理类型NVM_BLOCK_NATIVE。

0-1用于将NVRAM块配置为块管理类型NVM_BLOCK_REDUNDANT。

NvMSelectBlockForFirstInitAll

定义一个块是否被NvM_FirstInitAll处理。一个块可以配置为被处理,即使它没有永久的RAM和/或显式同步。

NvMSelectBlockForReadAll

定义NVRAM块是否在NvM_ReadAll期间被处理。此配置参数仅对那些配置为具有永久RAM块或配置为使用显式同步机制的NVRAM块有影响。

NvMSelectBlockForWriteAll

定义NVRAM块是否在NvM_WriteAll期间被处理。此配置参数仅对那些配置为具有永久RAM块或配置为使用显式同步机制的NVRAM块有影响。

NvMSingleBlockCallback

特定于块的回调例程的入口地址,在每个异步单块请求终止时将被调用。

NvMStaticBlockIDCheck

定义是否启用静态块ID检查。

NvMWriteBlockOnce

定义第一次写之后的写保护。NVRAM管理器设置写保护位,可以是在第一次写入NV块之后,也可以是已经写入了该块,并且在读取期间检测到它是有效且一致的。

NvMWriteRamBlockToNvCallback

为了让应用程序将数据从RAM块复制到NvM模块的镜像,需要调用一个特定于块的回调例程的入口地址。

NvMWriteVerification

定义是否启用写验证。

NvMWriteVerificationDataSize

定义在比较RAM块的内容和块的读回时,在每个步骤中要比较的字节数。

NvMTargetBlockReference

未使用

RB Specific

NvMRbBlockPersistentId

定义此块的唯一ID,表示其特定于块的属性。当且仅当这些块特定的属性被以不兼容的方式修改时,它才会被更改。ID存储在内存介质中,是内存驱动程序(Fee、Eep)中块标识的基础。与C API中用于块标识的ID不同,这个ID(对于给定的块)在内存堆栈的所有模块中都是相同的。它的值通常保持不变,即使在块布局中添加或删除了其他块。

NvMRbFirstReadDataMigration

启用/禁用第一读取此块的数据迁移特性。当第一次启用读数据迁移时,当所配置的NV块长度与介质上的块长度(EEPROM)之间发生错配时,也会执行读作业。如果NV块长度小于介质上的块,则丢弃其余数据。如果NV块长度大于介质上的块,则其余数据填充为0。如果功能被禁用,并且发生了长度错配,则不执行读取作业。

NvMRbGenRteAdminPort

定义是否为该块生成管理端口。如果启用,将为这个NvM块创建此类RTE P-Port,它允许通过RTE调用诸如SetBlockProtection之类的管理操作。但是由于对该特性的需求很少,所以必须通过将此配置参数设置为true来显式地启用管理端口的创建。请注意,只有在同时为这个块启用了RTE服务端口创建时,才能启用此功能。

NvMRbGenRteServicePort

定义是否为该块生成服务端口。默认情况下,为每个NvM块创建一个RTE P-Port,允许通过RTE调用ReadBlock或WriteBlock等服务操作。在为这个块配置回调的情况下,此配置参数还控制相应R-Ports的创建。但是,由于不是所有的NvM块都是通过RTE访问的,因此可以通过将这个配置参数设置为false来禁止为这个块创建所有这些RTE端口。

NvMRbInitBlockAtLayoutChange

定义在检测到块布局更改时是否应初始化NvM块。在这种情况下,在ReadAll期间首先读取块。如果无法从介质中检索块,初始化数据(从ROM块或通过初始化回调)将在执行ReadAll后写入介质。

此配置参数允许在以下条件下设置为“true”:

(1)将常用配置参数NvMRbInitAtLayoutChange设置为“true”。

(2)块是本地的或冗余的。

(3) block有一个标准的priorit。

NvMRbNoFallback

此标记激活或停用对同一块的旧副本的回退机制。它只对位于Fee上的块进行评估,而对位于Ea上的块忽略。

默认情况下,这个特性被设置为FIXMEfalseFIXME,这是收费块的标准行为(即,宁可使用相同块的旧值,也不要交付任何块数据)。在Ea中,旧的值原则上是不可用的,因此位于Ea上的块的行为就好像这个标记已经被设置为FIXMEtrueFIXME,而不管它的实际设置是什么。如果此标记被设置为FIXMEtrueFIXME,并且相应的块位于Fee上,则如果最新的块实例完全损坏,则不会返回旧的值。在这种情况下,报告的是不一致的状态。

NvMRbNvBlockLengthString

定义以字节为单位的NV块数据长度。所有可能的值在C编程语言中除了单独的数字文字支持。不需要在C表达式的末尾使用分号。对于数值文字,可以使用NvMNvBlockLength或define指令。例如,如果需要配置块长度Null,那么可以使用define指令,比如NV_BLOCK_LENGTH_NULL。这里使用的所有r值都必须由用户声明。此外,用户必须让NvM_Cfg.c知道它。因此,必须使用配置参数NvMBlockHeaderInclude。

NvMRbRamBlockDataAddressString

将RAM块数据长度定义为C表达式。支持C语言中所有可能的r值。不需要在C表达式的末尾使用分号。这里使用的所有r值都必须由用户声明。此外,用户必须让NvM_Cfg.c知道它。因此配置参数必须使用NvMBlockHeaderInclude。

NvMRbResistantToLayoutRemoval

定义NvM块是否抵抗布局移除。一旦配置和写入完成,较低的层就会将这个块保存在持久媒体上,即使这个块不再是布局的一部分(例如,当配置发生变化并且从布局中删除这个块时)。在这种情况下,这个块不能从NvM访问。如果配置再次更改,并且重新配置了此块,则重新启用对该块的访问。

NvMRbSelectBlockForFirstInitAll

定义NvM块是否在NvM_Rb_FirstInitAll期间被处理。

NvMRbSingleBlockStartCallback

特定于块的回调例程的名称,在对实际内存媒体的每次访问开始时将调用该例程。如果您显式地想要指定不应该调用这样的回调例程,那么在这里输入NULL_PTR。

NvMRbAuxInterface

启用/禁用辅助服务接口。这个接口允许一个特殊的“辅助”用户触发NvM单块作业用于不影响“常规”用户的作业或状态的任意块。

NvMRbGenArxmlVersion

生成的ARXML文件版本。

NvMRbInitAtLayoutChange

启用/禁用具有配置参数NvMRbInitBlock-的NvM块的初始化LayoutChange设置为“true”。如果检测到布局更改,则执行此初始化。

NvMRbMultiBlockStartCallback

公共回调例程的入口地址,在异步多块请求即将启动时调用。

NvMRbObserverCallback

回调例程的名称,该例程在异步请求中的块的作业处理终止时调用。与多块回调不同,如果配置了该回调,则此回调将为任何已配置的块(包括配置)调用ID块(启用动态配置时),不包括#0块。与单个块请求类似,它在块处理完成时提供特定于块的请求结果。如果您显式地想要指定不应该调用这样的回调例程,那么在这里输入NULL_PTR。

NvMRbRamInitCheck

此参数允许在重置发生时选择NvM模块的行为。

NVM_RB_RAM_INIT_CHECK_NONE:重置之后,NvM_ReadAll()读取适合的所有块。

NVM_RB_RAM_INIT_CHECK_QUICK:重置后,检查保存的区域是否丢失。如果没有丢失,则只有其RAM状态位无效的块在期间被来自Nv块的数据填充NvM_ReadAll ()。如果发现块的RAM状态位是有效的,那么NvM_ReadAll()将跳过该块。

NvMRbRemoveNonResistantBlocks

启用/禁用增强的动态配置。如果启用,如果配置ID与存储在内存媒体上的配置ID不同,配置为不抵抗SW变化的NV块(参数NvMResistantToChangedSw设置为false)将在NvM_ReadAll完成后直接从媒体中删除。然后,在服务任何其他NvM请求之前,立即将更改后的配置ID写入内存媒体。此功能仅在启用动态配置时可用。

NvMRbReqMonDevId

此参数定义用于请求监视的NVRAM块所在的设备。

NvMRbReqMonitor

该参数定义了NvM的请求监视功能。

NvMRbRuntimeRamBlockConfiguration

启用/禁用NV块长度和RAM块数据地址的运行时计算。当这个特性被启用时,NV块长度和RAM块数据地址可以在NvMRbNvBlockLengthString和NvMRam-中定义为C表达式BlockDataAddress。如果启用了此功能并对块使用显式同步,则必须由用户定义显式同步缓冲区。因此,必须使用配置参数NvMRbRuntimeRamBufferAddressStart和NvMRbRuntimeRamBufferAddressEnd。

NvMRbRuntimeRamBufferAddressEnd

结束地址在运行时计算NV块长度时用于显式同步的RAM缓冲区。

NvMRbRuntimeRamBufferAddressStart

起始地址在运行时计算NV块长度时用于显式同步的RAM缓冲区。

NvMRbSetWriteAllTriggerApi

启用/禁用NvM_Rb_SetWriteAllTrigger API。这个API允许触发WriteAll参与,而不受RAM块状态或块当前是否繁忙的影响。

NvMRbEraseNvBlock

要在NvM_EraseNvBlock中调用的函数的名称,而不是NvM自己的实现(如果设置了这个参数,则可以使用NvM_Rb_EraseNvBlockBase)。

NvMRbInvalidateNvBlock

在NvM_InvalidateNvBlock中调用的函数的名称,而不是NvM自己的实现(如果设置了该参数,则可以使用NvM_Rb_InvalidateNvBlockBase)。

NvMRbReadAll

在NvM_ReadAll中调用的函数的名称,而不是NvM自己的实现(如果设置了此参数,则可以使用NvM_Rb_ReadAllBase)。

NvMRbReadBlock

在NvM_ReadBlock主体中调用的函数名,而不是NvM自己的实现(如果设置了该参数,则可以使用NvM_Rb_ReadBlockBase)。

NvMRbRestoreBlockDefaults

在vM_RestoreBlockDefaults的主体中调用的函数名,而不是NvM自己的实现(如果设置了此参数,则可以使用NvM_Rb_RestoreBlockDefaultsBase)。

NvMRbWriteAll

在NvM_WriteAll的主体中调用的函数名,而不是NvM自己的实现(如果设置了此参数,则可以使用NvM_Rb_WriteAllBase)。

NvMRbWriteBlock

在NvM_WriteBlock主体中调用的函数名,而不是NvM自己的实现(如果设置了这个参数,则可以使用NvM_Rb_WriteBlockBase)。

自动配置生成

参考文档

[1] AUTOSAR_SWS_NVRAMManager.pdf

[2] RTA-BSWReferenceGuide.pdf

  • 14
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
AUTOSAR是一种用于汽车电子系统开发的标准,NVM(非易失性内存)是具体实施标准的一部分。NVM代码是用于控制和管理车辆的非易失性内存的代码NVM代码主要用于处理车辆的数据存储和加载功能。它包括操作车辆电子控制单元(ECU)的非易失性内存,如闪存、EEPROM等。这些内存用于存储关键的车辆数据,例如驾驶模式、行驶数据、故障记录等。 AUTOSARNVM代码详解包括以下几个方面的内容: 1. 数据存储与加载:NVM代码允许将数据存储到非易失性内存中,并在需要时加载到车辆控制系统中。它提供了一套API(应用程序接口),用于读写数据以及管理存储空间。开发人员可以使用这些API来存储和加载特定的数据。 2. 数据保护:NVM代码还负责保护车辆中存储的数据不被损坏或丢失。它提供了一些机制,如校验和、纠错码等,来防止数据损坏,并提供了一些备份策略,以防止数据丢失。 3. 数据管理:NVM代码提供了一些功能来管理非易失性内存的空间。它可以对存储空间进行分区,以便不同类型的数据可以被存储到特定的存储区域。此外,NVM代码还可以执行数据整理操作,以优化存储空间利用率。 4. 可靠性保证:NVM代码需要确保被存储的数据是可靠和一致的。它提供了一些机制,例如写操作的原子性和事务保护,以确保数据不会被破坏或篡改。 总而言之,AUTOSARNVM代码详解介绍了车辆非易失性内存管理的相关功能和原理。它为开发人员提供了一套API,以便有效地存储和加载车辆的关键数据,并保护数据不被损坏或丢失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大道生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值