1 介绍与功能概述(Introduction and functional overview)
本文档规范了用于抽象编译器特定关键字的宏,这些关键字用于声明和定义中的数据和代码寻址。
主要是针对 16 位平台(例如 Cosmic 和 Metrowerks for S12X、Tasking for ST10)的编译器使用特殊关键字来处理微控制器架构的特性,原因在于 16 位地址范围的限制。如果不将内存模型调整为 large 或 huge,编译器的分页(paging)和扩展寻址(用于访问 64K 边界以外的内存)等特性不会被自动启用。数据和代码的位置必须通过特殊关键字显式选择。如果直接在源代码中使用这些关键字,将导致每次移植到新的微控制器系列时都必须修改软件,违反了源代码的平台无关性要求。
如果默认将内存模型切换为 large 或 huge(以规避上述问题),则项目将承受增加的代码大小。
本文档规范了一个三步概念:
- 文件
Compiler.h提供用于封装定义和声明的宏。 - 每个单独的模块必须至少区分以下不同的内存类和指针类。每个类由一个
#define表示。 - 文件
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 Modules | AUTOSAR_TR_BSWModuleList.pdf |
| [2] | General Requirements on Basic Software Modules | AUTOSAR_SRS_BSWGeneral.pdf |
| [3] | Layered Software Architecture | AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf |
| [4] | Specification of ECU Configuration | AUTOSAR_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 Modules | AUTOSAR_SWS_BSWGeneral.pdf |
| [13] | Specification of Memory Mapping | AUTOSAR_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
以下说明描述了与其他间接链接模块的连接:
- 注 1:编译器抽象用于配置元素(指针、变量、函数等)的可寻址性。
- 注 2:内存映射用于执行内存的分段。用户可以为优化源代码而定义段。
- 注 3:链接器设置负责将元素分类到相应的内存段。
6 需求追溯(Requirements traceability)
本规范中实际有效的 SRS 需求追溯如下:
| SRS 需求 | 由以下满足 |
|---|---|
SRS_BSW_00003:所有软件模块应当提供版本和标识信息 | SWS_COMPILER_00001 |
SRS_BSW_00004:所有基础软件模块应当对所包含的头文件版本进行预处理检查 | SWS_COMPILER_00999 |
SRS_BSW_00006:MCAL 之上模块的源代码不应是处理器/编译器相关的 | SWS_COMPILER_00010、SWS_COMPILER_00035、SWS_COMPILER_00036 |
SRS_BSW_00306:AUTOSAR 基础软件模块应是编译器/平台无关的 | SWS_COMPILER_00010、SWS_COMPILER_00035、SWS_COMPILER_00036、SWS_COMPILER_00058、SWS_COMPILER_00062、SWS_COMPILER_00064 |
SRS_BSW_00328:所有 AUTOSAR 基础软件模块应当避免代码重复 | SWS_COMPILER_00048 |
SRS_BSW_00347:不同实例的 BSW 驱动命名应分离 | SWS_COMPILER_00050 |
SRS_BSW_00348:AUTOSAR 标准类型应放在标准类型头文件中 | SWS_COMPILER_00003、SWS_COMPILER_00004 |
SRS_BSW_00361:所有非标准化关键字的映射应放在编译器特定类型和关键字头文件中 | SWS_COMPILER_00003、SWS_COMPILER_00004、SWS_COMPILER_00040、SWS_COMPILER_00041、SWS_COMPILER_00046、SWS_COMPILER_00047、SWS_COMPILER_00053、SWS_COMPILER_00054、SWS_COMPILER_00055、SWS_COMPILER_00057、SWS_COMPILER_00059、SWS_COMPILER_00060、SWS_COMPILER_00061、SWS_COMPILER_00062、SWS_COMPILER_00063、SWS_COMPILER_00064、SWS_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_00004、SWS_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 支持的所有可能编译器!
| 平台 | 编译器 | 编译器符号 |
|---|---|---|
| S12X | Code Warrior | _CODEWARRIOR_C_S12X_ |
| S12X | Cosmic | _COSMIC_C_S12X_ |
| TC1796/TC1766 | Tasking | _TASKING_C_TRICORE_ |
| ST10 | Tasking | _TASKING_C_ST10_ |
| ST30 | ARM Developer Suite | _ADS_C_ST30_ |
| V850 | Greenhills | _GREENHILLS_C_V850_ |
| MPC5554 | Diab Data | _DIABDATA_C_ESYS_ |
| TMS470 | Texas Instruments | _TEXAS_INSTRUMENTS_C_TMS470_ |
| ARM | Texas 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> 的组成:
- 对于 BSW 模块:按
<snp>[_<vi>_<ai>]构成,其中:<snp>是段名前缀(Section Name Prefix):- 若 BSW 模块描述或软件组件描述中的
MemorySection未定义SectionNamePrefix,则<snp>应为BswModuleDescription的shortName转换为大写字母。 - 若定义了
SectionNamePrefix,则<snp>应为与MemorySection关联的SectionNamePrefix的符号。
- 若 BSW 模块描述或软件组件描述中的
<vi>是 BSW 模块的vendorId。<ai>是 BSW 模块的vendorApiInfix。
方括号中的子部分
[_<vi>_<ai>]在 BSW 模块未定义vendorApiInfix(即不使用多实例化)时省略。 - 对于软件组件:
<PREFIX>是软件组件类型的shortName(大小写敏感)。
<INIT_POLICY>(变量的初始化策略)的取值包括:
NO_INIT:用于从不清除且从不初始化的变量;CLEARED:用于在每次复位后清零的变量;POWER_ON_CLEARED:用于仅在上电复位后清零的变量;INIT:用于在每次复位后用值初始化的变量;POWER_ON_INIT:用于仅在上电复位后用值初始化的变量。
| 内存类型 | 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 中指定。这对生成代码尤其重要:
- 若
MemorySection未定义memClassSymbol属性,则<NAME>为所引用SwAddrMethod的shortName(大小写敏感)。 - 仅对 BSW:若定义了
memClassSymbol属性,则<NAME>为MemorySection的memClassSymbol(大小写敏感)。
[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:这些定义可用于在不同编译器实现间切换,例如:
- 驱动中的内联汇编片段;
- 用于内存对齐控制的特殊 pragma;
- 函数调用的本地化;
- 对内存模型的适配。
参考:SRS_BSW_00306, SRS_BSW_00006
符号清单见 7.1.1 节。
[SWS_COMPILER_00030]
Compiler.h 应当提供支持的编译器厂商和适用编译器版本的信息。
参考:SRS_BSW_00374
[SWS_COMPILER_00035]
宏参数 memclass 和 ptrclass 不得填充编译器特定的关键字,而应当填充 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 中定义的宏的模块/组件特定参数(ptrclass 和 memclass)。见 SWS_COMPILER_00040 中关于内存类型和所需语法的说明。
参考:SRS_BSW_00361, SRS_BSW_00464
[SWS_COMPILER_00054]
模块特定扩展元素应当在名称中包含 BSW 模块的模块缩写。应用软件组件特定扩展元素应当包含软件组件类型的名称。
参考:SRS_BSW_00456
7.1.5 综合示例(Comprehensive example)
本示例展示了一个 API 函数中宏的定义、使用和配置位置。
- 模块:
Eep - API 函数:
Eep_Read - 平台:S12X
- 编译器:Cosmic
文件 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.h、Std_Types.h、Platform_Types.h。
AUTOSAR 集成商:接收并检查包、集成模块、将各模块的Compiler_Cfg.h集成到主Compiler_Cfg.h中、配置<Mip>_MemMap.h和Compiler_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]
| Define | AUTOMATIC |
|---|---|
| 取值范围 | "empty"(空) |
| 说明 | 内存类 AUTOMATIC 应当以空定义的形式提供,用于局部指针的声明。 |
| 备注 | SWS_COMPILER_00040 |
参考:SRS_BSW_00361
8.2.1.2 内存类 TYPEDEF
[SWS_COMPILER_00059]
| Define | TYPEDEF |
|---|---|
| 取值范围 | "empty"(空) |
| 说明 | 内存类 TYPEDEF 应当以空定义形式提供。该内存类应当用于无法指定内存限定符的类型定义中。例如在用 P2VAR 等宏定义指针类型时,宏需要两个参数:第一个参数(指向的内存位置的距离)可在类型定义中指定;但第二个参数(指针自身的内存分配)此时无法定义。因此应当使用内存类 TYPEDEF。 |
| 备注 | SWS_COMPILER_00040 |
参考:SRS_BSW_00404
8.2.1.3 NULL_PTR
[SWS_COMPILER_00051]
| Define | NULL_PTR |
|---|---|
| 取值范围 | void 指针 ((void *)0) |
| 说明 | 编译器抽象应当提供一个定义为指向零的 void 指针的 NULL_PTR。 |
| 备注 | SWS_COMPILER_00040 |
参考:SRS_BSW_00480
8.2.1.4 INLINE
[SWS_COMPILER_00057]
| Define | INLINE |
|---|---|
| 取值范围 | inline/空 |
| 说明 | 编译器抽象应当提供 INLINE 定义以抽象关键字 inline。 |
| 备注 | SWS_COMPILER_00040 |
参考:SRS_BSW_00361
8.2.1.5 LOCAL_INLINE
[SWS_COMPILER_00060]
| Define | LOCAL_INLINE |
|---|---|
| 取值范围 | static inline/空 |
| 说明 | 编译器抽象应当提供 LOCAL_INLINE 定义,用于抽象具有 static 作用域的函数中的 inline 关键字。 |
| 备注 | 不同编译器可能要求不同的 static 与 inline 关键字顺序(若支持)。 |
参考: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_00300、SRS_BSW_00301、SRS_BSW_00302、SRS_BSW_00305、SRS_BSW_00307、SRS_BSW_00308、SRS_BSW_00309、SRS_BSW_00310、SRS_BSW_00312、SRS_BSW_00314、SRS_BSW_00323、SRS_BSW_00325、SRS_BSW_00327、SRS_BSW_00330、SRS_BSW_00331、SRS_BSW_00333、SRS_BSW_00334、SRS_BSW_00335、SRS_BSW_00336、SRS_BSW_00339、SRS_BSW_00341、SRS_BSW_00342、SRS_BSW_00343、SRS_BSW_00344、SRS_BSW_00346、SRS_BSW_00350、SRS_BSW_00353、SRS_BSW_00357、SRS_BSW_00358、SRS_BSW_00359、SRS_BSW_00360、SRS_BSW_00369、SRS_BSW_00371、SRS_BSW_00373、SRS_BSW_00375、SRS_BSW_00377、SRS_BSW_00378、SRS_BSW_00380、SRS_BSW_00385、SRS_BSW_00386、SRS_BSW_00390、SRS_BSW_00392、SRS_BSW_00393、SRS_BSW_00394、SRS_BSW_00395、SRS_BSW_00398、SRS_BSW_00399、SRS_BSW_00004、SRS_BSW_00400、SRS_BSW_00401、SRS_BSW_00404、SRS_BSW_00405、SRS_BSW_00406、SRS_BSW_00407、SRS_BSW_00408、SRS_BSW_00409、SRS_BSW_00410、SRS_BSW_00411、SRS_BSW_00413、SRS_BSW_00414、SRS_BSW_00415、SRS_BSW_00416、SRS_BSW_00417、SRS_BSW_00419、SRS_BSW_00422、SRS_BSW_00423、SRS_BSW_00424、SRS_BSW_00425、SRS_BSW_00426、SRS_BSW_00427、SRS_BSW_00428、SRS_BSW_00429、SRS_BSW_00432、SRS_BSW_00433、SRS_BSW_00005、SRS_BSW_00007、SRS_BSW_00009、SRS_BSW_00010、SRS_BSW_00158、SRS_BSW_00161、SRS_BSW_00162、SRS_BSW_00164、SRS_BSW_00167、SRS_BSW_00168、SRS_BSW_00170、SRS_BSW_00171、SRS_BSW_00172、SRS_BSW_00351、SRS_BSW_00383、SRS_BSW_00388、SRS_BSW_00389、SRS_BSW_00396、SRS_BSW_00403、SRS_BSW_00412、SRS_BSW_00448、SRS_BSW_00449、SRS_BSW_00452、SRS_BSW_00453、SRS_BSW_00454、SRS_BSW_00456、SRS_BSW_00457、SRS_BSW_00458、SRS_BSW_00459、SRS_BSW_00461、SRS_BSW_00462、SRS_BSW_00466、SRS_BSW_00469、SRS_BSW_00470、SRS_BSW_00471、SRS_BSW_00472、SRS_BSW_00473、SRS_BSW_00478、SRS_BSW_00479、SRS_BSW_00480、SRS_BSW_00481、SRS_BSW_00482、SRS_BSW_00483。