AUTOSAR Memory Access 模块详解
目录
- 概述
1.1. Memory Access模块简介
1.2. 支持的用例 - 架构设计
2.1. 模块定位
2.2. 核心组件
2.3. 内存地址转换机制 - 功能特性
3.1. 作业管理
3.2. 内存访问协调
3.3. 硬件特定服务
3.4. 通用锁定机制
3.5. 动态内存驱动程序处理 - API概览
4.1. 同步与异步函数
4.2. 作业处理流程 - 配置参数
5.1. 地址区域配置
5.2. 子地址区域配置 - 总结
1. 概述
1.1. Memory Access模块简介
AUTOSAR Memory Access (MemAcc) 模块是AUTOSAR软件架构中的基础软件模块,为不同类型的存储设备提供统一的访问接口。该模块位于存储硬件抽象层,负责协调不同上层模块对共享内存资源的访问,同时抽象底层硬件细节,提供一个与硬件无关的内存访问API。
MemAcc模块的主要特点是将内存访问功能分为硬件无关部分(MemAcc)和硬件相关部分(Mem驱动程序),这使得上层应用能够在不修改代码的情况下访问不同类型的存储设备,如闪存、EEPROM、RAM或相变存储器。
图1.1:AUTOSAR Memory Access 架构概览,展示了MemAcc模块在整个存储访问栈中的位置以及与其他模块的交互关系
1.2. 支持的用例
MemAcc模块与Mem驱动程序的组合支持以下主要用例:
- 块基础非易失性内存访问:通过NvM(非易失性内存管理器)和Fee(闪存EEPROM仿真)或Ea(EEPROM抽象)实现数据存储
- 地址基础内存访问:供BndM(批量非易失性数据管理器)或闪存引导加载程序使用
- OTA软件更新:支持无线固件升级
这些用例可以单独使用,也可以组合使用。值得注意的是,MemAcc模块和Mem驱动程序涵盖了Fls(闪存服务)和Eep(EEPROM服务)的用例,因此这两个模块未来将被MemAcc替代。
2. 架构设计
2.1. 模块定位
MemAcc模块位于AUTOSAR架构中的存储抽象层,连接上层应用模块(如NVM、Fee/Ea、BndM、OTA客户端)和底层硬件相关驱动(如MEM_DFLS
、MEM_EEP
、MEM_PFLS
、MEM_EXFLS
)。这种分层架构实现了关注点分离,使上层应用无需关心底层存储设备的具体实现细节。
2.2. 核心组件
MemAcc模块的核心组件包括:
- 内存地址转换:将逻辑地址映射到物理内存设备
- 内存访问协调:管理对共享内存资源的并发访问
- 作业管理:处理异步内存操作请求的调度和状态追踪
- 硬件特定服务:支持访问底层Mem驱动程序的特殊功能
- 通用锁定机制:允许上层应用锁定特定内存区域以进行直接访问
- 动态内存驱动程序处理:支持动态激活和使用Mem驱动程序
2.3. 内存地址转换机制
MemAcc模块实现了从逻辑地址空间到物理内存设备的映射,这是其核心功能之一。这种映射机制使上层应用能够使用统一的逻辑地址空间访问不同类型的物理存储设备,甚至支持跨设备边界的访问请求。
图2.1:AUTOSAR Memory Access 内存地址转换机制,展示了逻辑地址空间与物理存储设备之间的映射关系
地址转换机制基于以下主要概念:
- 地址区域(Address Area):逻辑地址空间中的连续内存区域,每个地址区域只分配给一个上层模块
- 子地址区域(Sub Address Area):映射到一个内存设备的扇区批,每个子地址区域内只允许统一的扇区大小
- 扇区批(Sector Batch):具有统一大小的连续扇区的逻辑聚合,扇区是最小的可擦除内存单元
这种分层映射机制允许MemAcc模块处理跨物理设备边界的内存访问请求,同时考虑不同存储技术的物理分段要求(如页面大小、扇区大小等)。
3. 功能特性
3.1. 作业管理
MemAcc模块提供了一套完善的作业管理机制,用于处理异步内存操作请求(如读取、写入、擦除等)。作业管理机制包括作业状态跟踪、作业结果报告和作业结束通知功能。
图3.1:AUTOSAR Memory Access 作业管理与处理流程,展示了作业状态转换和结果处理机制
作业管理的主要特性:
- 作业状态:作业可处于
MEMACC_JOB_IDLE
(空闲)或MEMACC_JOB_PENDING
(处理中)状态 - 作业结果:提供详细的结果代码,如
MEMACC_MEM_OK
(成功)、MEMACC_MEM_CANCELED
(取消)、MEMACC_MEM_INCONSISTENT
(不一致)、MEMACC_MEM_ECC_CORRECTED
(ECC错误已修正)、MEMACC_MEM_ECC_UNCORRECTED
(无法修正的ECC错误)和MEMACC_MEM_FAILED
(失败) - 作业通知:可配置作业结束通知回调函数,通知上层模块作业完成
MemAcc模块规定每个地址区域同时只允许一个作业请求,这简化了作业管理,因为一个地址区域只能分配给一个上层模块,且上层模块通常按顺序发出作业请求。
3.2. 内存访问协调
MemAcc模块负责协调对共享内存资源的访问,确保不同上层模块的内存访问请求不会相互冲突。这种协调特别重要,因为某些内存设备(如闪存或EEPROM)在编程模式下不支持并发读取访问。
访问协调的主要特性:
- 优先级管理:基于
MemAccAddressAreaPriority
配置,优先处理来自特定上层模块的内存访问请求 - 资源冲突处理:在硬件资源冲突时,内存栈仍接受访问请求,并在资源可用时处理该请求
- 暂停/恢复机制:如果存储硬件支持暂停/恢复功能,则利用
Mem_Suspend
和Mem_Resume
服务实现优先级操作 - 分页/分段调度:如果存储硬件不支持暂停/恢复功能,则在页/页批或扇区/扇区批基础上实现优先级调度
3.3. 硬件特定服务
为了支持内存设备特定功能,MemAcc模块提供了一个通用API(MemAcc_HwSpecificService
)来调用硬件特定的Mem驱动程序服务。每个Mem驱动程序可以有多个硬件特定服务,通过hwServiceId
参数选择。
这种设计使MemAcc模块能够保持硬件无关性,同时允许上层应用访问底层硬件的特殊功能。
3.4. 通用锁定机制
MemAcc模块提供了一个通用锁定API,用于支持上层模块(如BndM)直接访问内存设备。锁定机制允许应用程序或上层模块在特定条件下(如Flash加载器或直接硬件访问)绕过MemAcc的协调功能。
锁定API包括MemAcc_RequestLock
和MemAcc_ReleaseLock
函数,应用程序或上层模块负责维护锁定状态并在直接内存访问完成后释放锁定。
3.5. 动态内存驱动程序处理
对于安全相关用例,MemAcc模块支持动态内存驱动程序处理。在这些用例中,Mem驱动程序编译为单独的二进制文件,包含一个函数指针表以向MemAcc模块公开服务函数。这种机制防止了意外覆盖内存区域,提高了系统安全性。
MemAcc模块的动态内存驱动程序处理包括:
- 动态激活:使用
MemAcc_ActivateMem
在运行时激活内存驱动程序 - 服务调用:通过函数指针表调用Mem驱动程序的服务函数
4. API概览
4.1. 同步与异步函数
MemAcc模块提供了一组丰富的API,包括同步函数和异步函数,用于初始化、配置和执行内存操作。
图4.1:AUTOSAR Memory Access 模块API与数据结构,展示了模块的主要函数和数据类型
同步函数包括:
MemAcc_Init
:初始化MemAcc模块MemAcc_DeInit
:反初始化MemAcc模块MemAcc_GetVersionInfo
:获取版本信息MemAcc_GetJobResult
:获取作业结果MemAcc_GetJobStatus
:获取作业状态MemAcc_GetMemoryInfo
:获取内存信息MemAcc_GetProcessedLength
:获取已处理长度MemAcc_GetJobInfo
:获取作业信息MemAcc_ActivateMem
:激活Mem驱动程序MemAcc_DeactivateMem
:停用Mem驱动程序
异步函数包括:
MemAcc_Cancel
:取消操作MemAcc_Read
:读取内存MemAcc_Write
:写入内存MemAcc_Erase
:擦除内存MemAcc_Compare
:比较内存MemAcc_BlankCheck
:空白检查MemAcc_HwSpecificService
:执行硬件特定服务MemAcc_RequestLock
:请求锁定MemAcc_ReleaseLock
:释放锁定
此外,MemAcc模块还提供了调度函数 MemAcc_MainFunction
,用于处理队列中的作业请求、更新作业状态和结果,并在配置了作业结束通知函数的情况下调用该通知函数。
4.2. 作业处理流程
MemAcc模块的作业处理涉及一系列步骤,从作业请求到作业完成的整个生命周期。
图4.2:AUTOSAR Memory Access 作业处理序列,展示了从上层模块发起请求到作业完成的完整流程
作业处理的主要步骤包括:
- 初始化:上层模块调用
MemAcc_Init
初始化MemAcc模块 - 作业请求:上层模块调用异步函数(如
MemAcc_Write
)发起作业请求 - 参数验证:MemAcc模块验证参数并检查地址区域是否空闲
- 作业队列:如果地址区域空闲,MemAcc模块将作业请求加入队列
- 作业处理:调度器调用
MemAcc_MainFunction
处理队列中的作业 - 地址转换:MemAcc模块将逻辑地址转换为物理地址,并分割跨设备边界的访问
- Mem驱动程序调用:MemAcc模块调用相应的Mem驱动程序函数
- 作业完成:作业完成后,MemAcc模块更新作业状态和结果,并通知上层模块(如果配置了通知函数)
- 状态查询:上层模块可以调用
MemAcc_GetJobStatus
、MemAcc_GetJobResult
等函数查询作业状态和结果
5. 配置参数
MemAcc模块提供了一组配置参数,用于定义内存区域的映射关系和模块行为。
图5.1:AUTOSAR Memory Access 模块配置结构,展示了主要的配置参数和它们之间的关系
5.1. 地址区域配置
地址区域配置(MemAccAddressAreaConfiguration
)定义了逻辑地址空间中的连续内存区域,每个地址区域只分配给一个上层模块。主要参数包括:
MemAccAddressAreaId
:地址区域标识符(0-255)MemAccAddressAreaLowerAddress
:地址区域下限地址MemAccAddressAreaUpperAddress
:地址区域上限地址MemAccAddressAreaPriority
:地址区域优先级(0-255)MemAccAddressAreaDefaultHwId
:默认硬件标识符MemAccAddressAreaUserModuleId
:用户模块标识符MemAccJobEndNotificationName
:作业结束通知函数名称
5.2. 子地址区域配置
子地址区域配置(MemAccSubAddressAreaConfiguration
)定义了映射到物理内存设备的扇区批。主要参数包括:
MemAccSubAddressAreaId
:子地址区域标识符(0-65535)MemAccSubAddressAreaLowerAddress
:子地址区域下限地址MemAccSubAddressAreaUpperAddress
:子地址区域上限地址MemAccMemDeviceRef
:内存设备引用MemAccMemInstanceRef
:内存实例引用MemAccSubAddressAreaPhysicalStartAddress
:物理起始地址MemAccUseEraseBurst
:是否使用擦除突发模式MemAccUseReadBurst
:是否使用读取突发模式MemAccUseWriteBurst
:是否使用写入突发模式MemAccCalcCRC
:是否计算CRCMemAccVerifyOnWrite
:是否在写入时验证MemAccVerifyOnRead
:是否在读取时验证
6. 总结
AUTOSAR Memory Access模块是AUTOSAR软件架构中的关键组件,为不同类型的存储设备提供统一的访问接口。通过将内存访问功能分为硬件无关部分和硬件相关部分,MemAcc模块实现了以下主要目标:
- 硬件抽象:隐藏底层存储设备的具体实现细节,提供一个与硬件无关的内存访问API
- 访问协调:管理对共享内存资源的并发访问,避免资源冲突
- 地址转换:实现从逻辑地址空间到物理内存设备的映射,支持跨设备边界的访问
- 作业管理:提供异步作业处理机制,包括作业状态跟踪、结果报告和通知功能
- 灵活配置:通过丰富的配置参数,适应不同的系统需求和存储设备类型
MemAcc模块与Mem驱动程序的组合支持多种用例,包括块基础非易失性内存访问、地址基础内存访问和OTA软件更新。这种设计不仅提高了系统的可移植性和灵活性,还为未来的存储技术发展提供了良好的兼容性。