Files
autosar_standard_spec_v4.4/Libraries/AUTOSAR_SWS_IFLLibrary.md
T

31 KiB
Raw Blame History

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. 引言与功能概述
  2. 缩略语与缩写
  3. 相关文档
  4. 约束与假设
  5. 与其他模块的依赖关系
  6. 需求可追溯性
  7. 功能规范
  8. 例程规范
  9. 时序图
  10. 配置规范
  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.cIfl_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。

minVersionmaxVersion 参数对应于供应商版本。对于 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 库模块应避免直接使用编译器和平台特定的关键字,例如 #pragmatypeof 等,除非该库明确被标识为仅与某个平台兼容。⌋ (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

图:线性插值

数据点数组可以分组为一个数组或一个结构的所有元素,如下所示。

所有元素使用一个数组:

float32 Curve_f32[] = {5, 0.0, 10.0, 26.0, 36.0, 64.0, 1.0, 12.0, 17.0, 11.0, 6.0};

所有元素使用一个结构:

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

插值例程接受单独的参数以支持以上场景。以下分别为数组和结构分组给出例程调用示例。

示例:

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]) 的最低索引。

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。

if (Input Xin == X_array[index]):
    dpResult->Index = index  // 设定点的索引
    dpResult->Ratio = 0.0

[SWS_Ifl_00013] ⌈ 如果 (Xin < X_array[0]),则返回数组的第一个索引,比率为 0.0:

dpResult->Index = 0
dpResult->Ratio = 0.0

[SWS_Ifl_00014] ⌈ 如果 (Xin > X_array[N-1]),则返回数组的最后一个索引,比率为 0.0:

dpResult->Index = N - 1
dpResult->Ratio = 0.0

[SWS_Ifl_00015] ⌈ N 的最小值应为 1。 ⌋()

[SWS_Ifl_00016] ⌈ 如果 X_array[Index+1] == X_array[Index],则比率应为零:

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] ⌈

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 例程搜索的索引和比率信息,此例程计算并返回映射的插值结果。

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] ⌈

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] ⌈

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 数组元素。

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] ⌈

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])

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])

Result = Val_array[BaseIndex] + (Val_array[BaseIndex+Ny] - Val_array[BaseIndex]) * RatioX

[SWS_Ifl_00045] ⌈ 如果 (Xin == X_array[indexX])(Yin == Y_array[indexY])

Result = Val_array[BaseIndex]

[SWS_Ifl_00046] ⌈ 如果 Xin < X_array[0],则 indexX = 0RatioX = 0.0。 ⌋()

[SWS_Ifl_00047] ⌈ 如果 Xin > X_array[Nx-1],则 indexX = Nx - 1RatioX = 0.0。 ⌋()

[SWS_Ifl_00048] ⌈ 如果 Yin < Y_array[0],则 indexY = 0RatioY = 0.0。 ⌋()

[SWS_Ifl_00049] ⌈ 如果 Yin > Y_array[Ny-1],则 indexY = Ny - 1RatioY = 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_f32Ifl_IpoCur_f32Ifl_IntIpoMap_f32f32_f32 等)保留英文原名。
  3. 数据类型(uint8uint16uint32sint8sint16sint32float32boolean)保留英文原名。
  4. 需求 ID(如 SWS_Ifl_00010)保留原样。
  5. 章节中包含的所有 C 代码片段按原文翻译并保留格式。
  6. AUTOSAR 方框符 ⌈⌋ 已保留。
  7. 文档所有插值例程(Ifl_DPSearch_f32Ifl_IpoCur_f32Ifl_IpoMap_f32Ifl_Interpolate_f32Ifl_IntIpoCur_f32_f32Ifl_IntIpoMap_f32f32_f32)均已完整翻译。