2. AUTOSAR基础
在AUTOSAR工程中,Flash驱动并不是一个孤立的模块,它被严格地放置在分层架构的底层,并通过标准接口向上层提供服务。理解Flash驱动的位置关系,是后续配置Fee、Fls、MemIf以及诊断刷写功能的前提。本节从AUTOSAR分层架构出发,逐层定位Flash驱动,并说明它与BSW、RTE、MCAL、ECU抽象层之间的调用与依赖关系。
一、AUTOSAR分层架构总览
AUTOSAR经典平台(Classic Platform)采用自上而下的分层结构,核心思想是“上层不依赖下层实现,只依赖标准接口”。从高到低依次为:应用软件层(SWC)、运行时环境(RTE)、基础软件层(BSW)。BSW内部又细分为服务层、ECU抽象层、微控制器抽象层(MCAL)和复杂驱动(CDD)。
Flash驱动位于MCAL层,属于微控制器抽象层的一部分。它直接操作芯片内部的Flash控制器寄存器,负责擦除、写入、读取等最底层操作。在它之上,ECU抽象层中的存储器抽象接口(MemIf)和Flash EEPROM仿真模块(Fee)负责把不同存储介质统一成标准接口,再向上供NvM等服务层模块调用。
二、Flash驱动在MCAL中的定位
MCAL是AUTOSAR中唯一允许直接访问微控制器寄存器的层。Flash驱动(Fls)作为MCAL模块之一,承担以下职责:
- 接收上层下发的擦除、写入、读取请求,并转换为对Flash控制器的寄存器操作;
- 管理Flash的扇区(Sector)划分、页(Page)大小、擦除粒度等硬件相关参数;
- 处理Flash操作期间的忙等待、超时检测和错误状态上报;
- 提供异步接口,允许上层在擦写期间继续执行其他任务。
需要特别注意的是,Fls只负责“物理层”的读写擦,它不理解数据的逻辑含义,也不负责地址映射和磨损均衡。这些功能由Fee模块完成。
三、ECU抽象层与MemIf的桥梁作用
ECU抽象层位于MCAL之上,目的是把不同ECU硬件平台的差异屏蔽掉。在存储方向上,核心模块是MemIf(Memory Abstraction Interface)。MemIf本身不实现具体存储操作,而是提供统一的下游接口,把请求路由到Fee或Ea。
Fee(Flash EEPROM Emulation)是Flash驱动最重要的上层用户。它把Flash模拟成EEPROM的行为,提供逻辑块(Block)管理、地址映射、磨损均衡和掉电保护。Fee再向上对接NvM,NvM负责非易失数据的组织、校验和冗余管理。
四、典型配置参数与代码示例
在工程配置中,Fls模块的关键参数通常包括扇区起始地址、扇区大小、页大小、最大读取字节数等。以下是一个简化的Fls配置片段示意:
FlsConfigSet {
FlsSectorStartAddress = 0x08040000; /* Flash扇区起始地址 */
FlsSectorSize = 0x00010000; /* 扇区大小 64KB */
FlsPageSize = 0x00000020; /* 页大小 32字节 */
FlsMaxReadNormalMode = 64; /* 单次最大读取字节数 */
FlsMaxWriteNormalMode = 32; /* 单次最大写入字节数 */
FlsAcLoadOnJobStart = TRUE; /* 作业开始时加载访问代码 */
FlsCallCycle = 1; /* 主函数调用周期 */
}
Fee模块则配置逻辑块数量、块大小、Flash扇区分配等。NvM配置块ID、块长度、CRC类型和默认值。三者配置必须一致,否则会出现数据错位或校验失败。
五、案例场景:诊断刷写中的Flash驱动
在UDS诊断刷写(0x34/0x36/0x37服务)场景中,数据流如下:诊断仪通过CAN发送刷写数据,Dcm接收后交给Flash引导加载程序(Bootloader)。Bootloader通常直接调用Fls驱动完成擦除和写入,而不经过Fee和NvM,因为刷写的是应用程序代码区,不是非易失数据区。
而在应用运行阶段,标定数据、故障码、配置参数等需要掉电保存的数据,则走NvM → Fee → MemIf → Fls的完整路径。两条路径共用同一个Fls驱动,但调用上下文和地址区域不同。
| 层级 | 模块 | 职责 | 与Flash驱动的关系 |
|---|---|---|---|
| 服务层 | NvM | 非易失数据组织、校验、冗余 | 间接调用,经Fee/MemIf |
| ECU抽象层 | Fee | Flash模拟EEPROM、磨损均衡 | 直接调用MemIf,最终到Fls |
| ECU抽象层 | MemIf | 统一存储接口路由 | 把请求转发给Fls |
| MCAL | Fls | Flash擦除、写入、读取 | 自身即Flash驱动 |
| 硬件 | Flash控制器 | 执行物理擦写操作 | 被Fls直接操作 |
六、常见误区与复盘
误区二:把Fee和Fls混为一谈。Fee是逻辑层,负责块管理和磨损均衡;Fls是物理层,只负责擦写。两者配置必须匹配。
误区三:忽略MemIf的路由作用。当系统同时存在Fee和Ea时,MemIf负责根据设备索引选择正确的下层模块。
总结来说,Flash驱动位于AUTOSAR架构的MCAL层,是直接操作Flash硬件的物理驱动。它通过MemIf和Fee向上提供服务,最终支撑NvM和诊断刷写功能。理解这一位置关系,是后续进行Fls、Fee、NvM配置和调试的基础。