1、概述
可变和持久是ECU内部数据的属性。实际上,在ECU运行时需要更改数据,并在整个电源周期中保持数据可用。这些数据需要存储在非易失性存储器中。非易失性存储器中的数据称为NV数据。NVRAM块是管理和存储NV数据块所需的整个结构。
下图显示了AUTOSAR中的内存堆栈:
从上图可以看出,存储栈的分层结构,FEE的含义是Flash模拟EEPROM,理论上实现虚拟理论上不限次数的擦写。
在实际项目里面FEE一般用芯片自带的DFLASH,例如英飞凌、NXP的芯片。
2、Block概念
Basic Storage Objects: 基本存储对象是NVRAM块中最小的实体。许多基本存储对象可用于构建NVRAM块。基本存储对象可以驻留在不同的内存位置(RAM、ROM、NV内存)。
2.1、RAM Block
RAM块是一个基本存储对象。它表示驻留在RAM中的NVRAM块的一部分。它用于保存实时数据。这是NVRAM块的可选部分。
2.2、ROM Block
ROM块是一个基本的存储对象。它表示驻留在ROM中的NVRAM块的一部分。ROM块也是NVRAM块的可选部分。
ROM Block的内容是持久化的,在程序执行过程中不能被修改,它驻留在ROM/Flash中。它用于在空的或损坏的NV块的情况下提供默认数据。
2.3、NV Block
NV块是一个基本存储对象。它表示NVRAM块的哪个部分驻留在NV内存中。NV块是NVRAM块的必备部分。
NV块的内容是持久的,但可以在程序执行期间修改存在于Flash中。它用于保存定期存储或应请求存储的实时数据。
2.4、Administrative Block
管理块是一个基本存储对象。它驻留在RAM中。管理块是NVRAM块的强制性部分。
它用于保存相应NVRAM块的属性/错误/状态信息以及块索引,特别是对于类型为Dataset的NVRAM块。
Administrative Block是NV RAM中必须使用的,包含了DataSet类型的NvM数据管理相关的NV RAM Block的属性、状态以及错误信息,能管理NV Block的写保护,以及上次数据操作的错误以及状态信息。
在空间分配中可以不用考虑NV RAM的内存分配地址。NV RAM数据被分配到一个SWC或者BSW模块。
3、NVM的块类型
NVM支持以下类型的NVRAM
块管理类型 | NV Blocks | RAM Blocks | ROM Blocks | Administrative Blocks |
Native NVRAM block | 1 | 1 | 0..1 | 1 |
Redundant NVRAM block | 2 | 1 | 0..1 | 1 |
Dataset NVRAM block | 1..NvMNvBlockNum | 1 | 0..NvMRomBlockNum | 1 |
3.1、Native NVRAM Block
Native NVRAM块是最简单的块管理块,它允许以最小的开销从NV内存进行存储或检索。
NV Blocks: 1
RAM Blocks: 1
ROM Blocks: 0..1
Administrative Blocks: 1
3.2、Redundant NVRAM block
除了Native NVRAM块之外,冗余NVRAM块还提供了增强的容错性、可靠性和可用性。它增加了对数据损坏的抵抗力。
NV Blocks: 2
RAM Blocks: 1
ROM Blocks: 0..1
Administrative Blocks: 1
3.3、Dataset NVRAM block
Dataset NVRAM块是一个大小相等的数据块数组。应用程序一次只能访问其中一个数据块。
NV Blocks: 1..NvMNvBlockNum
RAM Blocks: 1
ROM Blocks: 0..NvMRomBlockNum
Administrative Blocks: 1
4、数据恢复
NvM模块应提供隐式和显式恢复技术,在NV块数据不一致不可恢复的情况下,通过校验和计算将ROM数据恢复到相应的RAM块。恢复可以在启动(NVM_ReadAll)、NVMReadBlock和NVM_ReadPRAMBlock时提供,当用户配置ROM块时,通过配置以下两个参数之一:
- NvMRomBlockDataAddress
- NvMInitBlockCallback
ROM块的地址可以是链接器符号或十六进制地址。
5、存储场景:循环存储、立即存储、关机存储
存储数据有不同的类型,如:循环存储、立即存储或关机存储。
5.1、循环存储:Store cyclically
在这种情况下,RTE处理的定时事件会周期性触发NVM将RAM块写入NVRAM块。因此,用户需要启用选项storeCyclic并指定写入的时间段。要做到这一点,用户可以配置NvBlockNeeds配置如下:
WritingFrequency参数可以根据需求进行优化。
5.2、下电存储:Store at shutdown
在这种情况下,RTE调用NVM模块的NvM_WriteBlock函数来写块。此操作可以通过任务激活或请求上下文来实现。对于配置,用户可以用以下配置配置NvBlockNeeds:
确保在BSWM配置中可用NvM_WriteAll操作
5.3、立即存储:Store immediately
在这种情况下,RTE调用NVM模块的NvM_WriteBlock函数来写块。此操作可以通过任务激活或请求上下文来实现。对于配置,用户可以用以下配置配置NvBlockNeeds:
6、ISOLAR-AB整体配置分析
从上到下配置NVM的思维导图如下所示
6.1、ASW配置
要为NVM配置SWC,用户需要首先创建NVM SWC(具有必要的配置,例如其数据类型,内部行为,可运行程序,事件…),配置每实例内存(PIM -是属于SWC的持久存储,它是SWC的私有内存,因此只有可运行程序能够访问该SWC)和NvBlockNeeds(包含SWC的NV内存信息)。
PIM:PreInstanceMemory,内存实例化。
在此基础上,用户可以按照以下步骤操作:
1、创建一个SWC,例如ASW_NVM
2、创建Internal behavior
3、创建SWC的私有内存PIM,选择正确的数据类型
4、创建NvBlockNeeds。NvBlockNeeds的配置将由NVRAM Manager参考。用户需要考虑可以使用哪种存储场景-循环,立即,下电等
6.2、BSW配置
在本节中,用户通常会按照以下步骤配置BSW中的模块:
1)使用工具的RTA-BSW configuration Generation选项生成Mem栈的基本配置
2)根据用户具体需求,进一步手动配置内存栈(NVM、MemIf、Fee)
3)配置EcuM、BswM支持内存栈特性
4)使用RTA-BSW代码生成选项生成BSW代码
6.2.1、NVM配置
生成BSW配置后的NVM基本配置如下:
首先,建议用户重命名块,使其在NVM和SWC之间可跟踪。
前两个块是默认生成的,不应该被删除。根据具体需求,用户可以使用合适的参数手动创建其他NVM块。用户需要考虑的参数有:
-
NvMBlockCrcType: CRC校验类型,目前BSW只支持CRC 16位
-
NvMBlockJobPriority。当前BSW支持两种优先级:
0:立即优先级:块既没有多块读操作,也没有多块写操作
1:标准优先级:如果NvMSeclectBlockForReadAll为true,则块具有多块读特性;如果NvMSelectBlockForWriteAll为true,则块具有多块写特性
-
NvMBlockManagementType。NVRAM块的类型,Dataset, Native, 或者Redundant。
-
NvMRamBlockDataAddress:定义永久RAM块数据的起始地址,用户可以输入十六进制地址,一个链接符。如果用户希望指定该块不使用永久块,则不输入任何内容。
配置Native块的例子如下:
然后配置NVM的常用配置,注意NvMMainFunctionCycleTime,它定义了Mainfunction的循环周期。
6.2.2、MemIf配置
MemIf中的配置很简单,如下所示。
6.2.3、FEE配置
FEE一般配置基本如下:
注:参数FeeRbMachineType允许用户选择微控制器的类型,然后将自动生成Fee部分信息。但是,如果不支持微控制器的类型或用户想要定义扇区,他们可以如下配置FeerbSectorTable。
用户不需要添加feeblockconfiguration,因为当用户执行BSW代码生成时,RTA-BSW会自动将块信息从NVM转发给Fee。
6.3、RTE配置
生成BSW代码后,将生成NVM的服务软件组件。因此,用户将执行主要步骤:
1)连接NVM应用SWC与NVM业务组件的兼容端口。
2)将内存服务可运行项映射到操作系统任务。
3)生成RTE有关详情。
用户可按以下步骤操作:
1)创建具有正确接口的端口,RPort意味着应用程序将调用服务软件组件中PPort提供的服务。通过双击SWC,将出现下面的窗口,并允许用户创建端口。
2、创建Functions
3、讲服务点插进Functions以便RTE生成
4、创建Events
5、为NVM的SWCs添加组件原型
6、匹配SWC运行到正确的SWC
7、在AR资源管理器中打开Composition连接swc的端口,将具有相同接口的端口连接在一起。
8、在Manual Connection Editor中选择源组件和目标组件,然后选择用户源组件和目标组件之间使用相同接口连接端口。
9、将SWC的组件原型添加到ECU中,右键单击“System”,打开SWC to ECU Mapping Editor。
10、右击System,选择Create ECUExtract,点击完成。
11、将任务映射到OS任务,右击ECU extranct打开Open Editor
12、生成RTE
用户可以参考的其他命令如下:
-nts——samples=memmap -ur=2——os-define-osenv=RTAOS40——exclusive-areaoptimization=disable——os-output-param=all——use-partition-sections=on——deviate-bsw-anypartition=1——deviate-split-
6.4、EcuM配置
EcuM负责初始化Flash模块,因为Flash需要先初始化启动BSW模块。因此,将Fls添加到EcuMDriverInitItem中。
6.5、BswM配置
而Fls由EcuM初始化。NVM和Fee由BswM初始化。用户可以添加thel初始化NVM的动作和费用到动作列表BswMStartupTwo。
在此之前,需要创建相应的动作并映射各自的call out。
NVM在启动阶段执行NvMReadAll动作,在ECU关闭时执行NvMWriteAll动作。这可以通过在动作列表BswMSwitchShutdown中添加动作NvMReadAll和动作nvmwriteall来实现。
NvMWriteAll
6.6、CRC配置
NvM模块使用CRC生成例程(8/16/32位)作为可配置选项来检查和生成NVRAM块的CRC。
在配置NVM时,如果用户开启了CRC校验功能,则用户需要配置CRC校验模块,使BSW能够生成CRC接口的实现。例如,在NVM配置中,使用CRC16,则对应的类型配置如下:
如果CRC模块不存在,用户可以手动创建该模块。