Files
autosar_standard_spec_v4.4/Libraries/AUTOSAR_SWS_IFLLibrary.md
T

796 lines
31 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`)均已完整翻译。