AUTOSAR进阶图解==>AUTOSAR_SRS_FlashTest
AUTOSAR 闪存测试模块详解
基于AUTOSAR 4.4.0标准 - Flash Test模块需求分析
目录
- 概述
- 模块架构
2.1 Flash Test模块架构图
2.2 组件说明 - 测试流程
3.1 Flash Test测试流程序列图
3.2 前台测试与后台测试对比 - 状态管理
4.1 Flash Test状态转换图
4.2 状态详解 - API接口
- 配置参数
- 错误处理
- 总结
1. 概述
Flash Test模块是AUTOSAR标准中用于测试不变内存的服务模块。不变内存可以是程序闪存、程序SRAM、锁定缓存和ROM等,这些内存要么嵌入在微控制器中,要么通过内存映射连接到微控制器。
Flash Test服务可以在MCU初始化后的任何时间执行,由用户根据系统安全需求选择合适的测试算法和执行位置。测试服务本身依赖于系统的存储概念,因此测试算法的可用性取决于硬件特性和AUTOSAR ECU的特定需求。
2. 模块架构
2.1 Flash Test模块架构图
2.2 组件说明
组件 Flash Test
- 职责: 提供测试不变内存的算法,包括程序闪存、程序SRAM、锁定缓存和ROM
- 功能点:
- 提供前台测试和后台测试两种执行模式
- 支持存储签名计算和验证
- 根据测试结果向DEM报告诊断事件
- 在开发阶段检测到错误时向Det报告
组件 应用软件组件
- 职责: 调用Flash Test模块提供的服务
- 功能点:
- 通过RTE请求Flash Test执行测试
- 获取测试结果和状态
组件 诊断事件管理器 (DEM)
- 职责: 处理Flash Test报告的诊断事件
- 功能点:
- 接收并处理Flash Test检测到的内存错误
- 存储错误信息供诊断工具访问
组件 开发错误跟踪器 (Det)
- 职责: 在开发阶段跟踪Flash Test检测到的错误
- 功能点:
- 接收并记录API使用错误
- 帮助开发人员识别问题
组件 Flash驱动
- 职责: 提供对闪存存储器的访问
- 功能点:
- 允许Flash Test读取闪存内容
- 实现底层的闪存访问操作
组件 MCU驱动
- 职责: 提供对MCU特性的访问
- 功能点:
- 提供硬件相关的功能支持
- 辅助Flash Test执行特定的硬件操作
组件 内存服务 (MemService)
- 职责: 提供通用内存操作服务
- 功能点:
- 支持存储签名计算
- 提供内存内容验证功能
组件 运行时环境 (RTE)
- 职责: 作为应用软件组件和基础软件之间的中间层
- 功能点:
- 转发应用软件的调用到Flash Test
- 提供标准化的接口
关系 应用软件组件–>RTE
- 应用软件组件通过RTE提供的标准化接口调用Flash Test的服务,RTE作为应用层和基础软件层之间的抽象层
关系 RTE–>Flash Test
- RTE将应用软件的请求转发给Flash Test模块,并将Flash Test的响应返回给应用软件
关系 Flash Test–>Flash驱动
- Flash Test需要读取Flash内容进行测试,通过Flash驱动提供的接口实现对Flash的访问
关系 Flash Test–>Det
- 当Flash Test检测到开发错误(如参数错误、未初始化调用等)时,通过Det模块报告这些错误
关系 Flash Test–>DEM
- 当Flash Test在测试过程中检测到内存故障或不一致时,向DEM报告诊断事件,用于故障诊断
关系 Flash Test–>MCU
- Flash Test可能需要使用特定的MCU功能(如存储器保护、时钟控制等),通过MCU驱动实现
关系 Flash Test–>MemService
- Flash Test利用MemService提供的通用内存服务进行存储签名计算和验证
代码示例
/* Flash Test模块初始化 */
typedef struct {uint8 ConfigId; /* 配置ID */uint8 TestAlgorithm; /* 测试算法类型 */uint16 TestInterval; /* 后台测试间隔时间 */uint8 ReportFailBehavior; /* 测试失败时的行为 */uint8 MaxBlockCount; /* 最大内存块数量 */boolean DemReportingEnabled; /* 是否启用DEM报告 */uint8 DemEventId; /* DEM事件ID */
} FlashTest_ConfigType;/* 内存块配置结构 */
typedef struct {uint32 MemoryStartAddress; /* 内存块起始地址 */uint32 MemorySize; /* 内存块大小(字节) */uint8 MemoryType; /* 内存类型(FLASH/SRAM/ROM) */uint32 Signature; /* 预期的签名值 */
} FlashTest_MemoryBlockType;/* Flash Test模块初始化函数 */
Std_ReturnType FlashTest_Init(const FlashTest_ConfigType* ConfigPtr)
{Std_ReturnType result = E_OK;/* 参数检查 */if (ConfigPtr == NULL) {Det_ReportError(FLASHTEST_MODULE_ID, FLASHTEST_INSTANCE_ID, FLASHTEST_API_INIT, FLASHTEST_E_PARAM_POINTER);result = E_NOT_OK;}else {/* 初始化模块内部变量 */gFlashTestState = FLASHTEST_STATE_IDLE;gFlashTestConfig = *ConfigPtr;/* 初始化其他模块依赖 */if (gFlashTestConfig.DemReportingEnabled) {/* 初始化DEM事件监控 */Dem_SetEventStatus(gFlashTestConfig.DemEventId, DEM_EVENT_STATUS_PASSED);}}return result;
}
3. 测试流程
3.1 Flash Test测试流程序列图
3.2 前台测试与后台测试对比
Flash Test模块提供两种测试模式:前台测试和后台测试。这两种模式针对不同的使用场景和安全需求设计。
前台测试流程
前台测试是由用户直接调用的同步测试过程,特点包括:
- 调用方式: 通过
FlashTest_TestBlock()
函数直接调用 - 执行特点: 同步执行,调用方需等待测试完成
- 测试范围: 针对指定的内存块进行完整测试
- 不可中断性: 一旦开始测试,不可被中断
- 适用场景: 关键安全检查、启动自检、重要状态转换前验证
前台测试的主要步骤:
- 应用/诊断层调用
FlashTest_TestBlock()
函数 - Flash Test API验证参数并启动测试
- Flash Test Core读取指定内存块内容
- 应用测试算法验证内存内容
- 可选地计算存储块签名并与预期值比较
- 根据测试结果返回状态(FLASHTEST_E_OK或FLASHTEST_E_NOT_OK)
- 测试失败时向DEM报告诊断事件
后台测试流程
后台测试是由调度器周期性调用的可中断测试过程,特点包括:
- 调用方式: 通过
FlashTest_Init()
初始化,然后周期性调用FlashTest_MainFunction()
- 执行特点: 分步执行,可被中断,测试分散在多个任务中
- 测试范围: 可以覆盖多个内存块,按照预定义的测试间隔执行
- 可中断性: 每次执行一个测试片段,保存中间状态
- 适用场景: 运行时背景检查、大内存区域定期验证、长期内存完整性监控
后台测试的主要步骤:
- 应用层首先调用
FlashTest_Init()
初始化测试参数 - 调度器周期性调用
FlashTest_MainFunction()
- 每次调用时,Flash Test执行一个测试片段
- 读取部分Flash内容并应用测试算法
- 保存中间状态,等待下次调用继续测试
- 全部测试完成后,计算和验证签名
- 应用层可通过
FlashTest_GetStatus()
查询测试状态
代码示例
/* 前台测试示例 */
Std_ReturnType TestFlashBlock(uint8 blockId)
{Std_ReturnType result;FlashTest_BlockIdType testBlockId = blockId;/* 调用前台测试API直接测试指定内存块 */result = FlashTest_TestBlock(testBlockId);if (result == FLASHTEST_E_OK) {/* 测试通过,可以继续执行依赖于此内存块的操作 */return E_OK;}else {/* 测试失败,执行失败处理 */HandleFlashTestFailure(blockId);return E_NOT_OK;}
}/* 后台测试示例 */
void InitializeBackgroundTest(void)
{/* 配置并初始化Flash Test模块 */FlashTest_ConfigType testConfig;/* 设置测试配置 */testConfig.TestAlgorithm = FLASHTEST_ALGORITHM_CRC;testConfig.TestInterval = 100; /* 测试间隔(ms) */testConfig.DemReportingEnabled = TRUE;/* 初始化模块 */FlashTest_Init(&testConfig);
}/* 周期性测试函数,由调度器调用 */
void PeriodicFlashTest(void)
{FlashTest_StatusType testStatus;/* 执行测试片段 */FlashTest_MainFunction();/* 检查测试状态 */FlashTest_GetStatus(&testStatus);if (testStatus == FLASHTEST_STATUS_COMPLETED) {/* 测试完成且通过 */ResetTestCycle();}else if (testStatus == FLASHTEST_STATUS_FAILED) {/* 测试失败,执行失败处理 */HandleBackgroundTestFailure();}
}
4. 状态管理
4.1 Flash Test状态转换图
4.2 状态详解
Flash Test模块的状态包括:
- FLASHTEST_STATE_IDLE: 空闲状态,等待测试命令
- FLASHTEST_STATE_TESTING: 测试进行中,执行测试算法
- FLASHTEST_STATE_COMPLETED: 测试完成且通过
- FLASHTEST_STATE_FAILED: 测试失败
5. API接口
Flash Test模块提供以下API接口:
- FlashTest_Init(): 初始化Flash Test模块
- FlashTest_TestBlock(): 执行前台测试
- FlashTest_MainFunction(): 执行后台测试
- FlashTest_GetStatus(): 获取测试状态
6. 配置参数
Flash Test模块的配置参数包括:
- TestAlgorithm: 测试算法类型
- TestInterval: 后台测试间隔时间
- ReportFailBehavior: 测试失败时的行为
- MaxBlockCount: 最大内存块数量
- DemReportingEnabled: 是否启用DEM报告
- DemEventId: DEM事件ID
7. 错误处理
Flash Test模块的错误处理包括:
- HandleFlashTestFailure(): 处理前台测试失败
- HandleBackgroundTestFailure(): 处理后台测试失败
8. 总结
Flash Test模块是AUTOSAR标准中用于测试不变内存的服务模块。它提供了前台测试和后台测试两种模式,以满足不同的使用场景和安全需求。通过Flash Test模块,可以有效地检测内存的完整性和可靠性,确保系统的安全性和可靠性。