1.定义
"NVM模块旨在从应用程序中抽象化非易失性存储器的使用,例如EEPROM或Flash。所有对非易失性存储器的访问都是基于块的。为避免冲突和数据不一致,NVM应该是唯一可以访问非易失性存储器的模块。"
"NVM模块通过访问MEMIF(内存抽象接口模块)来抽象化FEE(Flash EEPROM模拟)和EA(EEPROM抽象)模块,因此NVM模块是与硬件无关的。FEE和EA模块用于抽象化对Flash或EEPROM驱动程序的访问。为了选择适当的设备(FEE或EA),NVM使用由MEMIF提供的句柄。"
理解:
1.NVM模块的目的是隐藏应用程序对非易失性储存其的操作细节,使其能够独立于底层硬件,成为一个驱动。(NVM是BSW,MEMIF是MCal?)
2.NVM模块通过访问MEMIF(Memory Abstraction Interface)来实现对储存器的访问抽象化,MEMIF模块抽象化了FEE(Flash EEPROM Emulation)和EA(EEprom Abstraction)模块。
2.NVM模块的结构
App通常不会直接访问BSW模块,正常通过RTE来访问BSW接口。
3.Functional Description
3.1Safety Features
3.1.1 Block ID Check
Nvm会检查当前处理Nvm块的数据,Nvm会计算Nvm Block ID、Data index和实际数据的CRC。
3.1.2 Automatic Block Length
这个没看懂。
3.2 Initialization
在NVM模块被使用前需要初始化,NVM所依赖的模块需要在NVM初始化之前初始化。
建议的初始化顺序:
1.NV device driver for internal devices(FLS/EEP)
2.Low level driver that an external NV device driver might depend on(e.g. DIO,SPI)
3.Drivers for external NV device(e.g. external EEP or FLS)
4.NV device abstraction modules(EA/FEE)
5.Non-Volatile Manager(NVM)
Nvm的初始化包括2步:1)Nvm_Init() 2.NvM_ReadAll()
3.2.1 Start-up
NVRAM管理器的基本初始化是由请求NvM_Init()完成的。例如,它应由ECU状态管理器专门调用。由于有关ECU启动时间的严格约束,NvM_Init()请求不包含已配置NVRAM块的基本初始化。NvM_Init()请求重置NVM的内部变量,如队列和状态机。(不知道在讲什么)
3.2.2 Initialization of the Data Blocks
单个块的初始化通常也由ECU状态管理器通过调用NvM_ReadAll()来启动。所有没有有效RAM数据的块,并有SelectBlockForReadAll设置将从NV内存或ROM(如果可用)重新加载。所有其他块不会被重新加载,它们必须由应用程序调用NvM_ReadBlock()手动加载,但它们将被初始化,例如它们的写保护和状态。
3.3 Main Function
3.3.1 Hardware Independence
NVRAM管理器独立于底层内存硬件。它访问MEMIF(内存抽象接口)的API。MEMIF为NVM抽象了模块FEE (Flash EEPROM Emulation)和EA (EEPROM Abstraction)。FEE和EA用于在Flash或EEPROM设备中存储数据块。NVM使用MEMIF提供的设备句柄(设备ID)来选择将块存储在哪个FEE或EA实例中。
3.3.2 Synchronous Requests
NVM API服务分为同步请求和异步请求。
同步服务在被调用时立即执行。它们在调用任务的上下文中执行。这意味着,该行为取决于调用任务的特征,而不是NVM。例如,如果调用任务是一个非抢占任务,则同步NVM请求将被执行,直到它完成。否则,如果调用任务为抢占任务,则同步NVM请求可能会被其他优先级更高的任务抢占。
这一章目前不太用了解
3.3.3 Asynchronous Requests
这一章目前不太用了解
3.3.4 API Configuration Classes and additional API Services
根据客户的需求,可以定制NVM的范围。指定了三个配置类来提供不同数量的NVM功能/函数:
API configuration class 1:使用了一组最少的API服务。没有实现排队和作业优先级。以下功能可用:
> NvM_Init()
> NvM_GetErrorStatus()
> NvM_SetRamBlockStatus()
> NvM_ReadAll()
> NvM_WriteAll()
> NvM_CancelWriteAll()
API configuration class 2:中间API服务集。实现了排队和作业优先级。根据API配置类1,还提供以下功能:
> NvM_SetDataIndex()
> NvM_GetDataIndex()
> NvM_ReadBlock()
> NvM_WriteBlock()
> NvM_RestoreBlockDefaults()
> NvM_CancelJobs()
API configuration class 3:所有API服务可用。以下功能可用于API配置类2:
> NvM_SetBlockProtection()
> NvM_EraseNvBlock()
> NvM_InvalidateNvBlock()
NvM_SetRamBlockStatus()和NvM_GetVersionInfo()函数可以通过配置工具另外启用/禁用。函数NvM_SetBlockLockStatus()总是独立于API配置类而可用。
3.3.5 Block Handling
3.3.5.1 NV Blocks and Block Handles
打算存储在NV内存中的每个应用程序数据包被视为一个块。对于每个块使用一个唯一的块句柄(Block ID)。对于应用程序,(RAM)块只是与该块关联的变量之一。要将该变量写入NV内存,它调用NvM_WriteBlock()服务,并使用映射到该变量的块句柄。块句柄名称在NVM的配置过程中给出。它们通过包含NvM.h发布到应用程序。
``````
3.3.12 Erase and Invalidate
有两个服务指定用于使NV块不可读:NvM_EraseNvBlock()和NvM_InvalidateNvBlock()。
使块失效比擦除块要快得多,因为只有状态信息会失效
``````
4.Integration(集成)
本章给出了MICROSAR NVM集成到ECU应用环境中的必要信息。
4.1 交付范围
NVM的交付包含5.1.1和5.1.2章中描述的文件:
4.1.1 Static File
File Name | Description |
NvM.h | 该文件不能被修改。定义NVM的接口,只有这个文件可以被app include |
NvM_Cbk.h | 该文件不能被用户修改。 包含EEPROM驱动程序调用的回调函数的声明 |
NvM_Types.h | 该文件不能被用户修改。 定义NVM使用的一般类型。 |
NvM.c / NvM.lib/NvM.a | 该文件不能被用户修改。 NVM的实现,作为对象库交付。 |
NvM_Act / NvM_Crc / NvM_JobProc / NvM_Qry / NvM_Queue.c *.h | 这些是NvM内部使用的文件。 如果NVM作为对象交付,那么这些部分是NVM .lib的内容。 |
4.1.2 Dynamic Files
动态文件由配置工具达芬奇配置器生成。请勿手动修改。
File Name | Description |
NvM_Cfg.c | 它包含NVM的配置参数,可以在编译NVM .c后修改。 |
NvM_Cfg.h | NVM的公共配置参数。它们(或可能)对NvM的用户也很重要,或者它们可能会影响NvM的API。它还包含NvM及其用户使用的公共类型和符号声明。 |
NvM_PrivateCfg.h | 包含参数以及类型和符号声明,它们是NvM私有的,也就是说,它们只影响内部行为。该文件旨在仅由NvM的源代码包含。 |
4.2 Critical Sections(临界区)
为了保护关键代码免受中断,NvM使用以下关键区:
> NvM_NVM_EXCLUSIVE_AREA_0
4.3 Include Structure(包含结构)
下图说明了包含的文件的层次结构。它还表明Std_Types.h和Nvm.h必须包含在应用程序中。