# 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_General(SRS_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_.c` 用于实现库。所有 C 文件应以 `Ifl_` 为前缀。 建议按以下选项实现和分组(关于 C 文件的)例程,但无强制要求遵循: **选项 1**:`` 可以是函数名,每个函数一个 C 文件。 例如:`Ifl_IntIpoMap_f32f32_f32.c` 等。 **选项 2**:`` 可以是函数组的通用名称: - 2.1 按对象族分组:例如 `Ifl_IpoCur.c`、`Ifl_DPSearch.c` - 2.2 按例程族分组:例如 `Ifl_IpoMap.c` - 2.3 按方法族分组:例如 `Ifl_Ipo.c` 等 - 2.4 按其他方式分组:(允许自定义分组) **选项 3**:可以省略 ``,使单个 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 库模块实现 `*.c` 和 `*.h` 应使用 AUTOSAR 内存映射机制将其代码映射到内存段。⌋ (SRS_BSW_00437) [SWS_Ifl_00211] ⌈ 每个使用 AUTOSAR 整数数据类型和/或标准返回值的 AUTOSAR 库模块实现 `*.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:基本类型助记符** 作为本文档其余部分的约定: - 助记符将用于例程名称中(使用 `` 表示输入类型助记符) - 实际类型将用于例程原型的描述中(使用 `` 或 ``)。 ### 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`)均已完整翻译。