• 315查看
  • 0回复

[Autosar] Autosar存储(上)NvM模块介绍

[复制链接]


该用户从未签到

发表于 25-4-2024 20:17:49 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


1 存储栈涉及模块介绍

Autosar存储(上)NvM模块介绍w1.jpg

Autosar存储模块框图
在autosar中存储栈涉及到的模块为NVRAM、MemIf、FEE、Flash和Ea、EEProm。其中NVRAM属于最上层,它负责向其他有存储需求的模块提供存储和读取数据的服务,它不关心下边的存储介质是用单片机自身的DFlash模拟的EEProm还是挂载在外部的EEProm来存储,而这个是由MemIf来完成的。MemIf是内存接口层,它通过对Fee或者EA的抽象从而向NvM模块提供一个统一的存储接口,它向NvM模块提供在标准线性地址空间的虚拟化的段。Fee负责对单片机DFlash模拟的EEProm进行管理,如考虑到DFLASH的擦写寿命,对其进行换页等策略。Flash就是单片机的DFlash了,这是真正存储数据的地方。DFlash擦除的单位为扇区(扇区大小根据单片机不同而不同,单位为kbytes),写数据的单位一般为字节。EA和EEP就是通过I2C或者SPI等外挂在MCU上的真正的EEProm。这种EEPRom相比较DFlash模拟的EEProm而言,可以按字节来擦写,但是会增加成本。

2 NvM介绍

2.1 初始化
NvM在上电后先在EcuM模块中进行初始化(NvM_Init),但是考虑到操作Flash比较费时,而车载对上电时间要求很严格,因此NvM_Init只做内部变量的初始化,初始化NVMRAM blcok的管理数据和读取所有的DFlash的数据(NvM_ReadAll)是在BswM模块完成的。
2.2 下电
在下电时通过调用NvM_WriteAll函数来存储所有RAM中的数据(已在<<EcuM功能分析及实现(中)之SHUTDOWN>>一文中对下电流程进行过分析)。
2.3 运行过程与APP的交互
与App的交互(App调用NvM_Write或者NvM_Read函数)支持两种模式:隐式同步(implicit synchronization)和显示同步(explicit synchronization).
2.3.1 隐式同步

Autosar存储(上)NvM模块介绍w2.jpg

隐式同步机制
写数据流程(读数据类似):1 应用向RAM中写入数据;2 应用调用NvM_WriteBlock/NvM_WritePRAMBlock函数来请求向NVm模块传输数据;3 从发出请求起到NvM模块通过NvM_MainFunction写入数据前,应用不能修改RAM的值;4 应用可以通过NvM_GetErrorStatus函数来轮询读/写的状态(在异步模式下可以通过回调函数获取结果状态);5 在NvM模块操作完成后,应用就可以更改RAM的值了。当多个应用使用同一个RAM块时,RAM中数据的一致性由应用来保证(NvM模块不负责)。在这种情况下,当一个应用向NvM模块发出读或者写的请求后,直到NvM操作完成前,其他应用也不能修改RAM中的值。
2.3.2 显示同步

Autosar存储(上)NvM模块介绍w3.jpg

写数据流程(读数据类似):1 应用向RAM中写入数据;2 应用调用NvM_WriteBlock/NvM_WritePRAMBlock函数来请求向NVm模块传输数据;3 在NvM模块调用NvMWriteRamBlockToNvM函数前应用都可以修改RAM中的数据;4 在NvM模块调用NvMWriteRamBlockToNvM函数时,应用在这个回调函数中把RAM Block中的数据拷贝到RAM Mirror中(用户来实现),这个过程需要保证即将写入NVM模块的RAM Mirror中的数据的一致性(这个过程可用resource来实现加锁,resource相关见<<AUTOSAR OS之Resource和Spinlock>>);5 拷贝数据完成后,应用就可以再次读写RAM Block中的值了;6 应用可以用轮询的方式获取NvM的操作结果(异步也可以用回调函数的方式通知APP操作结果)。从上可以看出,显式同步时应用知道什么时候可以改变RAM中的值,而隐式同步必须通过读取NvM的状态来得知什么时候可以使用RAM,但显示同步比隐式多使用了一块RAM(Mirror RAM).2.4 块编号的映射关系Flash EEPROM Emulation (FEE)模块向上提供一个32位的虚拟线性地址。这个32位的地址由两部分组成:16位的块号(block number,最多允许65535个块)和16位的块偏移(block offset,FeeBlockSize,每块最大达到64KByte),NvM模块又将上述16位的块编号(block number)进一步划分为: NV block的基编号(base number,长度由NVM_DATASET_SELECTION_BITS配置)和数据索引(data index,长度由NVM_DATASET_SELECTION_BITS配置)。2.4.1 NvM BlockNumber到Fee/EABlock Number引用autosar中的例子来说明计算关系,在例子中FEE/EA Block Number根据NvM中配置项的值和以下公式来计算。
Autosar存储(上)NvM模块介绍w4.jpg

假如NvMDatasetSelectionBits配置为2,那么NvMNvBlockBaseNumber的长度就为14位,因此NvMNvBlockBaseNumber的范围就是:0x1-0x3FFE,data index的范围为:0x0-0x3,FEE/EA BlockNumber的范围就是: 0x4-0xFFFB.
1 如果NvMBlockManagementType配置NATIVE,假如此时NvmBlockBaseNumber为2,那么它对应的FEE/EA Block Number就是8;

2 如果NvMBlockManagementType配置为NVM_BLOCK_REDUNDANT,假如NvmBlockBaseNumber为3,那么第一个NV块对应的FEE/EABlock Number为12,第二个NV块对应的FEE/EA Block Number为13;

3 如果NvMBlockManagementType配置为NVM_BLOCK_DATASET,假如NvmBlockBaseNumber为4,NvMNvBlockNum为3,NVblock #0 with data index 0对应的FEE/EA Block Number为16,NV block #1 with data index 1对应的FEE/EA Block Number为17,NV block #2 with data index 2对应的FEE/EA BlockNumber为18.
2.4.2 Fee Block Number到Flash的块(写单位)编号地址对齐的大小是由FeeVirtualPageSize选项配置的。举例说明虚拟地址到物理地址的映射。假如FeeVirtualPageSize配置为8,逻辑块1(Block1)的大小为32字节,逻辑块2(Block2)的大小为100字节,逻辑块3(block3)的大小为38字节。
Autosar存储(上)NvM模块介绍w5.jpg

虚拟内存与物理内存的分布对应图
1 那么对应的Flash中第一个块的大小为32字节,Flash中的logicalblock number 2、3、4都被第一个块所占用(32/8=4,占用了4个pages);2 第二个块实际上对应的block number就从5开始,长度为100byte,占用(ceil(100,8)),13个page,地址是8字节对齐的,因此13*8-100=4字节残留;3 同理,第三个逻辑块的block number从17开始,占5page,有2个bytes残留。

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 27-12-2024 11:05 , Processed in 0.250513 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.