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
+795
View File
@@ -0,0 +1,795 @@
# SWS_IFLLibrary — 浮点插值例程规范
| 文档元信息 | 值 |
|------------|------|
| 文档标题 | Specification of Floating Point Interpolation Routines(浮点插值例程规范) |
| 文档所有者 | AUTOSAR |
| 文档责任方 | AUTOSAR |
| 文档标识号 | 398 |
| 文档状态 | 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 | 修改:第 2 章已修订为更新 Default Error Tracer 替代 Development Error Tracer;更新 IFL 文档以支持 MISRA 2012 标准(移除 SWS_Ifl_00209 中已存在于 SWS_BSW 和 SWS_SRS 文档中的冗余语句);将 SWS_Ifl_00210 和 SWS_Ifl_00224 的 SRS_BSW_GeneralSRS_BSW_00437)和(SRS_BSW_00448)的正确引用更新 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 修改:更新 SWS_Ifx_00170 的记录布局定义;更新 5.1 节文件结构下 SWS_Ifl_00001 的命名约定;更新 8.1 节表 1 中 float32 的有效范围 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 添加:3.1 节中 IFL RecordLayout 蓝图引用;修改:在 SWS_Ifl_00010、SWS_Ifl_00021 和 SWS_Ifl_00025 的函数参数中更新了 const 的使用;为架构版本修改 IFL 蓝图;3.2 节中的序列号 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 更正 Ifl_IpoMap 函数的数组越界;编辑性修改 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 更正集成映射插值和映射插值的公式;更正曲线插值的数组越界;修改对不存在的元模型元素 CalprmElementPrototype 到 ParameterDataPrototype 的引用;更正 DependencyOnArtifact |
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | 移除错误分类支持和定义(库不支持 DET 调用);移除 XXX_GetVersionInfo 例程的配置参数描述/支持;更正 XXX_GetVersionInfo 例程名称 |
| 2010-09-30 | 3.1.5 | AUTOSAR Administration | DPSearch 函数使用结构指针优化;移除归一化函数 |
| 2010-02-02 | 3.1.4 | AUTOSAR Administration | 初始发布 |
---
## 目录
1. [引言与功能概述](#1-引言与功能概述)
2. [缩略语与缩写](#2-缩略语与缩写)
3. [相关文档](#3-相关文档)
- 3.1 [输入文档](#31-输入文档)
- 3.2 [相关标准与规范](#32-相关标准与规范)
4. [约束与假设](#4-约束与假设)
- 4.1 [局限性](#41-局限性)
- 4.2 [对汽车领域的适用性](#42-对汽车领域的适用性)
5. [与其他模块的依赖关系](#5-与其他模块的依赖关系)
- 5.1 [文件结构](#51-文件结构)
6. [需求可追溯性](#6-需求可追溯性)
7. [功能规范](#7-功能规范)
- 7.1 [错误分类](#71-错误分类)
- 7.2 [错误检测](#72-错误检测)
- 7.3 [错误通知](#73-错误通知)
- 7.4 [初始化与关闭](#74-初始化与关闭)
- 7.5 [使用库 API](#75-使用库-api)
- 7.6 [库实现](#76-库实现)
8. [例程规范](#8-例程规范)
- 8.1 [导入类型](#81-导入类型)
- 8.2 [类型定义](#82-类型定义)
- 8.3 [关于舍入的说明](#83-关于舍入的说明)
- 8.4 [关于目标优化的例程说明](#84-关于目标优化的例程说明)
- 8.5 [插值例程定义](#85-插值例程定义)
- 8.6 [函数使用示例](#86-函数使用示例)
- 8.7 [版本 API](#87-版本-api)
- 8.8 [回调通知](#88-回调通知)
- 8.9 [调度例程](#89-调度例程)
- 8.10 [预期接口](#810-预期接口)
9. [时序图](#9-时序图)
10. [配置规范](#10-配置规范)
- 10.1 [发布信息](#101-发布信息)
- 10.2 [配置选项](#102-配置选项)
11. [不适用的需求](#11-不适用的需求)
---
## 1 引言与功能概述
AUTOSAR 库例程是 AUTOSAR 架构中系统服务的一部分,下图展示了 AUTOSAR 库在分层架构中的位置。
```
┌─────────────────────────────┐
A │ Application Layer │
U ├─────────────────────────────┤
T │ Runtime Environment (RTE) │
O ├─────────────────────────────┤
S │ Basic Software │
A │ │
R ├─────────────────────────────┤
│ ECU Hardware │
L └─────────────────────────────┘
I
B
```
**图:分层架构**
本规范规定了专用于浮点值插值和查找例程的 AUTOSAR 库的功能、API 和配置。
插值库包含以下例程:
- 分布式数据点搜索和插值
- 集成式数据点搜索和插值
所有例程都是可重入的(re-entrant)。它们可以同时被多个可运行实体使用。
## 2 缩略语与缩写
具有局部范围、因此未包含在 AUTOSAR 词汇表中的缩略语和缩写必须出现在局部词汇表中。
| 缩写 | 描述 |
|------|------|
| **DET** | Default Error Tracer(默认错误追踪器) |
| **ROM** | Read only memory(只读存储器) |
| **hex** | Hexadecimal(十六进制) |
| **Rev** | Revision(修订) |
| **f32** | float32 的助记符,参见 AUTOSAR_SWS_PlatformTypes |
| **IFL** | Interpolation Floating point Library(浮点插值库) |
| **Mn** | Mnemonic(助记符) |
| **Lib** | Library(库) |
| **s16** | sint16 的助记符,参见 AUTOSAR_SWS_PlatformTypes |
| **s32** | sint32 的助记符,参见 AUTOSAR_SWS_PlatformTypes |
| **s8** | sint8 的助记符,参见 AUTOSAR_SWS_PlatformTypes |
| **u16** | uint16 的助记符,参见 AUTOSAR_SWS_PlatformTypes |
| **u32** | uint32 的助记符,参见 AUTOSAR_SWS_PlatformTypes |
| **u8** | uint8 的助记符,参见 AUTOSAR_SWS_PlatformTypes |
## 3 相关文档
### 3.1 输入文档
- [1] List of Basic Software Modules, AUTOSAR_TR_BSWModuleList.pdf
- [2] Layered Software Architecture, AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
- [3] General Requirements on Basic Software Modules, AUTOSAR_SRS_BSWGeneral.pdf
- [4] Specification of ECU Configuration, AUTOSAR_TPS_ECUConfiguration.pdf
- [5] Basic Software Module Description Template, AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
- [6] Specification of Platform Types, AUTOSAR_SWS_PlatformTypes.pdf
- [7] Specification of Standard Types, AUTOSAR_SWS_StandardTypes.pdf
- [8] Requirement on Libraries, AUTOSAR_SRS_Libraries.pdf
- [9] Specification of Memory Mapping, AUTOSAR_SWS_MemoryMapping.pdf
- [10] IFL_RecordLayout_Blueprint, AUTOSAR_MOD_IFL_RecordLayout_Blueprint.arxml
### 3.2 相关标准与规范
- [11] ISO/IEC 9899:1990 Programming Language C
## 4 约束与假设
### 4.1 局限性
无局限性。
### 4.2 对汽车领域的适用性
无限制。
## 5 与其他模块的依赖关系
### 5.1 文件结构
[SWS_Ifl_00001] ⌈ Ifl 模块应提供以下文件:
- C 文件 `Ifl_<name>.c` 用于实现库。所有 C 文件应以 `Ifl_` 为前缀。
建议按以下选项实现和分组(关于 C 文件的)例程,但无强制要求遵循:
**选项 1**`<Name>` 可以是函数名,每个函数一个 C 文件。
例如:`Ifl_IntIpoMap_f32f32_f32.c` 等。
**选项 2**`<Name>` 可以是函数组的通用名称:
- 2.1 按对象族分组:例如 `Ifl_IpoCur.c``Ifl_DPSearch.c`
- 2.2 按例程族分组:例如 `Ifl_IpoMap.c`
- 2.3 按方法族分组:例如 `Ifl_Ipo.c`
- 2.4 按其他方式分组:(允许自定义分组)
**选项 3**:可以省略 `<Name>`,使单个 C 文件包含所有 Ifl 函数,例如 `Ifl.c`
使用以上选项可在减少 C 文件数量的同时灵活选择合适的粒度。在某些选项情况下,也可以只按需链接(linking only on-demand)。
## 6 需求可追溯性
| 需求 | 描述 | 由以下需求满足 |
|------|------|----------------|
| SRS_BSW_00003 | 所有软件模块应提供版本和标识信息。 | SWS_Ifl_00215 |
| SRS_BSW_00007 | 所有用 C 语言编写的 BSW 模块应符合 MISRA C 2012 标准。 | SWS_Ifl_00209 |
| SRS_BSW_00304 | 所有 AUTOSAR 基本软件模块应使用以下数据类型,而非原生 C 数据类型。 | SWS_Ifl_00212 |
| SRS_BSW_00306 | AUTOSAR 基本软件模块应是编译器和平台无关的。 | SWS_Ifl_00213 |
| SRS_BSW_00318 | 每个 AUTOSAR 基本软件模块文件应在头文件中提供版本号。 | SWS_Ifl_00215 |
| SRS_BSW_00321 | AUTOSAR 基本软件模块的版本号应按特定规则枚举。 | SWS_Ifl_00215 |
| SRS_BSW_00348 | 所有 AUTOSAR 标准类型和常量应放置并组织在标准类型头文件中。 | SWS_Ifl_00211 |
| SRS_BSW_00374 | 所有基本软件模块应提供可读的模块供应商标识。 | SWS_Ifl_00214 |
| SRS_BSW_00378 | AUTOSAR 应提供 boolean 类型。 | SWS_Ifl_00212 |
| SRS_BSW_00379 | 所有软件模块应在头文件和模块 XML 描述文件中提供模块标识符。 | SWS_Ifl_00214 |
| SRS_BSW_00402 | 每个模块应提供版本信息。 | SWS_Ifl_00214 |
| SRS_BSW_00407 | 每个 BSW 模块应提供读取专用模块实现版本信息的函数。 | SWS_Ifl_00215, SWS_Ifl_00216 |
| SRS_BSW_00411 | 所有 AUTOSAR 基本软件模块应应用 API 存在启用/禁用的命名规则。 | SWS_Ifl_00216 |
| SRS_BSW_00437 | 内存映射应提供定义启动期间不初始化的 RAM 段的可能性。 | SWS_Ifl_00210 |
| SRS_BSW_00448 | 模块 SWS 不应包含来自其他模块的需求。 | SWS_Ifl_00224 |
| SRS_LIBS_00001 | 每个库函数的功能行为不应可配置。 | SWS_Ifl_00218 |
| SRS_LIBS_00002 | 库应在所有 BSW 模块和应用 SWC 之前可用。 | SWS_Ifl_00200 |
| SRS_LIBS_00003 | 库应在关闭之前保持可用。 | SWS_Ifl_00201 |
| SRS_LIBS_00013 | 由运行时输入参数值检查产生的错误情况应在 SWS 中列出。 | SWS_Ifl_00217, SWS_Ifl_00219 |
| SRS_LIBS_00015 | 应可以配置微控制器,使库代码在所有调用者之间共享。 | SWS_Ifl_00206 |
| SRS_LIBS_00017 | 应避免使用宏。 | SWS_Ifl_00207 |
| SRS_LIBS_00018 | 库函数只能调用库函数。 | SWS_Ifl_00208 |
## 7 功能规范
### 7.1 错误分类
[SWS_Ifl_00223] ⌈ 由于库不支持 DET 调用,因此无错误分类定义。⌋ ( )
### 7.2 错误检测
[SWS_Ifl_00219] ⌈ 错误检测:函数应在运行时(无论在生产代码还是开发代码中)检查输入参数的值,特别是当错误值可能导致致命错误或不可预测结果的情况,前提是这些值在函数规范允许的范围内。所有错误情况应在 SWS 中列出,并且函数应返回 SWS 中规定的不可配置的值。该值取决于具体的函数和错误情况,因此逐个确定。如果传递给例程的值无效且不符合函数规范,则不检测此类错误。⌋ (SRS_LIBS_00013)
**例如:** 如果传递值 > 32 作为位位置,或将负数轴分布样本数传递给例程。
### 7.3 错误通知
[SWS_Ifl_00217] ⌈ 函数不应调用 DET 进行错误通知。⌋ (SRS_LIBS_00013)
### 7.4 初始化与关闭
[SWS_Ifl_00200] ⌈ Ifl 库不需要初始化阶段。库函数可在 ECU 初始化的最开始被调用,例如甚至可由 OS 或 EcuM 调用,因此库应就绪。⌋ (SRS_LIBS_00002)
[SWS_Ifl_00201] ⌈ Ifl 库不需要关闭操作阶段。⌋ (SRS_LIBS_00003)
### 7.5 使用库 API
Ifl API 可直接从 BSW 模块或 SWC 调用。无需端口定义。这是一种纯函数调用。
`Ifl.h` 语句应由开发人员或应用程序代码生成器放置,而不是由 RTE 生成器放置。
库的使用应记录在文档中。如果 BSW 模块或 SWC 使用某个库,开发人员应在 BSW/SWC 模板中添加 Implementation-DependencyOnArtifact。
`minVersion``maxVersion` 参数对应于供应商版本。对于 AUTOSAR 库,这些参数可以留空,因为 SWC 或 BSW 模块可以依赖库行为而非供应商实现。但是,SWC 或 BSW 模块应与其所集成的 AUTOSAR 平台兼容。
### 7.6 库实现
[SWS_Ifl_00206] ⌈ Ifl 库的实现方式应使代码可在不同内存分区中的调用者之间共享。⌋ (SRS_LIBS_00015)
[SWS_Ifl_00207] ⌈ 应避免使用宏。函数应声明为函数或内联函数(inline)。不应使用 `#define` 宏。⌋ (SRS_LIBS_00017)
[SWS_Ifl_00208] ⌈ 库函数可以调用其他库函数,因为所有库函数都应是可重入的。库函数不应调用任何 BSW 模块的函数,例如 DET。⌋ (SRS_LIBS_00018)
[SWS_Ifl_00209] ⌈ 用 C 语言编写的库应符合 MISRA C 标准。请参阅 SWS_BSW_00115 了解更多详情。⌋ (SRS_BSW_00007)
[SWS_Ifl_00210] ⌈ 每个 AUTOSAR 库模块实现 `<library>*.c``<library>*.h` 应使用 AUTOSAR 内存映射机制将其代码映射到内存段。⌋ (SRS_BSW_00437)
[SWS_Ifl_00211] ⌈ 每个使用 AUTOSAR 整数数据类型和/或标准返回值的 AUTOSAR 库模块实现 `<library>*.c` 应包含头文件 `StandardTypes.h`。⌋ (SRS_BSW_00348)
[SWS_Ifl_00212] ⌈ 所有 AUTOSAR 库模块应使用 AUTOSAR 数据类型(整数、布尔)而非原生 C 数据类型,除非该库明确被标识为仅与某个平台兼容。⌋ (SRS_BSW_00304, SRS_BSW_00378)
[SWS_Ifl_00213] ⌈ 所有 AUTOSAR 库模块应避免直接使用编译器和平台特定的关键字,例如 `#pragma``typeof` 等,除非该库明确被标识为仅与某个平台兼容。⌋ (SRS_BSW_00306)
[SWS_Ifl_00220] ⌈ 如果输入值小于第一个分布条目,则应返回分布数组的第一个值或在插值例程中使用该值。如果输入值大于最后一个分布条目,则应返回分布数组的最后一个值或在插值例程中使用该值。⌋ ( )
[SWS_Ifl_00221] ⌈ 传递给 Ifl 例程的轴分布应具有强单调序列。⌋ ( )
## 8 例程规范
### 8.1 导入类型
本章列出从以下模块包含的所有类型:
| 模块文件 | 导入类型 |
|----------|----------|
| Std_Types.h | sint8, uint8, sint16, uint16, sint32, uint32, float32 |
我们注意到,由于 C 语言提供的整数类型的大小是实现定义的,因此每种整数类型可以表示的值范围将因实现而异。
因此,为了提高软件的可移植性,这些类型在 PlatformTypes.h [AUTOSAR_SWS_PlatformTypes] 中定义。库例程名称中使用以下助记符:
| 大小 | 平台类型 | 助记符 | 范围 |
|------|----------|--------|------|
| unsigned 8-Bit | boolean | NA | [ TRUE, FALSE ] |
| signed 8-Bit | sint8 | s8 | [ -128, 127 ] |
| signed 16-Bit | sint16 | s16 | [ -32768, 32767 ] |
| signed 32-Bit | sint32 | s32 | [ -2147483648, 2147483647 ] |
| unsigned 8-Bit | uint8 | u8 | [ 0, 255 ] |
| unsigned 16-Bit | uint16 | u16 | [ 0, 65535 ] |
| unsigned 32-Bit | uint32 | u32 | [ 0, 4294967295 ] |
| 32-Bit | float32 | f32 | [-3.4028235E38, 3.4028235E38] |
**表 1:基本类型助记符**
作为本文档其余部分的约定:
- 助记符将用于例程名称中(使用 `<InType>` 表示输入类型助记符)
- 实际类型将用于例程原型的描述中(使用 `<InTypeMn1>``<OutType>`)。
### 8.2 类型定义
**结构定义:**
[SWS_Ifl_00005] ⌈
| 项 | 内容 |
|----|------|
| 名称 | `Ifl_DPResultF32_Type` |
| 类型 | Structure(结构) |
| 元素 | `uint32 Index` 数据点索引;`float32 Ratio` 数据点比率 |
| 描述 | 用于数据点搜索索引和比率的结构 |
| 通过 | Ifl.h |
⌋ ()
[SWS_Ifl_00006] ⌈ `Ifl_DPResultF32_Type` 结构不应由用户直接读/写/修改。只有 Ifl 例程应有权访问此结构。 ⌋()
### 8.3 关于舍入的说明
可以应用两种舍入类型:
**结果"四舍五入"rounded off):**
- `0 <= X < 0.5` 舍入为 0
- `0.5 <= X < 1` 舍入为 1
- `-0.5 < X <= 0` 舍入为 0
- `-1 < X <= -0.5` 舍入为 -1
**结果"向零舍入"rounded towards zero):**
- `0 <= X < 1` 舍入为 0
- `-1 < X <= 0` 舍入为 0
### 8.4 关于目标优化的例程说明
本规范中描述的例程可作为常规例程或内联函数(inline)实现。为了 ROM 优化目的,建议 C 例程实现为单独的源文件,以便可以根据需要进行链接。
例如,根据目标,可以进行两种类型的优化:
- 某些例程可被使用整数提升的另一个例程替换。
- 某些例程可被限制例程和具有不同签名的例程的组合替换。
### 8.5 插值例程定义
两个给定点之间的插值计算如下:
```
(x - x0)
result = y0 + (y1 - y0) * ─────────
(x1 - x0)
```
其中:X 是输入值
- x0 = X 之前的数据点
- x1 = X 之后的数据点
- y0 = x0 处的值
- y1 = x1 处的值
```
Val
│ Data points
│ Original curve
│ Linear interpolation
└────────────────────────────── X
```
**图:线性插值**
数据点数组可以分组为一个数组或一个结构的所有元素,如下所示。
**所有元素使用一个数组:**
```c
float32 Curve_f32[] = {5, 0.0, 10.0, 26.0, 36.0, 64.0, 1.0, 12.0, 17.0, 11.0, 6.0};
```
**所有元素使用一个结构:**
```c
struct {
uint32 N = 5;
float32 X[] = {0.0, 10.0, 26.0, 36.0, 64.0};
float32 Y[] = {1.0, 12.0, 17.0, 11.0, 6.0};
} Curve_f32;
```
其中,样本数 = 5
- X 轴分布 = 0.0 至 64.0
- Y 轴分布 = 1.0 至 6.0
插值例程接受单独的参数以支持以上场景。以下分别为数组和结构分组给出例程调用示例。
**示例:**
```c
float32 Ifl_IntIpoCur_f32_f32(15, Curve_f32[0], &Curve_f32[1], &Curve_f32[6]);
float32 Ifl_IntIpoCur_f32_f32(15, Curve_f32.N, &Curve_f32.X, &Curve_f32.Y);
```
插值可以通过以下两种方式计算:
1. 分布式数据点搜索和插值
2. 集成式数据点搜索和插值
#### 8.5.1 分布式数据点搜索和插值
在此插值方法中,数据点搜索(例如索引和比率)使用例程 `Ifl_DPSearch_f32` 计算,该例程返回结果结构 `Ifl_DPResultF32_Type`。它包含索引和比率信息。此结果可用于曲线插值和映射插值。
##### 8.5.1.1 数据点搜索
[SWS_Ifl_00010] ⌈
| 项 | 内容 |
|----|------|
| 服务名称 | `Ifl_DPSearch_f32` |
| 语法 | `void Ifl_DPSearch_f32(Ifl_DPResultF32_Type* dpResult, float32 Xin, uint32 N, const float32* X_array)` |
| 服务 ID[hex] | 0x001 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `Xin` 输入值;`N` 样本数;`X_array` 分布数组指针 |
| 参数 (in-out) | 无 |
| 参数 (out) | `dpResult` 指向结果结构的指针 |
| 返回值 | 无 |
| 描述 | 此例程在给定的分布数组 `X_array` 中搜索输入 `Xin` 的位置,并返回插值所需的索引和比率。 |
| 通过 | Ifl.h |
⌋ ()
[SWS_Ifl_00011] ⌈ 返回的 Index 应是满足 `(X_array[index] < Xin < X_array[index + 1])` 的最低索引。
```c
dpResult->Index = index
dpResult->Ratio = (Xin - X_array[index]) / (X_array[index+1] - X_array[index])
```
⌋()
对于给定的数组 `float32 X[] = {0.0, 10.0, 26.0, 36.0, 64.0};`
- 如果 `Xin = 20.0`,则
- `dpResult->Index = 1`
- `dpResult->Ratio = (20.0 - 10.0) / (26.0 - 10.0) = 0.625`
[SWS_Ifl_00012] ⌈ 如果输入值与分布数组中的某个值匹配,则返回相应的索引且比率为 0.0。
```c
if (Input Xin == X_array[index]):
dpResult->Index = index // 设定点的索引
dpResult->Ratio = 0.0
```
[SWS_Ifl_00013] ⌈ 如果 `(Xin < X_array[0])`,则返回数组的第一个索引,比率为 0.0:
```c
dpResult->Index = 0
dpResult->Ratio = 0.0
```
[SWS_Ifl_00014] ⌈ 如果 `(Xin > X_array[N-1])`,则返回数组的最后一个索引,比率为 0.0:
```c
dpResult->Index = N - 1
dpResult->Ratio = 0.0
```
[SWS_Ifl_00015] ⌈ N 的最小值应为 1。 ⌋()
[SWS_Ifl_00016] ⌈ 如果 `X_array[Index+1] == X_array[Index]`,则比率应为零:
```c
dpResult->Ratio = 0.0
```
[SWS_Ifl_00017] ⌈ 此例程通过 `Ifl_DPResultF32_Type` 类型的结构返回索引和比率。 ⌋()
##### 8.5.1.2 曲线插值
[SWS_Ifl_00021] ⌈
| 项 | 内容 |
|----|------|
| 服务名称 | `Ifl_IpoCur_f32` |
| 语法 | `float32 Ifl_IpoCur_f32(const Ifl_DPResultF32_Type* dpResult, const float32* Val_array)` |
| 服务 ID[hex] | 0x004 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `dpResult` 数据点搜索结果;`Val_array` 指向结果分布数组的指针 |
| 参数 (in-out) | 无 |
| 参数 (out) | 无 |
| 返回值 | `float32` 插值结果 |
| 描述 | 基于搜索的索引和比率信息,此例程计算并返回曲线的插值。 |
| 通过 | Ifl.h |
⌋ ()
[SWS_Ifl_00022] ⌈
```c
index = dPResult->Index
if dPResult->Ratio == 0.0
Result = Val_array[index]
else
Result = Val_array[index] + (Val_array[index+1] - Val_array[index]) * dpResult->Ratio
```
⌋()
[SWS_Ifl_00180] ⌈ 在使用 `Ifl_DPSearch` 例程搜索轴之前,不要调用此例程。只有这样才能确保搜索结果(`Ifl_DPResultF32_Type`)包含有效数据,而不是未初始化状态。 ⌋()
##### 8.5.1.3 映射插值
[SWS_Ifl_00025] ⌈
| 项 | 内容 |
|----|------|
| 服务名称 | `Ifl_IpoMap_f32` |
| 语法 | `float32 Ifl_IpoMap_f32(const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, uint32 num_value, const float32* Val_array)` |
| 服务 ID[hex] | 0x005 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `dpResultX` X 轴数据点搜索结果;`dpResultY` Y 轴数据点搜索结果;`num_value` Y 轴点数;`Val_array` 指向结果分布数组的指针 |
| 参数 (in-out) | 无 |
| 参数 (out) | 无 |
| 返回值 | `float32` 插值结果 |
| 描述 | 基于使用 `Ifl_DPSearch_f32` 例程搜索的索引和比率信息,此例程计算并返回映射的插值结果。 |
| 通过 | Ifl.h |
⌋ ()
[SWS_Ifl_00026] ⌈ 基于使用 `Ifl_DPSearch_f32` 例程搜索的索引和比率信息,此例程计算并返回映射的插值结果。
```c
BaseIndex = dpResultX->Index * num_value + dpResultY->Index
if (dpResultX->Ratio == 0)
if (dpResultY->Ratio == 0)
Result = Val_array[BaseIndex]
else
LowerY = Val_array[BaseIndex]
UpperY = Val_array[BaseIndex + 1]
Result = LowerY + (UpperY - LowerY) * dpResultY->Ratio
else
if (dpResultY->Ratio == 0)
LowerX = Val_array[BaseIndex]
UpperX = Val_array[BaseIndex + num_value]
Result = LowerX + (UpperX - LowerX) * dpResultX->Ratio
else
LowerY = Val_array[BaseIndex]
UpperY = Val_array[BaseIndex + 1]
LowerX = LowerY + (UpperY - LowerY) * dpResultY->Ratio
LowerY = Val_array[BaseIndex + num_value]
UpperY = Val_array[BaseIndex + num_value + 1]
UpperX = LowerY + (UpperY - LowerY) * dpResultY->Ratio
Result = LowerX + (UpperX - LowerX) * dpResultX->Ratio
```
⌋()
[SWS_Ifl_00181] ⌈ 在使用 `Ifl_DPSearch` 例程搜索轴之前,不要调用此例程。只有这样才能确保搜索结果(`Ifl_DPResultF32_Type`)包含有效数据,而不是未初始化状态。 ⌋()
##### 8.5.1.4 单点插值
[SWS_Ifl_00030] ⌈
| 项 | 内容 |
|----|------|
| 服务名称 | `Ifl_Interpolate_f32` |
| 语法 | `float32 Ifl_Interpolate_f32(float32 Value1, float32 Value2, float32 Coef)` |
| 服务 ID[hex] | 0x006 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `Value1` 插值中使用的第一个值;`Value2` 插值中使用的第二个值;`Coef` 插值系数 |
| 参数 (in-out) | 无 |
| 参数 (out) | 无 |
| 返回值 | `float32` 插值结果 |
| 描述 | 返回根据以下公式确定的线性插值(Result)结果。 |
| 通过 | Ifl.h |
⌋ ()
[SWS_Ifl_00031] ⌈
```c
Result = Value1 + (Coef * (Value2 - Value1))
```
⌋()
#### 8.5.2 集成式数据点搜索和插值
在此插值方法中,单个例程同时完成数据点搜索(例如索引和比率)和曲线、映射的插值。
##### 8.5.2.1 集成式曲线插值
[SWS_Ifl_00035] ⌈
| 项 | 内容 |
|----|------|
| 服务名称 | `Ifl_IntIpoCur_f32_f32` |
| 语法 | `float32 Ifl_IntIpoCur_f32_f32(float32 X_in, uint32 N, const float32* X_array, const float32* Val_array)` |
| 服务 ID[hex] | 0x010 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `X_in` 输入值;`N` 样本数;`X_array` X 分布指针;`Val_array` Y 值指针 |
| 参数 (in-out) | 无 |
| 参数 (out) | 无 |
| 返回值 | `float32` 插值结果 |
| 描述 | 此例程使用以下公式计算在位置 `Xin` 处的曲线插值。 |
| 通过 | Ifl.h |
⌋ ()
[SWS_Ifl_00036] ⌈
```c
index = (X_array[index] < Xin < X_array[index+1])
RatioX = (Xin - X_array[index]) / (X_array[index+1] - X_array[index])
Result = Val_array[index] + (Val_array[index+1] - Val_array[index]) * RatioX
```
[SWS_Ifl_00037] ⌈ 如果输入值与分布数组中的某个值匹配,则结果将是索引所指示的相应 Y 数组元素。
```c
if (Xin == X_array[index])
Result = Val_array[index]
```
[SWS_Ifl_00038] ⌈ 如果 `Xin < X_array[0]`,则 `Result = Val_array[0]`。 ⌋()
[SWS_Ifl_00039] ⌈ 如果 `Xin > X_array[N-1]`,则 `Result = Val_array[N-1]`。 ⌋()
[SWS_Ifl_00040] ⌈ N 的最小值应为 1。 ⌋()
##### 8.5.2.2 集成式映射插值
[SWS_Ifl_00041] ⌈
| 项 | 内容 |
|----|------|
| 服务名称 | `Ifl_IntIpoMap_f32f32_f32` |
| 语法 | `float32 Ifl_IntIpoMap_f32f32_f32(float32 Xin, float32 Yin, uint32 Nx, uint32 Ny, const float32* X_array, const float32* Y_array, const float32* Val_array)` |
| 服务 ID[hex] | 0x011 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `Xin` X 轴输入值;`Yin` Y 轴输入值;`Nx` X 轴间隔数;`Ny` Y 轴间隔数;`X_array` X 轴分布数组指针;`Y_array` Y 轴分布数组指针;`Val_array` 结果轴分布数组指针 |
| 参数 (in-out) | 无 |
| 参数 (out) | 无 |
| 返回值 | `float32` 映射插值结果 |
| 描述 | 此例程使用以下公式计算在位置 X 和 Y 处的映射插值。 |
| 通过 | Ifl.h |
⌋ ()
[SWS_Ifl_00042] ⌈
```c
indexX = (X_array[indexX] < Xin < X_array[indexX+1])
indexY = (Y_array[indexY] < Yin < Y_array[indexY+1])
RatioX = (Xin - X_array[indexX]) / (X_array[indexX+1] - X_array[indexX])
RatioY = (Yin - Y_array[indexY]) / (Y_array[indexY+1] - Y_array[indexY])
BaseIndex = IndexX * Ny + indexY
LowerY = Val_array[BaseIndex]
UpperY = Val_array[BaseIndex + 1]
LowerX = LowerY + (UpperY - LowerY) * RatioY
LowerY = Val_array[BaseIndex + Ny]
UpperY = Val_array[BaseIndex + Ny + 1]
UpperX = LowerY + (UpperY - LowerY) * RatioY
Result = LowerX + (UpperX - LowerX) * RatioX
```
[SWS_Ifl_00043] ⌈ 如果 `(Xin == X_array[indexX])``(Y_array[indexY] < Yin < Y_array[indexY+1])`
```c
Result = Val_array[BaseIndex] + (Val_array[BaseIndex+1] - Val_array[BaseIndex]) * RatioY
```
[SWS_Ifl_00044] ⌈ 如果 `(Yin == Y_array[indexY])``(X_array[indexX] < Xin < X_array[indexX+1])`
```c
Result = Val_array[BaseIndex] + (Val_array[BaseIndex+Ny] - Val_array[BaseIndex]) * RatioX
```
[SWS_Ifl_00045] ⌈ 如果 `(Xin == X_array[indexX])``(Yin == Y_array[indexY])`
```c
Result = Val_array[BaseIndex]
```
[SWS_Ifl_00046] ⌈ 如果 `Xin < X_array[0]`,则 `indexX = 0``RatioX = 0.0`。 ⌋()
[SWS_Ifl_00047] ⌈ 如果 `Xin > X_array[Nx-1]`,则 `indexX = Nx - 1``RatioX = 0.0`。 ⌋()
[SWS_Ifl_00048] ⌈ 如果 `Yin < Y_array[0]`,则 `indexY = 0``RatioY = 0.0`。 ⌋()
[SWS_Ifl_00049] ⌈ 如果 `Yin > Y_array[Ny-1]`,则 `indexY = Ny - 1``RatioY = 0.0`。 ⌋()
[SWS_Ifl_00050] ⌈ N 的最小值应为 1。 ⌋()
#### 8.5.3 插值例程的记录布局
记录布局指定 ECU 内存中校准数据的序列化方式,描述了特性的形状。单个记录布局可由插值 ParameterDataPrototype 的多个实例引用。记录布局可以嵌套,特定值引用对象的特定属性。通过记录布局的不同属性,可以指定复杂对象。
##### 8.5.3.1 记录布局定义
下表指定了插值例程支持的记录布局。
[SWS_Ifl_00170] ⌈
| 记录布局名称 | Element1 | Element2 | Element3 | Element4 | Element5 |
|--------------|----------|----------|----------|----------|----------|
| Distr_f32 | uint32 N | float32 X[] | | | |
| Curve_f32 | float32 Val[] | | | | |
| Map_f32 | float32 Val[] | | | | |
| IntCurve_f32_f32 | uint32 N | float32 X[] | float32 Val[] | | |
| IntMap_f32f32_f32 | uint32 Nx | uint32 Ny | float32 X[] | float32 Y[] | float32 Val[] |
⌋()
### 8.6 函数使用示例
无。
### 8.7 版本 API
#### 8.7.1 Ifl_GetVersionInfo
[SWS_Ifl_00215] ⌈
| 项 | 内容 |
|----|------|
| 服务名称 | `Ifl_GetVersionInfo` |
| 语法 | `void Ifl_GetVersionInfo(Std_VersionInfoType* versioninfo)` |
| 服务 ID[hex] | 0xff |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | 无 |
| 参数 (in-out) | 无 |
| 参数 (out) | `versioninfo` 指向存储此模块版本信息的位置。格式符合 [BSW00321]。 |
| 返回值 | 无 |
| 描述 | 返回此库的版本信息。 |
| 通过 | Ifl.h |
⌋ (SRS_BSW_00407, SRS_BSW_00003, SRS_BSW_00318, SRS_BSW_00321)
BSW 模块的版本信息通常包含:
- Module Id(模块 ID
- Vendor Id(供应商 ID
- Vendor specific version numbers(供应商特定版本号)(SRS_BSW_00407)。
[SWS_Ifl_00216] ⌈ 如果 `Ifl_GetVersionInfo` 的调用方和被调用方的源代码都可用,Ifl 库应将 `Ifl_GetVersionInfo` 实现为模块头文件中定义的宏。 ⌋ (SRS_BSW_00407, SRS_BSW_00411)
### 8.8 回调通知
无。
### 8.9 调度例程
Ifl 库没有调度例程。
### 8.10 预期接口
无。
#### 8.10.1 强制接口
无。
#### 8.10.2 可选接口
无。
#### 8.10.3 可配置接口
无。
## 9 时序图
不适用。
## 10 配置规范
### 10.1 发布信息
[SWS_Ifl_00214] ⌈ 如 [3] 中 SRS_BSW_00402 要求的标准化通用发布参数,应在本模块的头文件中发布,并需要在 BSW 模块描述中提供。相应的模块缩写可在 [1] 基本软件模块列表中找到。⌋ (SRS_BSW_00402, SRS_BSW_00374, SRS_BSW_00379)
其他模块特定的发布参数(如果适用)将在下面列出。
### 10.2 配置选项
[SWS_Ifl_00218] ⌈ Ifl 库不应具有任何可能影响例程功能行为的配置选项。即对于给定的输入参数集合,输出应始终相同。例如,出错时返回的值不应可配置。⌋ (SRS_LIBS_00001)
但是,库供应商被允许添加与库实现相关的特定配置选项,例如用于资源消耗优化。
## 11 不适用的需求
[SWS_Ifl_00224] ⌈ 这些需求不适用于本规范。⌋ (SRS_BSW_00448)
---
## 翻译说明
1. 本文档为 AUTOSAR CP Release 4.4.0 的 IFL 库软件规范(SWS)。
2. 所有 API 标识符(如 `Ifl_DPSearch_f32``Ifl_IpoCur_f32``Ifl_IntIpoMap_f32f32_f32` 等)保留英文原名。
3. 数据类型(`uint8``uint16``uint32``sint8``sint16``sint32``float32``boolean`)保留英文原名。
4. 需求 ID(如 `SWS_Ifl_00010`)保留原样。
5. 章节中包含的所有 C 代码片段按原文翻译并保留格式。
6. AUTOSAR 方框符 `⌈⌋` 已保留。
7. 文档所有插值例程(`Ifl_DPSearch_f32``Ifl_IpoCur_f32``Ifl_IpoMap_f32``Ifl_Interpolate_f32``Ifl_IntIpoCur_f32_f32``Ifl_IntIpoMap_f32f32_f32`)均已完整翻译。