P3 batch translation + project complete: 24 PDFs (RTE + Libraries + GlobalTime + HMI + Chassis + Powertrain + Tools + ReleaseDocumentation). All 216 PDFs now translated. 173K+ lines total.

This commit is contained in:
opencode-translator
2026-06-13 10:43:16 +08:00
parent 784f11ab73
commit f5197069cb
26 changed files with 17233 additions and 91 deletions
@@ -0,0 +1,528 @@
# EXP_MacroEncapsulationofInterpolationCalls — 插值调用宏封装说明
| 文档元信息 | 值 |
|------------|------|
| 文档标题 | Macro Encapsulation of Interpolation Calls(插值调用的宏封装) |
| 文档所有者 | AUTOSAR |
| 文档责任方 | AUTOSAR |
| 文档标识号 | 808 |
| 文档状态 | Final(最终版) |
| 所属 AUTOSAR 标准 | Classic Platform(经典平台) |
| 所属标准发布版本 | 4.4.0 |
| 发布版本 | AUTOSAR CP 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 | 初始发布 |
---
## 目录
1. [缩略语与缩写](#1-缩略语与缩写)
2. [相关文档](#2-相关文档)
- 2.1 [输入文档](#21-输入文档)
- 2.2 [相关规范](#22-相关规范)
3. [引言](#3-引言)
4. [动机](#4-动机)
5. [免责声明](#5-免责声明)
6. [用例](#6-用例)
- 6.1 [生成封装宏](#61-生成封装宏)
- 6.2 [使用封装宏](#62-使用封装宏)
7. [解决方案建议](#7-解决方案建议)
- 7.1 [术语定义](#71-术语定义)
- 7.2 [架构组件](#72-架构组件)
- 7.3 [功能描述](#73-功能描述)
---
## 1 缩略语与缩写
| 缩写 | 描述 |
|------|------|
| **DEM** | Diagnostic Event Manager(诊断事件管理器) |
| **DET** | Default Error Tracer(默认错误追踪器) |
## 2 相关文档
### 2.1 输入文档
- [1] AUTOSAR Layered Software Architecture, AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
- [2] AUTOSAR General Requirements on Basic Software Modules, AUTOSAR_SRS_BSWGeneral.pdf
- [3] AUTOSAR General Specification for Basic Software Modules, AUTOSAR_SWS_BSWGeneral.pdf
- [4] AUTOSAR Methodology, AUTOSAR_TR_Methodology.pdf
- [5] Requirements on Software Component Template, AUTOSAR_RS_SoftwareComponentTemplate.pdf
### 2.2 相关规范
- [1] Specification of Fixed Point Interpolation Routines, AUTOSAR_SWS_IFXLibrary.pdf
- [2] Specification of Floating Point Interpolation Routines, AUTOSAR_SWS_IFLLibrary.pdf
- [3] Specification of Run Time Environment, AUTOSAR_SWS_RTE.pdf
## 3 引言
插值例程被应用软件用于从已知点计算未知点。现有 AUTOSAR 插值例程支持两类功能:曲线(1D)和映射(2D)插值,包括整数和浮点两种实现。它为每个类别支持两种方法:插值和查找。此外,还支持称为曲线/映射组以及具有两种不同计算公式的固定曲线/映射的特殊变体,这些变体可以是插值(或)查找。
插值例程是应用软件中频繁使用的例程。因此,插值例程的设计对软件开发工作有重大影响,将首先通过优化解决。说明文档"插值调用的宏封装"的开发旨在指导应用程序开发人员执行简化的 AUTOSAR 兼容和资源优化的插值例程调用。
## 4 动机
说明文档"MacroEncapsulationofInterpolationCalls"的动机是通过引入单一源原则简化例程处理。这将减少维护工作并避免错误使用导致 bug。它们是降低成本和提高质量的基础。
## 5 免责声明
本说明文档将库调用的宏封装表示为减少调用数学插值功能的应用程序开销的可能方法之一。本文档不强制用户仅使用宏封装进行插值调用。
## 6 用例
### 6.1 生成封装宏
文档 AUTOSAR_TR_Methodology R4.2 说明了生成原子软件组件头文件的一般方法(图 1)。所提出的封装宏应保存在与"Application Header File"类似的"Encapsulation Macros Header File"中。
**图 1:生成原子软件组件契约头文件**
图 2 显示了与应用程序头文件的生成过程并行的生成过程。标记的块表示新增部分。宏封装生成器工具可作为组件 API 生成器工具(RTE)的附加组件来实现。两种工具的输入均来自 VFB 原子软件组件和软件组件内部行为的信息。
生成的封装宏需要来自应用程序头文件的接口,例如以获取对曲线和映射的访问。因此,宏封装概念必须知道 RTE 生成接口的语法和结构。所提出的封装宏应保存在与"Application Header File"类似的"Encapsulation Macros Header File"中(参见图 2)。
**图 2:封装宏头文件的生成过程**
### 6.2 使用封装宏
下表显示 IFX 库提供的应通过宏封装概念处理的所有类型的插值服务:
| | Linear | Lookup | Fix (interval) | Fix (shift) | Lookup Fix (interval) | Lookup Fix (shift) |
|------------------|:------:|:------:|:--------------:|:-----------:|:---------------------:|:------------------:|
| Curve | x | x | x | x | x | x |
| Map | x | x | x | x | x | x |
| Grouped Curve | x | x | | | | |
| Grouped Map | x | x | | | | |
| Axis Search | x | | | | | |
下表显示 IFL 库提供的应通过宏封装概念处理的所有类型的插值服务:
| | Linear | Lookup | Fix (interval) | Fix (shift) | Lookup Fix (interval) | Lookup Fix (shift) |
|------------------|:------:|:------:|:--------------:|:-----------:|:---------------------:|:------------------:|
| Curve | x | | | | | |
| Map | x | | | | | |
| Grouped Curve | x | | | | | |
| Grouped Map | x | | | | | |
| Axis Search | x | | | | | |
**插值方法:**
- **Linear(线性)**:考虑两个数据点对结果进行插值
- **Lookup(查找)**:无插值,返回条目数据点
- **Fix(固定)**:无显式轴可用,分布点通过 Offset 和 Shift 或 Offset 和 Interval 计算
- **Lookup Fix(查找固定)**Lookup 和 Fix 的混合
**插值计算:**
- Curve / Map:集成式数据点搜索和插值
- Grouped Curve / Grouped Map:分布式数据点搜索和插值
对于分组插值方法,数据点搜索与插值计算分开。数据点搜索产生一个结构,其中包含索引和比率信息。此信息可用于曲线插值、曲线查找插值、映射插值和映射查找插值。目前,本文档详细说明线性曲线和映射插值。其他类型的插值可以类似处理,但本文档中未作规定。
## 7 解决方案建议
### 7.1 术语定义
本概念将提供一个额外的头文件,即"Encapsulation Macros Header File"。它包含生成的宏,用于封装曲线和映射插值例程的调用。
没有提供其他新术语。
### 7.2 架构组件
#### 7.2.1 封装宏头文件
| 项 | 内容 |
|----|------|
| **Artifact(工件)** | Encapsulation Macros Header File |
| **Package(包)** | AUTOSAR Root::M2::Methodology::MethodologyLibrary::Component::Work Products |
| **Brief(简要)** | Header generated for an AtomicSoftwareComponentType from Macro Encapsulation Generator Tool after the RTE contract phase. |
| **Description(描述)** | Header generated for an AtomicSoftwareComponentType from Macro Encapsulation Generator Tool after the RTE contract phase. It represents the complete encapsulation macro interfaces between the component code and the RTE (calls into the RTE as well as prototypes called by the RTE). All calls of encapsulation interpolation routines are routed through this header. |
| **Kind(类型)** | Code |
| **Relation Type(关系类型)** | Related Element、Mul.(多重性)、Note(备注) |
| | AggregatedByDelivered Software ComponentMul. = 1 |
| | ParameterOutGenerate Atomic Software Component Contract Header FilesMul. = 1Meth.bindingTime = CodeGenerationTime |
| | ParameterInCompile Atomic Software ComponentMul. = 1Meth.bindingTime = CodeGenerationTime |
头的名称将具有以下形式:"`<component>_Elc.h`",其中 `<component>` 是为其生成头的组件的名称。
### 7.3 功能描述
#### 7.3.1 基本概念描述
##### 7.3.1.1 封装概念原理
为说明封装宏,下面演示了曲线插值的处理示例。(给定的名称可能不符合命名约定,因为重点放在概念原理上。)假设特定 SWC 组件的数据规范(VFB 原子软件组件描述)定义了一个名为"IgnitionCurve"的数据原型。此数据原型的类型为 `IgnitionCurveType`,包括其 x 和 y 轴。`ApplicationDataType` 对应于一个 `ImplementationDataType`(例如 "GenericCurve")。此 `ImplementationDataType` 规定了结果结构的详细信息,包括其 `BaseType`(例如曲线值的数据类型为 uint8,x 轴使用 sint16,如下例所示)。
如下所示的插值服务的原型:
```c
uint8 Ifx_IntIpoCur_s16_u8(sint16 Xin, sint16 N, const sint16* X_Array, const uint8* Val_Array)
```
其中:
- `Xin`:输入值
- `N`:轴点数
- `X_Array`:指向 X 分布的指针
- `Val_Array`:指向曲线值的指针
**没有封装概念**的情况下,插值服务必须按以下方式调用:
```c
CurveValue = Ifx_IntIpoCur_s16_u8(X_input, Curve.N, Curve.Axis, Curve.Values);
```
封装概念现在提供了一个宏来封装插值服务调用:
```c
CurveValue = Elc_Get_myRunnable_IgnitionCurve();
```
因为封装宏按如下方式生成:
```c
#define Elc_Get_myRunnable_IgnitionCurve \
Ifx_IntIpoCur_s16_u8(X_input, \
Curve.N, \
Curve.Axis, \
Curve.Values);
```
参数的顺序不是隐式的;需要通过语义映射的显式行为(详情在 7.3.2.3 中定义)。要为插值服务的单个参数提供值和指针,使用 RTE 访问。例如:`Rte_CData()`
##### 7.3.1.2 概念决策
通常有两种类型的参数:
- 第一种类型是曲线或映射的输入值。
- 第二种类型是相应曲线或映射的值和指针。
输入值通常源自表示为 ApplicationDataType 的物理值。但是,在调用插值例程之前,这些输入值可能会被轻微预处理。在这种情况下,使用不通过 RTE 契约阶段的局部变量调用插值例程。需要显式通信,但就资源而言成本很高。这将使插值调用的完整封装变得复杂,应避免。
相应曲线或映射的值和指针的参数不会产生问题。这些参数具有更内部的视图,因为它们源自通过 RecordLayout 描述的曲线或映射的内存表示。
为了限制输入值处理的复杂性,有两种替代方案:
**方案 1**:生成的宏具有输入值的参数
```c
CurveValue = Elc_Get_myRunnable_IgnitionCurve(local_input);
```
```c
CurveValue = Elc_Get_myRunnable_IgnitionCurve(Rte_X_input);
```
**方案 2**:在不带参数的宏调用之前使用临时变量
```c
local_input = X_input;
```
```c
local_input = Rte_X_input;
CurveValue = Elc_Get_myRunnable_IgnitionCurve();
```
在方案 2 中,必须具有临时变量名称的特定知识,因为此变量在生成的宏中是固定的。这可能过于复杂,因此选择方案 1。
注意,这些宏是特定于 SWC 的,因此应应用特定的命名方案。只有曲线或映射的输入值必须由用户提供。插值例程的其余参数和插值例程本身从生成的宏封装。此信息可以从数据规范中提取。使用此方法可消除由不一致定义引起的错误引入。此外,SWC 组件的软件开发人员可以完全从存储分配和例程分配(自动执行)中解放出来。因此,软件开发工作显著减少。
##### 7.3.1.3 宏生成所需的信息
基于第 7 章中的概念决策,要生成的宏如下所示。
(曲线示例):
```c
#define Elc_Get_{Runnable}_{Accesspoint} {RoutineName}((X), \
{ImplTypeStruct}.{N}, \
{ImplTypeStruct}.{Axis}, \
{ImplTypeStruct}.{Values}
```
要生成此宏,需要以下信息:
- **生成的宏的名称**`Elc_Get_myRunnable_{NameOfAccessPoint}`。生成的宏是针对每个访问点单独生成的。
- **插值例程的名称**`{RoutineName}`。插值例程的名称取决于插值例程的类型以及轴和输出值的数据类型。轴和插值输出值的数据类型的每种组合都具有单独的实现和插值例程的单独名称。创建插值例程的名称是此概念中最复杂的部分。
例如,必须区分以下曲线插值例程:
```
Ifx_IntIpoCur_U8_U8
Ifx_IntIpoCur_U8_U16
Ifx_IntIpoCur_U8_S8
Ifx_IntIpoCur_U8_S16
Ifx_IntIpoCur_U16_U8
Ifx_IntIpoCur_U16_U16
Ifx_IntIpoCur_U16_S8
Ifx_IntIpoCur_U16_S16
Ifx_IntIpoCur_S8_U8
Ifx_IntIpoCur_S8_U16
Ifx_IntIpoCur_S8_S8
Ifx_IntIpoCur_S8_S16
Ifx_IntIpoCur_S16_U8
Ifx_IntIpoCur_S16_U16
Ifx_IntIpoCur_S16_S8
Ifx_IntIpoCur_S16_S16
```
- **插值例程的参数**`{ImplTypeStruct}.{N}` 等。提供插值例程的参数。RTE 根据 `ImplementationDataType` 和基于 `SwRecordLayout` 生成一个结构。宏封装工具必须生成对轴点数、轴以及曲线或映射值的访问。插值例程所需的指针数量因插值类型而异。
轴点数的数据类型具有特殊相关性。不需要显式定义此信息,但必须在 ImplementationDataType 中严格定义。第 7.3.1.9 章给出了定义分布点数数据类型的规则。
##### 7.3.1.4 获取宏生成信息的概述
图 3 说明了宏封装概念工作流的粗略概述。图片预示哪些信息必须由概念准备,哪些信息在 AUTOSAR 的元模型中仍然可用。
**图 3:基于元模型的封装概念工作流概述**
从 DataAccessPoint 开始,必须收集所有信息以生成封装插值例程调用的宏。在 DataAccessPoint,可以知道将使用哪个插值例程以及哪些值应为插值例程的输入和输出。访问点的名称可以直接从 DataAccessPoint 中选择。插值例程的名称取自 BswModuleEntry。BswModuleEntry 通过 `InterpolationRoutineMapping`、`RecordLayout` 和 `ApplicationDataTypes` 与 DataAccessPoint 相关联。RTE 访问宏和数据类型可以从通过 `DataTypeMap` 和 `ApplicationDataTypes` 链接到 DataAccessPoint 的 `ImplementationDataTypes` 派生。
插值例程根据输入和输出值的数据类型而变化。到目前为止,没有 AUTOSAR SWS 描述使用 ApplicationDatatypes、SwRecordlayouts 和 ImplementationDataTypes 相对应的插值例程指定 BswModuleEntry 的完整机制。为了使宏封装概念可以使用 BswModuleEntry 的内容,必须定义它。如何执行此操作的概念将在下一章中描述。
##### 7.3.1.5 非歧义 InterpolationRoutineMapping
在某些场景下,InterpolationRoutineMapping 不明确,相同的 RecordLayout 适合多个插值函数。在此场景中,从数据规范的角度看,宏封装工具不清楚使用哪种插值例程。曲线或映射可以插值或仅使用查找行为。原因在于曲线或映射在内存中的数据在两种情况下仍然相同。用户仅在 ARXML 中指定曲线或映射的数据和属性,然后在代码中通过调用相关插值例程来选择插值的种类。
例如:`Ifx_IntIpoCur_s16_s16` 和 `Ifx_IntLkUpCur_s16_s16`。
这种非歧义场景的可能解决方案是,宏封装工具为不同的插值例程生成多个宏。在这种情况下,宏应具有不同的名称以区分不同种类的插值例程。
示例,考虑 `Ifx_IntIpoCur_s16_s16` 和 `Ifx_IntLkUpCur_s16_s16`
```c
#define Elc_Get_myRunnable_IgnitionCurve_Ipo \
Ifx_IntIpoCur_s16_s16(X_input, \
Curve.N, \
Curve.Axis, \
Curve.Values);
#define Elc_Get_myRunnable_IgnitionCurve_Lkup \
Ifx_IntLkUpCur_s16_s16(X_input, \
Curve.N, \
Curve.Axis, \
Curve.Values);
```
用户现在可以调用:
```c
CurveValue = Elc_Get_myRunnable_IgnitionCurve_Ipo(); // 用于插值方法
// 或
CurveValue = Elc_Get_myRunnable_IgnitionCurve_Lkup(); // 用于查找方法
```
##### 7.3.1.6 BswModuleEntry 的一般信息
BswModuleEntry 表示 BSW 模块或集群的单个 API 入口(C 函数原型)。对于 IFX 和 IFLBswModuleEntry 是对插值例程的引用,并源自 AUTOSAR 在 SWS 文档中定义的插值 API。
例如,`IntIpoCur_u16_u16` 对应于 API `Ifx_IntIpoCur_u16_u16`。
更多信息可在 AUTOSAR 蓝图文件中的 `AUTOSAR_MOD_GeneralBlueprints.zip` 中的以下文件获得:
- `AUTOSAR_MOD_BswModuleEntrys_Blueprint.arxml`
- `AUTOSAR_MOD_IFX_RecordLayout_Blueprint.arxml`
- `AUTOSAR_MOD_IFL_RecordLayout_Blueprint.arxml`
图 4 和图 5 描述了具有不同焦点的完整概述。
**图 4:用于查找正确 BswModuleEntry 的完整元模型概述**
**图 5:专注于 SwCalprms 的完整元模型概述,用于查找正确的 BSWModuleEntry**
##### 7.3.1.7 插值例程和记录布局
记录布局和插值例程之间的关系在 `InterpolationRoutineMappingSet` 中规定。插值例程表示为 `BswModuleEntry` 并实现特定的插值方法,该方法在 `InterpolationRoutine` 的 `shortLabel` 中表示。预期的插值方法在 `SwDataDefProps` 的 `InterpolationMethod` 中表示。
图 6 显示了将记录布局映射到特定插值例程的元模型(注意:此图取自 `AUTOSAR_TPS_SoftwareComponentTemplate` 说明,5.53)。
**图 6:记录布局和插值例程的映射**
图 7 显示了实现为两个连续数组的曲线。曲线或映射的结构和内存表示在数据规范级别上通过 `RecordLayout` 描述。图 7 取自 `AUTOSAR_TPS_SoftwareComponentTemplate`,图 5.48。
**图 7:实现为两个连续数组的曲线**
##### 7.3.1.8 插值例程名称的结构
插值例程的名称具有基于固有语义的定义构建约定。
**示例:**
- `Ifx_IntIpoCur_u8_s8`
- `Ifl_IntIpoMap_f32f32_f32`
名称的结构如下:
```
{ModuleID}_{Method}{Type}_{InputDataType(s)}_{OutputDataType}
```
各个命名部分的描述如下:
- **{ModuleID}**
仅有两个可能的模块 ID
- "Ifx" 表示整数插值
- "Ifl" 表示浮点插值
不打算混合整数和浮点插值。
- **{Method}**
有不同的方法可用。建议使用转换映射以获得特定方法与插值例程名称的方法部分之间的映射。该方法在 `ApplicationDataType.interpolationMethod` 中描述。
例如:Linear → IntIpoLookup → IntLkUp
- **{Type}**
如果必须对曲线或映射执行插值,则可以通过 `ApplicationDataType.category` 的类别进行选择。
类别 CURVE → CurMAP → Map
- **{InputDataType(s)}**
借助 `ImplementationDataTypeElements`,可以识别输入的数据类型。此外,轴的类型可以通过 `DataTypeMap` 从 `ApplicationDataTypes.valueAxisDataType` 的数据类型派生。
图 8 可视化了 DataTypes 和 SwRecordLayouts 之间的依赖关系,取自 `AUTOSAR_TPS_SoftwareComponentTemplate` 图 5.33。
**图 8DataTypes 和 SwRecordLayouts 的依赖关系**
提示:轴值的数据类型可能与曲线的输入值的数据类型不同。
- **{OutputDataType}**
输出数据类型取决于访问点的数据类型。
- 有了这个原则,BswModuleEntry 可以在 `InterpolationRoutineMapping` 内填充。宏封装生成器工具可以假定插值例程的名称存在于 BswModuleEntry 中。
##### 7.3.1.9 轴点数的数据类型
宏封装概念不需要显式使用此数据类型,但插值例程对轴点数的参数应用特殊的数据类型。此外,轴点数是位于内存中以及曲线或映射的轴和值的元素。因此,当从 ApplicationDataType 派生 ImplementationDataType 时,必须定义轴点数的数据类型。
确定轴点数的数据类型的规则非常简单:轴点数获得与第一个轴相同的数据类型。
**对曲线的影响:**
曲线只有一个轴。因此,轴点数的数据类型与 x 轴相同。如果 x 轴是 sint8 轴,则轴点数也将是 sint8 数据类型。显然,负的轴点数没有意义,但 127 个轴点应该足够。如果轴是 uint8、sint16 或 uin16 类型,则轴点数也使用相同的数据类型。
**对映射的影响:**
映射有两个轴。这里 x 和 y 轴的轴点数获得 x 轴的数据类型。这样做是为了避免 ImplementationDataType 定义中的填充字节。要进一步理解这一点,必须进行定义。ImplementationDataType 内元素的顺序具有明确定义的序列。首先必须定义具有轴点数的元素,然后是轴/轴,最后定义曲线或映射的值。ImplementationDataType 的实现可以作为结构或数组完成。示例:
```c
Struct
{
uint8 Nx;
uint8 Ny;
uint8 AxisX[];
uint16 AxisY[];
sint8 Values[];
} Map;
```
假设使用具有自然对齐的处理器("自然对齐"意味着任何元素至少与自身大小的倍数对齐。例如,4 字节对象与 4 的倍数地址对齐,8 字节对象与 8 的倍数地址对齐,等等)内存元素,Nx 和 Ny 之间不需要间隙字节。如果 Ny 与 Y 轴的类型相同,则 Nx 和 Ny 之间会有一个填充字节。
#### 7.3.2 宏封装概念的实现
本章介绍如何生成封装宏以及如何获取所需的信息。本章参考第 7.3.1.3 章,其中描述了宏封装所需的信息。
必须生成三部分:
- 封装宏的名称
- 插值例程的名称
- 插值例程的参数
生成的宏的抽象形式:
```c
#define {NameOfMacro} {RoutineName}((X),{Parameters})
```
生成的宏的详细信息(使用曲线的示例):
```c
#define Elc_Get_{Runnable}_{NameOfAcessPoint} {RoutineName}(X)((X), \
{RteAccess}.{N}, \
{RteAccess}.{Axis}, \
{RteAccess}.{Values}
```
##### 7.3.2.1 封装宏名称的生成
封装宏的名称源自访问点的名称和根据以下模式的后缀:
```
Elc_Get_{NameOfRunnable}_{NameOfAcessPoint}
```
在此上下文中,图 9 显示了对校准端口的可运行访问。此图取自 `AUTOSAR_TPS_SoftwareComponentTemplate`7.29。
**图 9:可运行实体对校准端口的访问**
##### 7.3.2.2 插值例程名称的生成
插值例程的名称在元模型中定义为 BSWModuleEntry。宏封装生成器工具必须按以下顺序解析元模型以获取插值例程的名称:
1. 从 DataAccess → RunnableEntity → ParameterAccess 开始
2. 通过 AutosarParameterRef 可以找到 DataPrototype
3. 通过 AutosarDataPrototype 可以找到 AutosarDataType
4. AutosarDataType 与 SwDataDefProps 有关系
5. 通过 SwDataDefProps 选择 SwRecordLayout
6. 通过 SwRecordLayout 和 InterpolationRoutineMapping 以及 InterpolationRoutine,可以在 BSWModuleEntry 中找到所需的插值例程候选调用。
7. 最后,通过匹配 ImplementationDataType 的数据类型来确定适当的 InterpolationRoutine。
名称的结构如下:
```
{ModuleID}_{Method}{Type}_{InputDataType(s)}_{OutputDataType}
```
##### 7.3.2.3 类别为 STRUCTURE 的 ImplementationDataType 的插值例程参数生成
如第 7.3.1.2 章概念决策中所决定的,曲线或映射插值的输入变量未封装。通常,它们可通过 `DataAccess.dataDefProperties.swCalprmAxisSet.variableRef` 获得。
仅生成轴点数、轴指针和曲线或映射值指针的参数。要获取这些参数,使用 RTE 生成的信息。
RTE 根据作为相应曲线或映射的 SwRecordLayout 基础的 ImplementationDataType 生成 typedef 和结构。宏封装生成器工具必须知道与 RTE 相同的方法,以便从 ImplementationDataType 派生 typedef 和结构以能够使用该信息。
默认情况下,RTE 为类别属性设置为"STRUCTURE"的每个 ImplementationDataType 在 RTE 数据类型头文件 `Rte_Type.h` 中生成以下 typedef。这在"RTE Contract"和"RTE Generation"阶段完成。
```c
typedef struct { <elements> } <name>;
```
其中 `<elements>` 是记录元素规范,`<name>` 是结构实现数据类型的 `shortName`。对于由一个 `ImplementationDataTypeElement` 定义的每个记录元素,定义一个记录元素规范 `<elements>`。记录元素规范根据输入配置中相关 `ImplementationDataTypeElements` 的顺序排序。后续记录元素用分号分隔。RTE 确保结构及其元素的名称是唯一的。不使用前缀 `Rte_`,因为类型名称表示 AUTOSAR 数据类型。
基于这样的 typedef,在 `Rte.c` 文件中生成一个定位结构。使用标准 RTE 访问来寻址结构的元素。
需要澄清的一点是如何将 ImplementationDataType 的元素映射到插值例程的关联参数。一方面,ImplementationDataType 的元素可以以任意顺序定义,另一方面,插值例程的参数顺序是固定的。必须有一个映射,使得 ImplementationDataType 的元素适合插值例程的正确参数。例如,描述轴点数的元素必须适合具有相同表示的插值例程的参数。
要处理此关系,有两种可能的处理方法:
- 在元模型中需要新的映射,以定义关于 ImplementationDataType 的相应元素的参数序列顺序
- 或者必须定义命名约定以具有特定元素行为的定义良好的名称
将选择命名约定,因为它更易于定义和实现,并且元模型不需要扩展。下表显示了 ImplementationDataType 的串联和插值例程参数的命名约定。
| 参数 | 定义的名称 |
|------|------------|
| x 轴点数 | Nx |
| y 轴点数 | Ny |
| X 轴 | AxisX |
| Y 轴 | AxisY |
| 曲线或映射的值 | Values |
##### 7.3.2.4 类别为 ARRAY 的 ImplementationDataType 的插值例程参数生成
在某些方法中,曲线(例如)的 ImplementationDataType 不是 STRUCTURE 而是 ARRAY。显然,这要求轴点数、轴点、值使用相同的原始数据类型。
尽管如此,在这种情况下,第 7.3.2.3 章中描述的命名约定并不完全适用。因此,需要通过基于 SwRecordLayout 和相应曲线/映射的当前大小的某种"地址计算"来确定实现数组中的所需位置。可以根据第 7.3.2.3 章和记录布局中的命名约定找到大小元素的位置。
---
## 翻译说明
1. 本文档为 AUTOSAR CP Release 4.4.0 的插值调用宏封装说明文档(EXP)。
2. 所有 API 标识符(如 `Ifx_IntIpoCur_s16_u8`、`Ifl_IntIpoMap_f32f32_f32`、`Elc_Get_myRunnable_IgnitionCurve`)保留英文原名。
3. 数据类型(`uint8`、`uint16`、`sint8`、`sint16`、`float32`)保留英文原名。
4. 章节中包含的所有 C 代码片段按原文翻译并保留格式。
5. AUTOSAR 方框符 `⌈⌋` 已保留。
6. 本文档为说明性文档(Explanatory Document),主要描述宏封装的概念和实现方法。
7. 文档涵盖 7 个主要章节:缩略语、相关文档、引言、动机、免责声明、用例、解决方案建议。
8. 解决方案部分详细描述了宏封装概念的基本原理(7.3.1)和实现细节(7.3.2)。