编译器抽象规范(Specification of Compiler Abstraction)

📄 文档 ID:051 🏷 类型:SWS(软件规范) 📅 版本:AUTOSAR CP 4.4.0 📑 页数:53 📌 状态:Final 🔗 原 PDF:AUTOSAR_SWS_CompilerAbstraction.pdf

目录

1 介绍与功能概述(Introduction and functional overview)

本文档规范了用于抽象编译器特定关键字的宏,这些关键字用于声明和定义中的数据和代码寻址。

主要是针对 16 位平台(例如 Cosmic 和 Metrowerks for S12X、Tasking for ST10)的编译器使用特殊关键字来处理微控制器架构的特性,原因在于 16 位地址范围的限制。如果不将内存模型调整为 largehuge,编译器的分页(paging)和扩展寻址(用于访问 64K 边界以外的内存)等特性不会被自动启用。数据和代码的位置必须通过特殊关键字显式选择。如果直接在源代码中使用这些关键字,将导致每次移植到新的微控制器系列时都必须修改软件,违反了源代码的平台无关性要求。

如果默认将内存模型切换为 largehuge(以规避上述问题),则项目将承受增加的代码大小。

本文档规范了一个三步概念

  1. 文件 Compiler.h 提供用于封装定义和声明的宏。
  2. 每个单独的模块必须至少区分以下不同的内存类和指针类。每个类由一个 #define 表示。
  3. 文件 Compiler_Cfg.h 允许根据模块描述和构建场景的内存设置,使用适当的编译器特定关键字来配置这些 #define

2 缩略语与术语(Acronyms and abbreviations)

仅在本文件局部使用、因而未收录到 AUTOSAR 术语表中的缩略语与术语,必须在本节"局部术语表"中列出。

缩略语说明
Large, huge微控制器编译器的内存模型配置。默认情况下,所有访问机制使用扩展/分页寻址。
某些编译器使用 huge 一词代替 far
Tiny, small微控制器编译器的内存模型配置。默认情况下,所有访问机制使用普通寻址。仅可访问平台架构地址范围内的数据和代码(例如 16 位架构上为 64K)。
far扩展/分页寻址方案的编译器关键字(用于可能位于平台架构普通寻址方案之外的数据和代码)。
near普通寻址方案的编译器关键字(用于位于平台架构地址范围内的数据和代码)。

3 相关文档(Related documentation)

3.1 输入文档

编号文档名原 PDF
[1]List of Basic Software ModulesAUTOSAR_TR_BSWModuleList.pdf
[2]General Requirements on Basic Software ModulesAUTOSAR_SRS_BSWGeneral.pdf
[3]Layered Software ArchitectureAUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[4]Specification of ECU ConfigurationAUTOSAR_TPS_ECUConfiguration.pdf
[5]Cosmic C Cross Compiler User's Guide for Motorola MC68HC12, V4.5
[6]ARM ADS compiler manual
[7]GreenHills MULTI for V850 V4.0.5
[8]TASKING for ST10 V8.5
[9]Wind River (Diab Data) for PowerPC Version 5.2.1
[10]TASKING for TriCore TC1796 V2.0R1
[11]Metrowerks CodeWarrior 4.0 for Freescale HC9S12X/XGATE (V5.0.25)
[12]General Specification of Basic Software ModulesAUTOSAR_SWS_BSWGeneral.pdf
[13]Specification of Memory MappingAUTOSAR_SWS_MemoryMapping.pdf

3.2 相关规范

AUTOSAR 提供了通用基础软件模块规范 [12](SWS BSW General),该规范对编译器抽象同样适用。

因此,SWS BSW General 应被视为编译器抽象的附加且必需的规范

4 约束与假设(Constraints and assumptions)

4.1 限制(Limitations)

在对抽象进行规范和概念验证时,已考虑了 3.1 节中列出的编译器。若任何其他编译器需要的关键字无法映射到本规范描述的机制,则该编译器将不被 AUTOSAR 支持。在这种情况下,编译器厂商必须调整其编译器。

如果物理存在的内存在代码空间或数据空间上大于逻辑可寻址内存,且使用了超过逻辑可寻址空间的部分,则逻辑地址必须被重用。C 语言(以及其他语言)无法处理这种情况。

4.2 对汽车领域的适用性(Applicability to car domains)

无限制。

4.3 对功能安全相关环境的适用性(Applicability to safety related environments)

无限制。编译器抽象文件不实现任何功能,仅包含符号和宏。

5 对其他模块的依赖(Dependencies to other modules)

[SWS_COMPILER_00048]

SWS 编译器抽象适用于每个 AUTOSAR 基础软件模块和应用软件组件。因此,内存类(memclass)和指针类(ptrclass)宏参数的实现(见 SWS_COMPILER_00040应当满足特定构建场景中每个软件模块的实现和配置需求。

参考:SRS_BSW_00328, SRS_BSW_00384

5.1 文件结构(File structure)

图 1:Compiler.h 的包含结构
«header»                    «header»
Compiler.h                ←  Std_Types.h
        «includes»
                              «includes»
                          «header»
                       Compiler_Cfg.h
  

以下说明描述了与其他间接链接模块的连接:

6 需求追溯(Requirements traceability)

本规范中实际有效的 SRS 需求追溯如下:

SRS 需求由以下满足
SRS_BSW_00003:所有软件模块应当提供版本和标识信息SWS_COMPILER_00001
SRS_BSW_00004:所有基础软件模块应当对所包含的头文件版本进行预处理检查SWS_COMPILER_00999
SRS_BSW_00006:MCAL 之上模块的源代码不应是处理器/编译器相关的SWS_COMPILER_00010SWS_COMPILER_00035SWS_COMPILER_00036
SRS_BSW_00306:AUTOSAR 基础软件模块应是编译器/平台无关SWS_COMPILER_00010SWS_COMPILER_00035SWS_COMPILER_00036SWS_COMPILER_00058SWS_COMPILER_00062SWS_COMPILER_00064
SRS_BSW_00328:所有 AUTOSAR 基础软件模块应当避免代码重复SWS_COMPILER_00048
SRS_BSW_00347:不同实例的 BSW 驱动命名应分离SWS_COMPILER_00050
SRS_BSW_00348:AUTOSAR 标准类型应放在标准类型头文件中SWS_COMPILER_00003SWS_COMPILER_00004
SRS_BSW_00361:所有非标准化关键字的映射应放在编译器特定类型和关键字头文件中SWS_COMPILER_00003SWS_COMPILER_00004SWS_COMPILER_00040SWS_COMPILER_00041SWS_COMPILER_00046SWS_COMPILER_00047SWS_COMPILER_00053SWS_COMPILER_00054SWS_COMPILER_00055SWS_COMPILER_00057SWS_COMPILER_00059SWS_COMPILER_00060SWS_COMPILER_00061SWS_COMPILER_00062SWS_COMPILER_00063SWS_COMPILER_00064SWS_COMPILER_00065
SRS_BSW_00374:基础软件模块应提供可读的模块厂商标识SWS_COMPILER_00030
SRS_BSW_00384:BSW 模块和 SWC 应在类型定义中不重复信息SWS_COMPILER_00048
SRS_BSW_00388:容器用于分组为同一对象定义的配置参数SWS_COMPILER_00040
SRS_BSW_00404:BSW 模块应支持构建后配置SWS_COMPILER_00059
SRS_BSW_00456:应定义头文件以协调 BSW 模块SWS_COMPILER_00054
SRS_BSW_00464:文件名应区分大小写SWS_COMPILER_00004SWS_COMPILER_00055
SRS_BSW_00480:空指针错误应遵循命名规则SWS_COMPILER_00051
其余 ~90+ SRS 需求SWS_COMPILER_00999

7 功能规范(Functional specification)

7.1 一般行为(General behavior)

[SWS_COMPILER_00003]

对于每个编译器和平台应当提供一个编译器抽象。

参考:SRS_BSW_00348, SRS_BSW_00361

7.1.1 编译器符号清单(List of Compiler symbols)

下表根据 SWS_COMPILER_00010 定义了目标编译器符号。此表仅包含示例,并未列出 AUTOSAR 支持的所有可能编译器!

平台编译器编译器符号
S12XCode Warrior_CODEWARRIOR_C_S12X_
S12XCosmic_COSMIC_C_S12X_
TC1796/TC1766Tasking_TASKING_C_TRICORE_
ST10Tasking_TASKING_C_ST10_
ST30ARM Developer Suite_ADS_C_ST30_
V850Greenhills_GREENHILLS_C_V850_
MPC5554Diab Data_DIABDATA_C_ESYS_
TMS470Texas Instruments_TEXAS_INSTRUMENTS_C_TMS470_
ARMTexas Instruments_TEXAS_INSTRUMENTS_C_ARM_

注意:为避免不兼容和/或不一致,编译器符号定义不得在符号后包含任何值。

7.1.2 对使用编译器抽象的实现的要求(Requirements on implementations using compiler abstraction)

[SWS_COMPILER_00040]

每个 AUTOSAR 软件模块和应用软件组件应当支持至少以下不同的内存类和指针类的区分。

参考:SRS_BSW_00361, SRS_BSW_00388

<PREFIX> 的组成

<INIT_POLICY>(变量的初始化策略)的取值包括:

内存类型memclass 与 ptrclass 宏参数语法说明所在文件
代码<PREFIX>_CODE[_<PERIOD>]用于代码。PERIOD 为可执行实体的典型周期时间值和单位,[_<PERIOD>] 部分可选;单位包括 US(微秒)、MS(毫秒)、S(秒)。示例:100US、400US、1MS、5MS、10MS、20MS、100MS、1S。需注意实际周期可能因集成决策偏离典型值。Compiler_Cfg.h
代码<PREFIX>_<CN>_CODE用于回调(callout)代码,其中 <CN> 是回调名称(含模块引用)的大写形式。Compiler_Cfg.h
代码<PREFIX>_CODE_FAST用于进入快速代码内存段的代码。适用于无固定周期、但访问频繁或执行时间高的场景(例如频繁通知的回调)。Compiler_Cfg.h
代码<PREFIX>_CODE_SLOW用于进入慢速代码内存段的代码。适用于无固定周期、且访问频率低的场景(例如罕见错误的回调)。Compiler_Cfg.h
常量<PREFIX>_CONST用于全局或静态常量。Compiler_Cfg.h
常量<PREFIX>_CALIB用于标定常量。Compiler_Cfg.h
常量<PREFIX>_CONFIG_DATA用于模块配置常量。Compiler_Cfg.h
常量<PREFIX>_CONST_SAVED_RECOVERY_ZONE<X>用于保存在非易失性存储器中的变量的 ROM 缓冲区,X 替换为字节数(如 8/16/32)。Compiler_Cfg.h
指针<PREFIX>_APPL_DATA用于通过 API 传递的应用数据引用(可能在 RAM 或 ROM 中)。Compiler_Cfg.h
指针<PREFIX>_APPL_CONST用于通过 API 传递的应用常量引用(应在 ROM 中,例如 Init 函数的指针)。Compiler_Cfg.h
指针REGSPACE用于寄存器指针(如 CONSTP2VAR(uint16, PWM_CONST, REGSPACE))。Compiler_Cfg.h
变量<PREFIX>_VAR_<INIT_POLICY>用于所有全局或静态变量。Compiler_Cfg.h
变量<PREFIX>_VAR_FAST_<INIT_POLICY>用于满足以下属性之一的所有全局或静态变量:按位访问、频繁使用、源代码中访问次数多。某些平台允许对该 RAM 区域中的变量使用位操作指令和较短的寻址指令。Compiler_Cfg.h
变量<PREFIX>_VAR_SLOW_<INIT_POLICY>用于访问频率低的所有全局或静态变量。Compiler_Cfg.h
变量<PREFIX>_INTERNAL_VAR_<INIT_POLICY>用于可被标定工具访问的全局或静态变量。Compiler_Cfg.h
变量<PREFIX>_VAR_SAVED_ZONE<X>用于保存在非易失性存储器中的变量的 RAM 缓冲区,X 替换为字节数(如 8/16/32)。Compiler_Cfg.h
变量AUTOMATIC用于局部非静态变量。Compiler.h
类型TYPEDEF用于无法指定内存限定符的类型定义中。Compiler.h

对于形式为 <PREFIX>_<NAME> 的内存类,<NAME> 部分可在 BSW 模块描述或软件组件描述的 MemorySections 中指定。这对生成代码尤其重要:

[SWS_COMPILER_00041]

每个 AUTOSAR 软件模块和应用软件组件应当使用以下关键字宏包装代码、变量、常量和指针类型的声明与定义。

参考:SRS_BSW_00361

示例

原生 C API:

Std_ReturnType Spi_SetupBuffers
(
    Spi_ChannelType       Channel,
    const Spi_DataType   *SrcDataBufferPtr,
    Spi_DataType         *DesDataBufferPtr,
    Spi_NumberOfDataType Length
);

封装后:

FUNC(Std_ReturnType, SPI_CODE) Spi_SetupBuffers
(
    Spi_ChannelType        Channel,
    P2CONST(Spi_DataType, AUTOMATIC, SPI_APPL_DATA) SrcDataBufferPtr,
    P2VAR(Spi_DataType, AUTOMATIC, SPI_APPL_DATA,) DesDataBufferPtr,
    Spi_NumberOfDataType   Length
);

7.1.3 Compiler.h 的内容(Contents of Compiler.h)

[SWS_COMPILER_00004]

编译器抽象的文件名应当Compiler.h

参考:SRS_BSW_00348, SRS_BSW_00361, SRS_BSW_00464

[SWS_COMPILER_00053]

文件 Compiler.h 应当包含 7.1.5 节中规范的定义和宏。这些定义和宏对于一个特定的编译器和平台是固定的。

参考:SRS_BSW_00361

[SWS_COMPILER_00005]

若编译器不要求或不支持特殊关键字的使用,则本规范规定的相应宏应当以空定义或无效果的形式提供。

示例

#define FUNC(type, memclass) type
/* DIABDATA 不需要 */

[SWS_COMPILER_00010]

编译器抽象应当根据以下命名约定为目标编译器定义一个符号:
_<COMPILERNAME>_C_<PLATFORMNAME>_

注意 1:为避免不兼容和/或不一致,编译器符号定义不得在符号后包含任何值。

注意 2:这些定义可用于在不同编译器实现间切换,例如:

参考:SRS_BSW_00306, SRS_BSW_00006

符号清单见 7.1.1 节。

[SWS_COMPILER_00030]

Compiler.h 应当提供支持的编译器厂商和适用编译器版本的信息。

参考:SRS_BSW_00374

[SWS_COMPILER_00035]

宏参数 memclassptrclass 不得填充编译器特定的关键字,而应当填充 SWS_COMPILER_00040 中配置的值之一。

参考:SRS_BSW_00306, SRS_BSW_00006

其原理是:更改变量、指针或函数的存储类时,模块的实现不应受到影响。

[SWS_COMPILER_00036]

C 语言禁止在函数局部变量(auto 变量)上使用 far/near 关键字。因此,当使用下述宏在栈上分配指针时,memclass 参数应当设置为 AUTOMATIC

参考:SRS_BSW_00306, SRS_BSW_00006

[SWS_COMPILER_00047]

Compiler.h 头文件应当防止被多次包含。

示例

#ifndef COMPILER_H
    #define COMPILER_H
      /* Compiler.h 的实现 */
      ...
    #endif /* COMPILER_H */

#ifndef - #endif 之外只能有注释。

参考:SRS_BSW_00361

[SWS_COMPILER_00050]

允许使用厂商特定的扩展来扩展编译器抽象头文件。厂商扩展的元素应当在名称中包含 AUTOSAR Vendor ID。

参考:SRS_BSW_00347

7.1.4 Compiler_Cfg.h 的内容(Contents of Compiler_Cfg.h)

[SWS_COMPILER_00055]

文件 Compiler_Cfg.h 应当包含传递给 Compiler.h 中定义的宏的模块/组件特定参数(ptrclassmemclass)。见 SWS_COMPILER_00040 中关于内存类型和所需语法的说明。

参考:SRS_BSW_00361, SRS_BSW_00464

[SWS_COMPILER_00054]

模块特定扩展元素应当在名称中包含 BSW 模块的模块缩写。应用软件组件特定扩展元素应当包含软件组件类型的名称

参考:SRS_BSW_00456

7.1.5 综合示例(Comprehensive example)

本示例展示了一个 API 函数中宏的定义、使用和配置位置。

文件 Eep.c

#include "Std_Types.h"    /* 该文件已包含 Compiler.h */

FUNC(Std_ReturnType, EEP_CODE) Eep_Read
              (
                  Eep_AddressType EepromAddress,
                  P2VAR(uint8, AUTOMATIC, EEP_APPL_DATA) DataBufferPtr,
                  Eep_LengthType Length
              )

文件 Compiler.h

#include "Compiler_Cfg.h"

#define AUTOMATIC
#define FUNC(rettype, memclass) rettype memclass
#define P2VAR(ptrtype, memclass, ptrclass) ptrclass ptrtype * memclass

文件 Compiler_Cfg.h

#define EEP_CODE
#define EEP_APPL_DATA @far    /* NvM 的 RAM 块位于 banked RAM */

依赖关系是什么?

EEP_APPL_DATA 被定义为 far。这意味着指向由 NVRAM Manager 管理的 RAM 块的指针也必须定义为 far。应用程序可以将 RAM 镜像放在 banked RAM 或非 banked RAM 中。RAM 块到 banked RAM 的映射在 <Mip>_MemMap.h 中完成(关于 <Mip> 的更多信息见 [12])。

由于这些指针也通过 Memory Interface 和 EEPROM Abstraction 传递,因此它们的指针类和内存类必须也匹配 EEP_APPL_DATA

在 32 位平台上会有什么不同?

尽管只有 S12X 内部有 EEPROM,但从编译器抽象的角度看,唯一变化的是 Compiler_Cfg.h 中的定义。它们将变为空定义:

#define EEP_CODE
#define EEP_APPL_DATA

7.1.6 建议流程(Proposed process)

为支持多供应商环境下的开发和集成,特定的交付流程不可或缺。以下描述可视为建议:

图 2:建议的集成流程
步骤 1:基础文件交付
AUTOSAR 模块供应商:实现源文件和文档、分配版本号和厂商号、实现 Compiler_Cfg.h<Mip>_MemMap.h 的模块特定部分、构建包;交付 Compiler.hStd_Types.hPlatform_Types.h
AUTOSAR 集成商:接收并检查包、集成模块、将各模块的 Compiler_Cfg.h 集成到主 Compiler_Cfg.h 中、配置 <Mip>_MemMap.hCompiler_Cfg.h
步骤 2:模块/组件交付
模块 A/B/C 的 Compiler_Cfg.h 与源代码一起打包交付,由集成环境统一集成。

8 API 规范(API specification)

本节是本模块唯一适用的 API。

8.2.1 通用定义(General definitions)

8.2.1.1 内存类 AUTOMATIC

[SWS_COMPILER_00046]

DefineAUTOMATIC
取值范围"empty"(空)
说明内存类 AUTOMATIC 应当以空定义的形式提供,用于局部指针的声明。
备注SWS_COMPILER_00040

参考:SRS_BSW_00361

8.2.1.2 内存类 TYPEDEF

[SWS_COMPILER_00059]

DefineTYPEDEF
取值范围"empty"(空)
说明内存类 TYPEDEF 应当以空定义形式提供。该内存类应当用于无法指定内存限定符的类型定义中。例如在用 P2VAR 等宏定义指针类型时,宏需要两个参数:第一个参数(指向的内存位置的距离)可在类型定义中指定;但第二个参数(指针自身的内存分配)此时无法定义。因此应当使用内存类 TYPEDEF
备注SWS_COMPILER_00040

参考:SRS_BSW_00404

8.2.1.3 NULL_PTR

[SWS_COMPILER_00051]

DefineNULL_PTR
取值范围void 指针     ((void *)0)
说明编译器抽象应当提供一个定义为指向零的 void 指针的 NULL_PTR
备注SWS_COMPILER_00040

参考:SRS_BSW_00480

8.2.1.4 INLINE

[SWS_COMPILER_00057]

DefineINLINE
取值范围inline/空
说明编译器抽象应当提供 INLINE 定义以抽象关键字 inline
备注SWS_COMPILER_00040

参考:SRS_BSW_00361

8.2.1.5 LOCAL_INLINE

[SWS_COMPILER_00060]

DefineLOCAL_INLINE
取值范围static inline/空
说明编译器抽象应当提供 LOCAL_INLINE 定义,用于抽象具有 static 作用域的函数中的 inline 关键字。
备注不同编译器可能要求不同的 staticinline 关键字顺序(若支持)。

参考:SRS_BSW_00361

8.2.2 函数定义(Function definitions)

8.2.2.1 FUNC 函数标识信息

[SWS_COMPILER_00001]

宏名FUNC
语法#define FUNC(rettype, memclass)
输入参数rettype     函数的返回类型
memclass     函数自身的分类
输出参数
返回值
说明编译器抽象应当定义 FUNC 宏,用于函数的声明和定义,确保特定编译器所要求的正确语法。
备注
配置

参考:SRS_BSW_00003

示例(Cosmic, S12X)

#define <PREFIX>_CODE         @near
#define FUNC(rettype, memclass) memclass rettype

/* 函数声明和定义所需用法: */
FUNC(void, <PREFIX>_CODE) ExampleFunction (void);

[SWS_COMPILER_00058]

此宏的参数列表中不得嵌套其他编译器抽象宏。应改用先前定义的类型作为返回类型,或使用 FUNC_P2CONST/FUNC_P2VAR

参考:SRS_BSW_00306

示例

typedef P2VAR(uint8, AUTOMATIC, <PREFIX>_VAR) NearDataType;
FUNC(NearDataType, <PREFIX>_CODE)
FarFuncReturnsNearPtr(void);

8.2.2.2 FUNC_P2CONST

[SWS_COMPILER_00061]

宏名FUNC_P2CONST
语法#define FUNC_P2CONST(rettype, ptrclass, memclass)
输入参数rettype     函数的返回类型
ptrclass     指针距离的分类
memclass     函数自身的分类
输出参数
返回值
说明编译器抽象应当定义 FUNC_P2CONST 宏,用于声明和定义返回常量指针的函数。

参考:SRS_BSW_00361

[SWS_COMPILER_00062]

FUNC_P2CONST 的参数列表中不得嵌套其他编译器抽象宏。

参考:SRS_BSW_00361

8.2.2.3 FUNC_P2VAR

[SWS_COMPILER_00063]

宏名FUNC_P2VAR
语法#define FUNC_P2VAR(rettype, ptrclass, memclass)
输入参数rettype     函数的返回类型
ptrclass     指针距离的分类
memclass     函数自身的分类
输出参数
返回值
说明编译器抽象应当定义 FUNC_P2VAR 宏,用于声明和定义返回变量指针的函数。

参考:SRS_BSW_00361

[SWS_COMPILER_00064]

FUNC_P2VAR 宏的参数列表中不得嵌套其他编译器抽象宏。

参考:SRS_BSW_00361

8.2.3 指针定义(Pointer definitions)

8.2.3.1 P2VAR

[SWS_COMPILER_00006]

宏名P2VAR
语法#define P2VAR(ptrtype, memclass, ptrclass)
输入参数ptrtype     被引用变量的类型
memclass     指针变量自身的分类
ptrclass     指针距离的分类
输出参数
返回值
说明编译器抽象应当定义 P2VAR 宏,用于声明和定义指向变量的 RAM 中指针。
指针自身可修改(如 ExamplePtr++)。
指针的目标可修改(如 *ExamplePtr = 5)。

参考:SRS_BSW_00361

示例(Metrowerks, S12X)

#define P2VAR(ptrtype, memclass, ptrclass) \
                   ptrclass ptrtype * memclass

/* 指针声明和定义所需用法: */
#define SPI_APPL_DATA @far
#define SPI_VAR_FAST @near

P2VAR(uint8, SPI_VAR_FAST, SPI_APPL_DATA) Spi_FastPointerToApplData;

8.2.3.2 P2CONST

[SWS_COMPILER_00013]

宏名P2CONST
语法#define P2CONST(ptrtype, memclass, ptrclass)
输入参数ptrtype     被引用常量的类型
memclass     指针变量自身的分类
ptrclass     指针距离的分类
输出参数
返回值
说明编译器抽象应当定义 P2CONST 宏,用于声明和定义指向常量的 RAM 中指针。
指针自身可修改(如 ExamplePtr++)。
指针的目标不可修改(只读)。

参考:SRS_BSW_00361

示例

/* Metrowerks, S12X */
#define P2CONST(ptrtype, memclass, ptrclass) \
                   const ptrtype memclass * ptrclass

/* Cosmic, S12X */
#define P2CONST(ptrtype, memclass, ptrclass) \
                   const ptrtype ptrclass * memclass

/* Tasking, ST10 */
#define P2CONST(ptrtype, memclass, ptrclass) \
                   const ptrclass ptrtype * memclass

/* 指针声明和定义所需用法: */
#define EEP_APPL_CONST @far
#define EEP_VAR @near

P2CONST(Eep_ConfigType, EEP_VAR, EEP_APPL_CONST) Eep_ConfigurationPtr;

8.2.3.3 CONSTP2VAR

[SWS_COMPILER_00031]

宏名CONSTP2VAR
语法#define CONSTP2VAR (ptrtype, memclass, ptrclass)
输入参数ptrtype     被引用变量的类型
memclass     指针常量自身的分类
ptrclass     指针距离的分类
输出参数
返回值
说明编译器抽象应当定义 CONSTP2VAR 宏,用于声明和定义访问变量的常量指针。
指针自身不可修改(固定地址)。
指针的目标可修改(如 *ExamplePtr = 18)。

参考:SRS_BSW_00361

示例(Tasking, ST10)

#define CONSTP2VAR (ptrtype, memclass, ptrclass) \
                   ptrclass ptrtype * const memclass

/* 所需用法: */
/* 指向应用数据的常量指针 */
CONSTP2VAR (uint8, NVM_VAR, NVM_APPL_DATA)
NvM_PointerToRamMirror = Appl_RamMirror;

8.2.3.4 CONSTP2CONST

[SWS_COMPILER_00032]

宏名CONSTP2CONST
语法#define CONSTP2CONST(ptrtype, memclass, ptrclass)
输入参数ptrtype     被引用常量的类型
memclass     指针常量自身的分类
ptrclass     指针距离的分类
输出参数
返回值
说明编译器抽象应当定义 CONSTP2CONST 宏,用于声明和定义访问常量的常量指针。
指针自身不可修改(固定地址)。
指针的目标不可修改(只读)。

参考:SRS_BSW_00361

8.2.3.5 P2FUNC

[SWS_COMPILER_00039]

宏名P2FUNC
语法#define P2FUNC(rettype, ptrclass, fctname)
输入参数rettype     函数的返回类型
ptrclass     指针距离的分类
fctname     函数名称(或定义类型的名称)
输出参数
返回值
说明编译器抽象应当定义 P2FUNC 宏,用于函数指针的类型定义。

参考:SRS_BSW_00361

8.2.3.6 CONSTP2FUNC

[SWS_COMPILER_00065]

宏名CONSTP2FUNC
语法#define CONSTP2FUNC(rettype, ptrclass, fctname)
输入参数rettype     函数的返回类型
ptrclass     指针距离的分类
fctname     函数名称(或定义类型的名称)
输出参数
返回值
说明编译器抽象应当定义 CONSTP2FUNC 宏,用于函数的常量指针的类型定义。

参考:SRS_BSW_00361

8.2.4 常量定义(Constant definitions)

8.2.4.1 CONST

[SWS_COMPILER_00023]

宏名CONST
语法#define CONST(consttype, memclass)
输入参数consttype     常量的类型
memclass     常量自身的分类
输出参数
返回值
说明编译器抽象应当定义 CONST 宏,用于常量的声明和定义。

参考:SRS_BSW_00309

示例(Cosmic, S12X)

#define CONST(type, memclass) memclass const type

/* 所需用法: */
#define NVM_CONST @gpage

CONST(uint8, NVM_CONST) NvM_ConfigurationData;

8.2.5 变量定义(Variable definitions)

8.2.5.1 VAR

[SWS_COMPILER_00026]

宏名VAR
语法#define VAR(vartype, memclass)
输入参数vartype     变量的类型
memclass     变量自身的分类
输出参数
返回值
说明编译器抽象应当定义 VAR 宏,用于变量的声明和定义。

参考:SRS_BSW_00361

示例(Tasking, ST10)

#define VAR(type, memclass) memclass type

/* 所需用法: */
#define NVM_FAST_VAR _near

VAR(uint8, NVM_FAST_VAR) NvM_VeryFrequentlyUsedState;

8.3 类型定义

不适用。

8.4 函数定义

不适用。

8.5 回调通知

不适用。

8.6 调度函数

不适用。

8.7 期望接口

不适用(8.7.1/8.7.2/8.7.3 均不适用)。

8.8 服务接口

不适用(8.8.1–8.8.5 均不适用)。

9 时序图(Sequence diagrams)

不适用。

10 配置规范(Configuration specification)

编译器抽象没有独立的配置接口(即没有单独的参数定义)。取而代之的是,内存映射(见 [13])的配置已扩展为本章中描述的参数。

10.1 如何阅读本章

强烈建议同时阅读以下文档:分层软件架构 [3]、ECU 配置规范 [4]。

10.2 容器与配置参数

10.2.1 模块特定内存类

也可以配置模块特定内存类。这通过容器 MemMapAddressingModeSet 及其包含的参数 MemMapCompilerMemClassSymbolImpl 完成。详见 [13]。

10.2.2 全局内存类

也可以配置对所有模块有效的全局内存类。这通过容器 MemMapGenericCompilerMemClass 及其包含的参数 MemMapGenericCompilerMemClassSymbolImpl 完成。详见 [13]。

[SWS_COMPILER_00042]

文件 Compiler.h 对于每个构建场景都是特定的。因此,没有标准化的配置接口。

参考:SRS_BSW_00361

10.3 发布信息(Published Information)

不适用。

11 不适用的需求(Not applicable requirements)

[SWS_COMPILER_00999]

以下需求对本规范不适用

SRS_BSW_00300SRS_BSW_00301SRS_BSW_00302SRS_BSW_00305SRS_BSW_00307SRS_BSW_00308SRS_BSW_00309SRS_BSW_00310SRS_BSW_00312SRS_BSW_00314SRS_BSW_00323SRS_BSW_00325SRS_BSW_00327SRS_BSW_00330SRS_BSW_00331SRS_BSW_00333SRS_BSW_00334SRS_BSW_00335SRS_BSW_00336SRS_BSW_00339SRS_BSW_00341SRS_BSW_00342SRS_BSW_00343SRS_BSW_00344SRS_BSW_00346SRS_BSW_00350SRS_BSW_00353SRS_BSW_00357SRS_BSW_00358SRS_BSW_00359SRS_BSW_00360SRS_BSW_00369SRS_BSW_00371SRS_BSW_00373SRS_BSW_00375SRS_BSW_00377SRS_BSW_00378SRS_BSW_00380SRS_BSW_00385SRS_BSW_00386SRS_BSW_00390SRS_BSW_00392SRS_BSW_00393SRS_BSW_00394SRS_BSW_00395SRS_BSW_00398SRS_BSW_00399SRS_BSW_00004SRS_BSW_00400SRS_BSW_00401SRS_BSW_00404SRS_BSW_00405SRS_BSW_00406SRS_BSW_00407SRS_BSW_00408SRS_BSW_00409SRS_BSW_00410SRS_BSW_00411SRS_BSW_00413SRS_BSW_00414SRS_BSW_00415SRS_BSW_00416SRS_BSW_00417SRS_BSW_00419SRS_BSW_00422SRS_BSW_00423SRS_BSW_00424SRS_BSW_00425SRS_BSW_00426SRS_BSW_00427SRS_BSW_00428SRS_BSW_00429SRS_BSW_00432SRS_BSW_00433SRS_BSW_00005SRS_BSW_00007SRS_BSW_00009SRS_BSW_00010SRS_BSW_00158SRS_BSW_00161SRS_BSW_00162SRS_BSW_00164SRS_BSW_00167SRS_BSW_00168SRS_BSW_00170SRS_BSW_00171SRS_BSW_00172SRS_BSW_00351SRS_BSW_00383SRS_BSW_00388SRS_BSW_00389SRS_BSW_00396SRS_BSW_00403SRS_BSW_00412SRS_BSW_00448SRS_BSW_00449SRS_BSW_00452SRS_BSW_00453SRS_BSW_00454SRS_BSW_00456SRS_BSW_00457SRS_BSW_00458SRS_BSW_00459SRS_BSW_00461SRS_BSW_00462SRS_BSW_00466SRS_BSW_00469SRS_BSW_00470SRS_BSW_00471SRS_BSW_00472SRS_BSW_00473SRS_BSW_00478SRS_BSW_00479SRS_BSW_00480SRS_BSW_00481SRS_BSW_00482SRS_BSW_00483

📋 校对记录

校对轮次:L1 自动校对(2026-06-13)