# 内存映射规范 > **文档标题**: Specification of Memory Mapping > **AUTOSAR CP Release**: 4.4.0 > **文档编号**: 128 > **文档类型**: SWS (Software Specification) --- ## 文档标识 | 项目 | 内容 | |------|------| | Document Title | Specification of Memory Mapping | | Document Owner | AUTOSAR | | Document Responsibility | AUTOSAR | | Document Identification No | 128 | | Document Status | Final | | Part of AUTOSAR Standard | Classic Platform | | Part of Standard Release | 4.4.0 | --- ## 文档变更历史 | 日期 | 版本 | 变更者 | 变更描述 | |------|------|--------|----------| | 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 支持模块在可分配内存部分中拆分;澄清配置数据处理;附加小幅更正 | | 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 修订说明性文字;编辑性修订 | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 支持指针变量的专用分配;移除过时规范内容;修订示例 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 支持核心范围特定内存分配;清理需求追溯 | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 支持安全系统的 BSW 分区;移除 Recommendation A 中过时内存段;澄清 SIZE 与 ALIGNMENT 的处理 | | 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 澄清 `` 在恢复区和保存数据区的使用 | | 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 澄清默认 section 用法 | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | 内存分配关键字的一致命名模式;预定义 MemorySection 与 SwAddrMethod 的 M1 值;新增编译器抽象配置;支持 BSW 模块特定 MemMap 头文件 | | 2011-12-22 | 4.0.3 | AUTOSAR Administration | 引入内存分配关键字的一致命名模式 | | 2009-12-18 | 4.0.1 | AUTOSAR Administration | 为 MemMap 定义 ECU 配置参数;定义 MemMap 头文件的生成;新增初始化策略 CLEARED 标准化内存分配关键字 | | 2010-02-02 | 3.1.4 | AUTOSAR Administration | 内存映射章节扩展用于应用 SWC;通用已发布信息更新 | | 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律免责声明修订 | | 2006-11-28 | 2.1 | AUTOSAR Administration | MEMMAP004 列出内存段名的所有大小后缀;新增 BOOLEAN 关键字 | | 2006-05-16 | 2.0 | AUTOSAR Administration | 初始版本发布 | --- ## 目录 1. [介绍与功能概述](#1-介绍与功能概述) 2. [缩略语](#2-缩略语) 3. [相关文档](#3-相关文档) 4. [约束与假设](#4-约束与假设) 5. [模块依赖](#5-模块依赖) 6. [需求追溯](#6-需求追溯) 7. [功能规范](#7-功能规范) 8. [API 规范](#8-api-规范) 9. [时序图](#9-时序图) 10. [配置规范](#10-配置规范) 11. [分析](#11-分析) --- ## 1 介绍与功能概述 本文档规定通过内存映射文件将代码和数据映射到特定内存段的机制。对于许多 ECU 和微控制器平台,按模块将代码、变量和常量映射到特定内存段至关重要。 **重要用例**: ### 避免 RAM 浪费 如果在 32 位平台上多个模块使用不同大小变量(8、16、32 位),链接器在 RAM 中分配变量时会留下间隙。通过将变量按大小映射到特定内存段,可最小化 RAM 中未使用空间。 ### 使用特定 RAM 属性 某些变量(如 NVRAM 管理器的 RAM 镜像)不应在上电复位后初始化。应可将它们映射到复位后不初始化的 RAM 段。 某些变量(如通过位掩码访问的)若位于允许编译器位操作指令的 RAM 段(如"近页"或"零页")中可提升性能和减小代码大小。 ### 使用特定 ROM 属性 在带外部 Flash 内存的大型 ECU 中,需将频繁调用函数的模块映射到允许快速访问的内部 Flash 内存,实现更高性能。 ### 同一模块源代码用于 boot loader 和应用 如果模块同时用于 boot loader 和应用,需要允许将代码和数据映射到不同内存段。 ### 支持内存保护 硬件内存保护使用要求将模块变量分离到不同内存区域。内部变量映射到受保护内存,数据交换缓冲区映射到非保护内存。 ### 支持分区 如果 BSW 模块应支持跨多个分区拆分,需将模块变量额外分离到不同的内存(分区)区域。 --- ## 2 缩略语 | 缩略语 | 描述 | |--------|------| | BSW | Basic Software | | ISR | Interrupt Service Routine | | NVRAM | Non-Volatile RAM | --- ## 3 相关文档 ### 3.1 输入文档 [1] Glossary — AUTOSAR_TR_Glossary [2] General Specification of Basic Software Modules — AUTOSAR_SWS_BSWGeneral [3] General Requirements on Basic Software Modules — AUTOSAR_SRS_BSWGeneral [4] Software Component Template — AUTOSAR_TPS_SoftwareComponentTemplate [5] Basic Software Module Description Template — AUTOSAR_TPS_BSWModuleDescriptionTemplate [6] Methodology — AUTOSAR_TR_Methodology [7] Specification of RTE Software — AUTOSAR_SWS_RTE ### 3.2 相关标准与规范 不适用。 ### 3.3 相关规范 AUTOSAR 提供基础软件模块通用规范(SWS BSW General),也适用于 SWS Memory Mapping。 --- ## 4 约束与假设 ### 4.1 限制 考虑了第 3.1 章列出的编译器。如果其他编译器需要不能映射到此规范所描述机制的关键字,该编译器将不被 AUTOSAR 支持。 不支持结构的专用 pack 控制。代码、变量和常量的专用对齐控制不支持,需通过编译器/链接器参数全局设置。 ### 4.2 适用车型领域 无限制。 --- ## 5 模块依赖 [SWS_MemMap_00020] ⌈SWS Memory Mapping 适用于每个 AUTOSAR 基础软件模块和软件组件。⌋ ### 5.1 文件结构 #### 5.1.1 代码文件结构 不适用。 #### 5.1.2 头文件结构 [SWS_MemMap_00028] ⌈如果任何 BSW 模块描述以 DependencyOnArtifact 作为 requiredArtifact 描述了 MEMMAP 类别,Memory Mapping 应提供 BSW 内存映射头文件。文件名由 BSW 模块描述中的 `artifactDescriptor.shortLabel` 属性值定义。⌋ [SWS_MemMap_00032] ⌈对于每个非 MEMMAP 类别的 BSW 模块描述,Memory Mapping 应提供 BSW 模块特定的内存映射头文件 `{Mip}_MemMap.h`,其中 `{Mip}` 按 `[__]` 组成: - ``:BswModuleDescription 的 shortName(大小写敏感) - ``:BSW 模块的 vendorId - ``:BSW 模块的 vendorApiInfix ⌋ [SWS_MemMap_00029] ⌈对于每个软件组件类型,应提供软件组件类型特定的内存映射头文件 `{componentTypeName}_MemMap.h`。⌋ --- ## 6 需求追溯 本文档主要满足 SRS_BSW_00351(封装编译器特定方法以映射对象)需求。其他多个 SRS_BSW_* 通用需求由 SWS_MemMap_00999 标记为不适用。 详细需求追溯表见原文 PDF 第 6 章。 --- ## 7 功能规范 ### 7.1 总体问题 内存映射文件将编译器和链接器特定的内存分配关键字包含在头文件和源文件中。这些关键字控制变量和函数到特定段的分配,从而使实现与编译器和微控制器特定属性无关。段到专用内存区域/地址范围的分配不在内存映射文件范围,通常通过链接器控制文件完成。 [SWS_MemMap_00001] ⌈对于每个构建场景(如 Boot loader、ECU 应用),应提供自己的一组内存映射文件。⌋ [SWS_MemMap_00002] ⌈内存映射文件名应为 BSW 模块的 `{Mip}_MemMap.h` 和软件组件的 `{componentTypeName}_MemMap.h`。⌋ [SWS_MemMap_00010] ⌈如编译器/链接器不需要特定命令实现 SWS Memory Mapping 功能,内存分配关键字定义可为未定义而无影响。⌋ [SWS_MemMap_00036] ⌈如编译器/链接器不支持 BSW 模块或软件组件使用的 MemorySection 种类的强制功能,内存分配关键字应定义为引发错误。⌋ **示例 7.1**: ```c #ifdef EEP_START_SEC_VAR_CLEARED_16 #undef EEP_START_SEC_VAR_CLEARED_16 #endif ``` ### 7.2 变量和代码的映射 #### 7.2.1 使用内存映射头文件的实现需求 [SWS_MemMap_00038] ⌈每个 AUTOSAR 基础软件模块和软件组件应支持以下内存类型的配置: - VAR - VAR_FAST - VAR_SLOW - INTERNAL_VAR - VAR_SAVED_ZONE - CONST_SAVED_RECOVERY_ZONE - CONST - CALIB - CONFIG_DATA - CODE - CALLOUT_CODE - CODE_FAST - CODE_SLOW ⌋ ##### {ALIGNMENT} 后缀 - **BOOLEAN**:1 位变量和常量 - **8**:8 位对齐 - **16**:16 位对齐 - **32**:32 位对齐 - **PTR**:指针变量和常量 - **UNSPECIFIED**:大小不符合上述标准 ##### {INIT_POLICY} 后缀 - **NO_INIT**:从不清零、从不初始化 - **CLEARED**:每次复位后清零 - **POWER_ON_CLEARED**:仅上电复位后清零 - **INIT**:每次复位后初始化值 - **POWER_ON_INIT**:仅上电复位后初始化 #### 7.2.1.1 模块在可分配内存部分拆分 [SWS_MemMap_00040] ⌈当 BSW 模块或软件组件拆分为可分配内存部分时,`` 应按以下方式子结构化: ` = [__]_`⌋ #### 7.2.1.2 config 常量与非 config 常量 两种常量: 1. **Config 常量**:实现可配置行为(在 `_Lcfg.c` 和 `_PBcfg.c` 中) - 语法:`{PREFIX}_START_SEC_CONFIG_DATA_{configClass}[_{safety}]_{ALIGNMENT}` - `{configClass}` 可为 PREBUILD 或 POSTBUILD 2. **非 Config 常量**:实现固定值(在 `.[ch]` 或扩展中) - 语法:`{PREFIX}_START_SEC_CONST[_{accessPeriod}][_{safety}][_{coreScope}]` #### 7.2.1.3 数据段 ##### 表 7.1: Section Type VAR | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_VAR_{INIT_POLICY}[_{safety}][_{coreScope}]_{ALIGNMENT}` / `{PREFIX}_STOP_SEC_VAR_{INIT_POLICY}[_{safety}][_{coreScope}]_{ALIGNMENT}` | | Description | 用于所有全局或静态变量。 | | Section Type | VAR | | Init Policy | {INIT_POLICY} | ##### 表 7.2: Section Type VAR_FAST | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_VAR_FAST_{INIT_POLICY}[_{safety}][_{coreScope}]_{ALIGNMENT}` | | Description | 用于具有以下属性的全局或静态变量:按位访问、频繁使用、源代码中高访问次数。 | ##### 表 7.3: Section Type VAR_SLOW | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_VAR_SLOW_{INIT_POLICY}[_{safety}][_{coreScope}]_{ALIGNMENT}` | | Description | 用于所有不频繁访问的全局或静态变量。 | ##### 表 7.4: Section Type INTERNAL_VAR | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_INTERNAL_VAR_{INIT_POLICY}[_{safety}][_{coreScope}]_{ALIGNMENT}` | | Description | 用于可从校准工具访问的全局或静态变量。 | ##### 表 7.5: Section Type VAR_SAVED_ZONE | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_VAR_SAVED_ZONE{anyNamePart}[_{safety}]_{ALIGNMENT}` | | Description | 用于保存在非易失内存中的变量的 RAM 缓冲区。 | | Init Policy | NO_INIT | ##### 表 7.6: Section Type CONST_SAVED_RECOVERY_ZONE | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_CONST_SAVED_RECOVERY_ZONE{anyNamePart}[_{safety}]_{ALIGNMENT}` | | Description | 用于保存在非易失内存中的变量的 ROM 缓冲区。 | ##### 表 7.7: Section Type CONST | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_CONST[_{accessPeriod}][_{safety}]_{ALIGNMENT}` | | Description | 用于全局或静态常量。`{accessPeriod}` 单位:US、MS、S(例如 100US、400US、1MS、5MS、10MS、20MS、100MS、1S)。 | ##### 表 7.8: Section Type CALIB | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_CALIB[_{safety}]_{ALIGNMENT}` | | Description | 用于校准常量。 | | Section Type | CALPRM | ##### 表 7.9: Section Type CONFIG_DATA | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_CONFIG_DATA_{configClass}[_{safety}]_{ALIGNMENT}` | | Description | 模块配置段中的常量。`{configClass}` 为 PREBUILD 或 POSTBUILD。 | | Section Type | CONFIG-DATA | #### 7.2.1.4 代码段 ##### 表 7.10: Section Type CODE | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_CODE[_{codePeriod}][_{safety}][_{coreScope}]` / `{PREFIX}_STOP_SEC_CODE[_{codePeriod}][_{safety}][_{coreScope}]` | | Description | 用于将代码映射到应用块、引导块、外部 Flash 等。 | | Section Type | CODE | ##### 表 7.11: Section Type CALLOUT_CODE | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_CALLOUT_CODE[_{safety}][_{coreScope}]` | | Description | 用于映射 BSW 模块 callout,通常使用全局链接器设置。 | ##### 表 7.12: Section Type CODE_FAST | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_CODE_FAST[_{safety}][_{coreScope}]` | | Description | 用于应放入快速代码内存段的代码。 | ##### 表 7.13: Section Type CODE_SLOW | 项 | 内容 | |-----|------| | Syntax | `{PREFIX}_START_SEC_CODE_SLOW[_{safety}][_{coreScope}]` | | Description | 用于不频繁访问的代码。 | #### 7.2.2 内存映射头文件需求 内存映射头文件必须包含 `#define` 指令以将段开始/停止与编译器特定 pragma 关联。 [SWS_MemMap_00037] ⌈`` 部分可包含以下 ASIL 关键字以指示限制/资格:`{safety}` = QM, ASIL_A, ASIL_B, ASIL_C, ASIL_D。`{safety}` 标签是可选的,默认应视为 QM。⌋ [SWS_MemMap_00039] ⌈`` 部分可包含以下核心范围关键字以指示限制:`{coreScope}` = GLOBAL(任何核心都可访问)、LOCAL(由集成者映射到特定核心)。默认为 GLOBAL。⌋ ### 7.3 示例 #### 7.3.1 代码段示例 ```c #define EEP_START_SEC_CODE #include "EEP_MemMap.h" void Eep_Init(const Eep_ConfigType* ConfigPtr) { /* ... */ } #define EEP_STOP_SEC_CODE #include "EEP_MemMap.h" ``` #### 7.3.2 快速变量段示例 ```c #define EEP_START_SEC_VAR_FAST_CLEARED_16 #include "EEP_MemMap.h" static uint16 Eep_Status; #define EEP_STOP_SEC_VAR_FAST_CLEARED_16 #include "EEP_MemMap.h" ``` #### 7.3.3 ICC2 集群中的代码段 支持多个 BSW 模块共享同一头文件。 #### 7.3.4 Callout 段 ```c #define CAN_START_SEC_CALLOUT_CODE #include "Can_MemMap.h" ``` #### 7.3.5 可分配内存部分 ```c #define EEP_FEATURE_START_SEC_CODE #include "EEP_MemMap.h" void Eep_Feature_Init(void) { /* ... */ } #define EEP_FEATURE_STOP_SEC_CODE #include "EEP_MemMap.h" ``` --- ## 8 API 规范 本规范不定义 API。 --- ## 9 时序图 不适用。 --- ## 10 配置规范 ### 10.1 如何阅读本章 详见 SWS_BSWGeneral 文档。 ### 10.2 容器与配置参数 #### 10.2.1 MemMap | 项 | 内容 | |-----|------| | SWS Item | ECUC_MemMap_00001 | | Module Name | MemMap | | Module Description | MemMap 模块配置 | #### 10.2.2 MemMapAddressingModeSet 定义寻址模式集合。 #### 10.2.3 MemMapAddressingMode 指定特定的寻址模式。 #### 10.2.4 MemMapAllocation 定义内存分配规则。 #### 10.2.5 MemMapGenericMapping 通用映射规则。 #### 10.2.6 MemMapSectionSpecificMapping 段特定映射规则。 #### 10.2.7 MemMapMappingSelector 映射选择器。 #### 10.2.8 MemMapGenericCompilerMemClass 通用编译器内存类。 ### 10.3 已发布信息 发布编译器和内存映射的版本信息。 --- ## 11 分析 ### 11.1 变量内存分配 变量根据大小和访问频率分配到不同内存段: - 通用变量 → VAR_* - 频繁访问/位访问 → VAR_FAST_* - 不频繁访问 → VAR_SLOW_* - 校准可访问 → INTERNAL_VAR_* ### 11.2 常量变量内存分配 常量分配到 ROM 内存段: - 通用常量 → CONST_* - 校准常量 → CALIB_* - 配置数据 → CONFIG_DATA_* ### 11.3 代码内存分配 代码分配到相应内存段: - 通用代码 → CODE - 频繁调用 → CODE_FAST - 不频繁调用 → CODE_SLOW - Callout → CALLOUT_CODE --- ## A 引用的元类 详见原文 PDF 附录 A。包含: - MemorySection - SwAddrMethod - BswImplementation - SwcImplementation - SectionNamePrefix --- ## B 不适用需求 [SWS_MemMap_00999] ⌈这些需求不适用于本规范。⌋ 涉及多个 SRS_BSW_* 需求,详见原文 PDF。 --- ## 翻译说明 - 本文档完整翻译自 AUTOSAR_SWS_MemoryMapping v4.4.0(Document ID 128,109 页)。 - 保留所有需求 ID(SWS_MemMap_xxxxx、SRS_BSW_xxxxx)。 - 保留 AUTOSAR 方框符 ⌈⌋。 - 保留内存分配关键字(`_START_SEC_*`、`_STOP_SEC_*`)的英文形式。 - 模块缩写、初始化策略和对齐关键字(VAR、CONST、CODE、CALIB、INIT、CLEARED、NO_INIT、PTR 等)保持英文。 - 完整的元类引用和详细配置参数请参考原文 PDF 附录。