跳转至

Ifl

1. 简介和功能概述

AUTOSAR 库例程是 AUTOSAR 架构中系统服务的一部分,下图展示了 AUTOSAR 库在分层架构中的位置。

Figure1-1.png

本规范规定了专用于浮点值插值和查找例程的 AUTOSAR 库的功能、API 和配置。

插值库包含以下例程:

  • 分布式数据点搜索与插值(Distributed data point search and interpolation)
  • 集成式数据点搜索与插值(Integrated data point search and interpolation)

所有例程都是可重入的。它们可以同时被多个 runnable 使用。

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

AUTOSAR_MOD_IFL_RecordLayout_Blueprint.arxml

[2] ISO/IEC 9899:1990 Programming Language - C

https://www.iso.org

[3] General Specification of Basic Software Modules

AUTOSAR_CP_SWS_BSWGeneral

3.2. 相关规范

AUTOSAR 提供了基础软件模块通用规范 [3, SWS BSW General],该规范同样适用于 IFL 库。

因此,SWS BSW General 规范应被视为 IFL 库的附加必需规范。

4. 约束和假设

4.1. 限制

无限制。

4.2. 汽车域的适用性

无限制。

5. 对其他模块的依赖

5.1. 文件结构

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 文件的数量。在某些选项下,按需链接也是可能的。

6. 功能规格

6.1. 错误分类(Error Classification)

《General Specification of Basic Software Modules》(基础软件模块通用规范)一文的第 7.1 节「Error Handling」(错误处理)详细描述了基础软件的错误处理。其中最重要的是,它构成了一个由 BSW 模块中可能发生的五种错误类型组成的分类方案。

在此基础上,下文按相应的小节规定了具体的错误。

6.1.1. 开发错误

不存在开发错误。

6.1.2. 运行时错误

不存在运行时错误。

6.1.3. 瞬态故障

不存在瞬态故障。

6.1.4. 生产错误

不存在生产错误。

6.1.5. 扩展生产错误

不存在扩展生产错误。

6.2. 错误检测(Error detection)

错误检测:函数应在运行时(在生产代码和开发代码中都是如此)检查输入参数的值,尤其是错误值可能导致致命错误或不可预测结果的情况,确认它们是否具有函数规范所允许的值。所有错误情况都应在 SWS 中列出,且函数应返回一个(在 SWS 中)规定的、不可配置的值。该值取决于函数和错误情况,因此需逐例确定。

如果传递给例程的值无效且超出函数规范,则不会检测到此类错误。

例如,如果传递的位位置值 > 32,或者向例程传递了轴分布的负数采样数量。

6.3. 错误通知(Error notification)

函数不应调用 DET 进行错误通知。

6.4. 初始化和关闭(Initialization and shutdown)

Ifl 库不应需要初始化阶段。库函数可以在 ECU 初始化的第一步就被调用,例如甚至由 OS 或 EcuM 调用,因此该库应是就绪的。

Ifl 库不应需要关闭操作阶段。

6.5. 库 API 的使用(Using Library API)

Ifl API 可以从 BSW 模块或 SWC 直接调用。不需要端口定义。它是纯粹的函数调用。

语句「Ifl.h」应由开发者或应用代码生成器放置,而不是由 RTE 生成器放置。

库的使用应有文档记录。如果 BSW 模块或 SWC 使用了某个库,开发者应在 BSW/SWC 模板中添加一个 Implementation-DependencyOnArtifact。

minVersion 和 maxVersion 参数对应于供应商版本。对于 AUTOSAR 库,这些参数可以留空,因为 SWC 或 BSW 模块可能依赖于库的行为,而不是依赖于某个供应商的实现。然而,SWC 或 BSW 模块应与其所集成的 AUTOSAR 平台兼容。

6.6. 库的实现(Library implementation)

Ifl 库的实现方式应使代码可以在不同内存分区中的调用者之间共享。

应避免使用宏。函数应声明为函数或内联函数。不应使用宏 #define。

库函数可以调用其他库函数,因为所有库函数都应是可重入的。库函数不得调用任何 BSW 模块函数,例如 DET。

用 C 编程语言编写的库应符合 MISRA C 标准。

更多详情请参见 SWS_BSW_00115。

每个 AUTOSAR 库模块实现 <library>.c 和 <library>.h 都应使用 AUTOSAR 内存映射机制将其代码映射到内存段。

每个 AUTOSAR 库模块实现 <library>*.c,凡使用了 AUTOSAR 整数数据类型和/或标准返回类型的,都应包含头文件 Std_Types.h。

所有 AUTOSAR 库模块都应使用 AUTOSAR 数据类型(整数、布尔)而不是原生 C 数据类型,除非该库被明确标识为仅与某个平台兼容。

所有 AUTOSAR 库模块都应避免直接使用编译器和平台特定的关键字,除非该库被明确标识为仅与某个平台兼容。例如 #pragma、typeof 等。

如果输入值小于第一个分布条目,则插值例程应返回或使用分布数组的第一个值。如果输入值大于最后一个分布条目,则插值例程应返回或使用分布数组的最后一个值。

传递给 Ifx 例程的轴分布应具有正常的单调序列。

7. API规范

7.1. 导入的类型

在本章中,列出了从以下模块包含的所有类型:

模块文件 导入类型
Std_Types.h sint8、uint8、sint16、uint16、sint32、uint32、float32

可以观察到,由于 C 语言提供的整数类型的大小是由实现定义的,因此每种整数类型可表示的值的范围在不同的实现之间会有所不同。

因此,为了提高软件的可移植性,这些类型定义在 Platform_Types.h [AUTOSAR_SWS_PlatformTypes] 中。库例程名称中使用了以下助记符。

表8.1:基本类型的助记符(Mnemonic for Base Types)

大小 平台类型 助记符 取值范围
无符号 8 位 boolean NA [ TRUE, FALSE ]
有符号 8 位 sint8 s8 [ -128, 127 ]
有符号 16 位 sint16 s16 [ -32768, 32767 ]
有符号 32 位 sint32 s32 [ -2147483648, 2147483647 ]
无符号 8 位 uint8 u8 [ 0, 255 ]
无符号 16 位 uint16 u16 [ 0, 65535 ]
无符号 32 位 uint32 u32 [ 0, 4294967295 ]
32 位 float32 f32 [-3.4028235E38, 3.4028235E38]

作为文档其余部分的约定:

  • 助记符将用于例程的名称中(<InType> 表示输入的类型助记符);
  • 真实类型将用于例程原型的描述中(使用 <InTypeMn1> 或 <OutType>)。

7.2. 类型定义

结构定义:

Ifl_DPResultF32_Type

结构类型(Structure),包含以下元素:

元素 类型 说明
Index uint32 数据点索引
Ratio float32 数据点比率

描述:用于按索引和比率进行数据点搜索的结构。可通过 Ifl.h 获得。

Ifl_DPResultF32_Type 结构不应由用户直接读取/写入/修改。只有 Ifl 例程才有权访问该结构。

7.3. 关于舍入的说明(Comment about rounding)

可应用两种舍入类型:

结果被「四舍五入」(rounded off),即:

  • 0 <= X < 0.5 舍入为 0
  • 0.5 <= X < 1 舍入为 1
  • -0.5 < X <= 0 舍入为 0
  • -1 < X <= -0.5 舍入为 -1

结果向零舍入:

  • 0 <= X < 1 舍入为 0
  • -1 < X <= 0 舍入为 0

7.4. 关于针对目标优化的例程的说明(Comment about routines optimized for target)

本库中描述的例程可以实现为常规例程或内联函数。出于 ROM 优化的目的,建议将 C 例程实现为单独的源文件,以便按需链接。

例如,根据目标的不同,可以进行两种类型的优化:

  • 某些例程可以由使用整数提升(integer promotion)的另一例程替换。
  • 某些例程可以由限幅例程与具有不同签名的例程的组合替换。

7.5. 插值例程定义(Interpolation routines definitions)

两个给定点之间的插值按下图所示计算。

其中:X 是输入值;

x0 = X 之前的数据点;

x1 = X 之后的数据点;

y0 = x0 处的值;

y1 = x1 处的值。

Figure8-2.png

数据点数组可以按如下方式组合为所有元素共用的一个数组或一个结构:

one array for all elements    : float32 Curve_f32 []={5,0.0,10.0,26.0,36.0,64.0,1.0,12.0,17.0,11.0,6.0};
one structure for all elements: 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. 集成式数据点搜索与插值

7.5.1. 分布式数据点搜索与插值(Distributed data point search and interpolation)

在这种插值方法中,数据点搜索(例如索引和比率)使用例程 Ifl_DPSearch_f32 计算,该例程返回结果结构 Ifl_DPResultF32_Type。它包含索引和比率信息。该结果可用于曲线插值和映射插值。

7.5.1.1.1. Ifl_DPSearch_f32

说明: 本例程在给定的分布数组 X_array 中搜索输入 Xin 的位置,并返回插值所需的索引和比率。服务 ID 0x001。本服务为同步调用,可重入。参数 Xin(in):输入值。参数 N(in):采样数量。参数 X_array(in):指向分布数组的指针。参数(inout):无。参数 dpResult(out):指向结果结构的指针。返回值:无。可通过 Ifl.h 获得。

void Ifl_DPSearch_f32 ( Ifl_DPResultF32_Type* dpResult, float32 Xin, uint32 N, const float32* X_array )

返回的 Index 应是满足 (X_array[index] < Xin < X_array[index + 1]) 的最小索引。如果 (X_array[0] <= Xin <= X_array[N-1]),则返回的 Index 应为最小索引。

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。

如果输入值与分布数组中的某个值匹配,则返回相应的索引且比率为 0.0。如果 Xin == X_array[index],则 dpResult->Index = index(设定点的索引),dpResult->Ratio = 0.0。

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

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

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

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

N 的最小值应为 1。

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

dpResult->Ratio = 0.0

本例程通过 Ifl_DPResultF32_Type 类型的结构返回索引和比率。

7.5.1.2. 曲线插值(Curve interpolation)
7.5.1.2.1. Ifl_IpoCur_f32

说明: 基于搜索到的索引和比率信息,本例程计算并返回曲线的插值。服务 ID 0x004。本服务为同步调用,可重入。参数 dpResult(in):数据点搜索结果。参数 Val_array(in):指向结果分布数组的指针。参数(inout):无。参数(out):无。返回值:float32,插值结果。可通过 Ifl.h 获得。

float32 Ifl_IpoCur_f32 ( const Ifl_DPResultF32_Type* dpResult, const float32* Val_array )
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

在使用 Ifl_DPSearch 例程搜索轴之前,不得调用本例程。只有这样,才能确保搜索结果(Ifl_DPResultF32_Type)包含有效数据且不会被未初始化地使用。

7.5.1.3. 映射插值(Map interpolation)
7.5.1.3.1. Ifl_IpoMap_f32

说明: 基于使用 Ifl_DPSearch_f32 例程搜索到的索引和比率信息,本例程计算并返回映射的插值结果。服务 ID 0x005。本服务为同步调用,可重入。参数 dpResultX(in):x 轴的数据点搜索结果。参数 dpResultY(in):y 轴的数据点搜索结果。参数 num_value(in):y 轴点的数量。参数 Val_array(in):指向结果分布数组的指针。参数(inout):无。参数(out):无。返回值:float32,插值结果。可通过 Ifl.h 获得。

float32 Ifl_IpoMap_f32 ( const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, uint32 num_value, const float32* Val_array )

基于使用 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

在使用 Ifl_DPSearch 例程搜索轴之前,不得调用本例程。只有这样,才能确保搜索结果(Ifl_DPResultF32_Type)包含有效数据且不会被未初始化地使用。

7.5.1.4. 单点插值(Single point interpolation)
7.5.1.4.1. Ifl_Interpolate_f32

说明: 返回根据以下等式确定的线性插值结果(Result)。服务 ID 0x006。本服务为同步调用,可重入。参数 Value1(in):插值中使用的第一个值。参数 Value2(in):插值中使用的第二个值。参数 Coef(in):插值系数。参数(inout):无。参数(out):无。返回值:float32,插值后的值。可通过 Ifl.h 获得。

float32 Ifl_Interpolate_f32 ( float32 Value1, float32 Value2, float32 Coef )
Result = Value1 + (Coef * (Value2 - Value1))

7.5.2. 集成式数据点搜索与插值(Integrated data point search and interpolation)

在这种插值方法中,单个例程完成数据点搜索(例如索引和比率)以及曲线、映射的插值。

7.5.2.1. 集成式曲线插值(Integrated curve interpolation)
7.5.2.1.1. Ifl_IntIpoCur_f32_f32

说明: 本例程使用以下等式计算曲线在位置 Xin 处的插值。服务 ID 0x010。本服务为同步调用,可重入。参数 X_in(in):输入值。参数 N(in):采样数量。参数 X_array(in):指向 X 分布的指针。参数 Val_array(in):指向 Y 值的指针。参数(inout):无。参数(out):无。返回值:float32,插值结果。可通过 Ifl.h 获得。

float32 Ifl_IntIpoCur_f32_f32 ( float32 X_in, uint32 N, const float32* X_array, const float32* Val_array )
index   = minimum value of integer index if (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

如果输入值与分布数组中的某个值匹配,则结果将是该索引所指示的相应 Y 数组元素。

如果 (Xin == X_array[index]),则:

Result = Val_array[index]

如果 Xin < X_array[0],则:

Result = Val_array[0]

如果 Xin > X_array[N-1],则:

Result = Val_array[N-1]

N 的最小值应为 1。

7.5.2.2. 集成式映射插值(Integrated map interpolation)
7.5.2.2.1. Ifl_IntIpoMap_f32f32_f32

说明: 本例程使用以下等式计算映射在位置 X 和 Y 处的插值。服务 ID 0x011。本服务为同步调用,可重入。参数 Xin(in):X 轴的输入值。参数 Yin(in):Y 轴的输入值。参数 Nx(in):X 轴区间数。参数 Ny(in):Y 轴区间数。参数 X_array(in):指向 X 轴分布数组的指针。参数 Y_array(in):指向 Y 轴分布数组的指针。参数 Val_array(in):指向结果轴分布数组的指针。参数(inout):无。参数(out):无。返回值:float32,映射插值结果。可通过 Ifl.h 获得。

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 )
indexX   = minimum value of index if (X_array[indexX] < Xin < X_array[indexX+1])
indexY   = minimum value of index if (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

如果 (Xin == X_array[indexX]) 且 (Y_array[indexY] < Yin < Y_array[indexY+1]):

Result = Val_array [BaseIndex] + (Val_array [BaseIndex+1] - Val_array[BaseIndex]) * RatioY

如果 (Yin == Y_array[indexY]) 且 (X_array[indexX] < Xin < X_array[indexX+1]):

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

如果 (Xin == X_array[indexX]) 且 (Yin == Y_array[indexY]):

Result = Val_array [BaseIndex]

如果 Xin < X_array[0],则 indexX = 0,RatioX = 0.0。

如果 Xin > X_array[Nx-1],则 indexX = Nx - 1,RatioX = 0.0。

如果 Yin < Y_array[0],则 indexY = 0,RatioY = 0.0。

如果 Yin > Y_array[Ny-1],则 indexY = Ny - 1,RatioY = 0.0。

N 的最小值应为 1。

7.5.2.3. 长方体 3D 插值(Cuboid 3D interpolation)
7.5.2.3.1. Ifl_IpoCub_f32

说明: 基于使用相关的 Ifl_DPSearch_f32 例程搜索到的索引和比率信息,本例程计算并返回 3D 长方体的插值结果。服务 ID 0x12。本服务为同步调用,可重入。参数 dpResultX(in):X 轴的数据点搜索结果。参数 dpResultY(in):Y 轴的数据点搜索结果。参数 dpResultZ(in):Z 轴的数据点搜索结果。参数 num_x(in):X 轴点的数量。参数 num_y(in):Y 轴点的数量。参数 Val_array(in):指向结果轴分布数组的指针。参数(inout):无。参数(out):无。返回值:float32,插值结果。可通过 Ifl.h 获得。

float32 Ifl_IpoCub_f32 ( const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, const Ifl_DPResultF32_Type* dpResultZ, uint16 num_x, uint16 num_y, const float32* Val_array )

基于使用 Ifl_DPSearch_f32 例程搜索到的索引和比率信息,本例程计算并返回 3D 长方体的插值结果。

轴序的内存表示为 [z][x][y]。这是 ASAM 标准中的列优先方向(COLUMN_DIR)。第一个轴 z 指定所选的切片。

实现:

沿 x 轴在相邻 X/Y 映射的两个 2D 插值结果之间进行线性插值。

num_slice = num_x * num_y
if(dpResultZ->Ratio==0.0)
Result=Ifl_IpoMap_f32 (dpResultX, dpResultY, num_y, Val_array[num_slice * dpResultZ->Index])
else
LowerXY=Ifl_IpoMap_f32 (dpResultX, dpResultY, num_y, Val_array[num_slice * dpResultZ->Index])
UpperXY=Ifl_IpoMap_f32 (dpResultX, dpResultY, num_y, Val_array[num_slice * dpResultZ->Index + 1])
Result=Ifl_Interpolate_f32 (LowerXY, UpperXY, dpResultZ->Ratio)
7.5.2.4. 整数曲线的混合类型插值(Mixed type interpolation of integer curve)
7.5.2.4.1. Ifl_IpoCur_<InTypeMn>_f32

说明: 基于使用相关的 Ifl_DPSearch_f32 例程搜索到的索引和比率信息,本例程计算并返回曲线的插值结果。服务 ID 0x13 至 0x16。本服务为同步调用,可重入。参数 dpResult(in):数据点搜索结果。参数 Val_array(in):指向结果轴分布数组的指针。参数(inout):无。参数(out):无。返回值:float32,插值结果。可通过 Ifl.h 获得。

float32 Ifl_IpoCur_<InTypeMn>_f32 ( const Ifl_DPResultF32_Type* dpResult, const <InType>* Val_array )
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

以下是已实现例程的列表:

例程 ID [hex] 例程原型
0x013 float32 Ifl_IpoCur_u8_f32 ( const Ifl_DPResultF32_Type* dpResult, const uint8* Val_array)
0x014 float32 Ifl_IpoCur_u16_f32 ( const Ifl_DPResultF32_Type* dpResult, const uint16* Val_array)
0x015 float32 Ifl_IpoCur_s8_f32 ( const Ifl_DPResultF32_Type* dpResult, const sint8* Val_array)
0x016 float32 Ifl_IpoCur_s16_f32 ( const Ifl_DPResultF32_Type* dpResult, const sint16* Val_array)
7.5.2.5. 整数映射的混合类型插值(Mixed type interpolation of integer map)
7.5.2.5.1. Ifl_IpoMap_<InTypeMn>_f32

说明: 基于使用相关的 Ifl_DPSearch_f32 例程搜索到的索引和比率信息,本例程计算并返回映射的插值结果。服务 ID 0x18 至 0x1b。本服务为同步调用,可重入。参数 dpResultX(in):X 轴的数据点搜索结果。参数 dpResultY(in):Y 轴的数据点搜索结果。参数 num_value(in):Y 轴点的数量。参数 Val_array(in):指向结果轴分布数组的指针。参数(inout):无。参数(out):无。返回值:float32,插值结果。可通过 Ifl.h 获得。

float32 Ifl_IpoMap_<InTypeMn>_f32 ( const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, uint32 num_value, const <InType>* Val_array )

基于使用 Ifl_DPSearch_f32 例程搜索到的索引和比率信息,本例程计算并返回映射的插值结果。

BaseIndex = dpResultX->Index * num_value + dpResultY->Index
if (dpResultX->Ratio == 0.0)
  if (dpResultY->Ratio == 0.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.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

以下是已实现例程的列表。

例程 ID [hex] 例程原型
0x018 float32 Ifl_IpoMap_u8_f32 ( const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, uint32 num_value, const uint8* Val_array)
0x019 float32 Ifl_IpoMap_u16_f32 ( const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, uint32 num_value, const uint16* Val_array)
0x01A float32 Ifl_IpoMap_s8_f32 (const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, uint32 num_value, const sint8* Val_array)
0x01B float32 Ifl_IpoMap_s16_f32 (const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, uint32 num_value, const sint16* Val_array)
7.5.2.6. 整数 3D 长方体的混合类型插值(Mixed type interpolation of integer 3D Cuboid)
7.5.2.6.1. Ifl_IpoCub_<InTypeMn>_f32

说明: 基于使用相关的 Ifl_DPSearch_f32 例程搜索到的索引和比率信息,本例程计算并返回 3D 长方体的插值结果。服务 ID 0x1C 至 0x1F。本服务为同步调用,可重入。参数 dpResultX(in):X 轴的数据点搜索结果。参数 dpResultY(in):Y 轴的数据点搜索结果。参数 dpResultZ(in):Z 轴的数据点搜索结果。参数 num_x(in):X 轴点的数量。参数 num_y(in):Y 轴点的数量。参数 Val_array(in):指向结果轴分布数组的指针。参数(inout):无。参数(out):无。返回值:float32,插值结果。可通过 Ifl.h 获得。

float32 Ifl_IpoCub_<InTypeMn>_f32 ( const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, const Ifl_DPResultF32_Type* dpResultZ, uint16 num_x, uint16 num_y, const <InType>* Val_array )

基于使用 Ifl_DPSearch_f32 例程搜索到的索引和比率信息,本例程计算并返回 3D 长方体的插值结果。

轴序的内存表示为 [z][x][y]。这是 ASAM 标准中的列优先方向(COLUMN_DIR)。第一个轴 z 指定所选的切片。

实现:

沿 x 轴在相邻 X/Y 映射的两个 2D 插值结果之间进行线性插值。

num_slice = num_x*num_y
if (dpResultZ->Ratio == 0.0)
Result = Ifl_IpoMap_<InTypeMn>_f32 (dpResultX, dpResultY, num_y, Val_array[num_slice*dpResultZ->Index])
else
LowerXY = Ifl_IpoMap_<InTypeMn>_f32 (dpResultX, dpResultY, num_y, Val_array[num_slice*dpResultZ->Index])
UpperXY = Ifl_IpoMap_<InTypeMn>_f32 (dpResultX, dpResultY, num_y, Val_array[num_slice*dpResultZ->Index + 1])
Result = Ifl_Interpolate_f32 (LowerXY, UpperXY, dpResultZ->Ratio)

以下是已实现例程的列表。

例程 ID [hex] 例程原型
0x01C float32 Ifl_IpoCub_u8_f32 ( const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, const Ifl_DPResultF32_Type* dpResultZ, uint16 num_x, uint16 num_y, const uint8* Val_array)
0x01D float32 Ifl_IpoCub_u16_f32 ( const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, const Ifl_DPResultF32_Type* dpResultZ, uint16 num_x, uint16 num_y, const uint16* Val_array)
0x01E float32 Ifl_IpoCub_s8_f32 (const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, const Ifl_DPResultF32_Type* dpResultZ, uint16 num_x, uint16 num_y, const sint8* Val_array)
0x01F float32 Ifl_IpoCub_s16_f32 (const Ifl_DPResultF32_Type* dpResultX, const Ifl_DPResultF32_Type* dpResultY, const Ifl_DPResultF32_Type* dpResultZ, uint16 num_x, uint16 num_y, const sint16* Val_array)

7.5.3. 插值例程的记录布局(Record layouts for interpolation routines)

记录布局(Record layout)规定了 ECU 内存中标定数据的序列化方式,它描述了特性曲线(characteristics)的形状。单个记录布局可以被多个插值 ParameterDataPrototype 实例引用。记录布局可以嵌套,特定的值引用对象的特定属性。利用记录布局的不同属性,可以指定复杂的对象。

7.5.3.1. 映射值的记录布局(Record layout for map values)

由于优化,映射值在内存中的方向因输入的使用方式而异。参见第 8.4.2 节。

  1. 如果「X」和「Y」输入未交换,则映射的值「Val」必须按 COLUMN_DIR 顺序排列。
  2. 如果「X」和「Y」输入被交换,则映射的值「Val」必须按 ROW_DIR 顺序排列。

根据 ASAM 标准 [ASAM MCD-2MC Version 1.5.1 and 1.6],COLUMN_DIR 和 ROW_DIR 是存储映射值(Val[])的格式,更多信息可在 ASAM 标准中找到。

长方体的「Z」输入是第三个维度,用于选择 X / Y 或 Y / X 的 2D 映射切片。

长方体顺序示例:

内存中的 2x2x2 长方体表示。

示例:cub = [1 2 3 4 5 6 7 8]。

COLUMN_DIR 顺序 [z][x][y]:

切片 1:

[1 2
 3 4]

切片 2:

[5 6
 7 8]
7.5.3.2. 记录布局定义(Record layout definitions)

下表规定了插值例程支持的记录布局。

记录布局名称 元素 1 元素 2 元素 3 元素 4 元素 5
Distr_f32 uint32 N float32 X[]
Curve_f32 float32 Val[]
Map_f32 float32 Val[]
Cub_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[]

注意:

所有组合都必须在 IFL_RecordLayout_Blueprint(AUTOSAR_MOD_IFL_RecordLayout_Blueprint.arxml)中定义。

7.6. 版本 API(Version API)

7.6.1. Ifl_GetVersionInfo

说明: 返回本库的版本信息。服务 ID 0xff。本服务为同步调用,可重入。参数(in):无。参数(inout):无。参数 versioninfo(out):指向存储本模块版本信息的位置,格式遵循 [BSW00321] 的规定。返回值:无。可通过 Ifl.h 获得。

void Ifl_GetVersionInfo ( Std_VersionInfoType* versioninfo )

BSW 模块的版本信息通常包含:

  • 模块 Id
  • 供应商 Id
  • 供应商特定的版本号。

如果 Ifl_GetVersionInfo 的调用方与被调用方的源代码均可用,Ifl 库应将 Ifl_GetVersionInfo 实现为在模块头文件中定义的宏。

7.7. 回调通知

Ifl 模块没有回调通知。

7.8. 调度例程

Ifl 库没有调度例程。

7.9. 期望接口

7.9.1. 强制接口

无强制接口。

7.9.2. 可选接口

无可选接口。

7.9.3. 可配置接口

无可配置接口。

8. 配置规范

8.1. 发布信息(Published Information)

Ifl 模块应在头文件中发布基础软件模块通用要求 [REF] 中 SRS_BSW_00402 所要求的标准化公共发布参数,并需要在 BSW 模块描述中提供这些参数。相应的模块缩写可在基础软件模块列表 [REF] 中找到。

如适用,下面列出了其他模块特有的发布参数。

8.2. 配置选项(Configuration option)

Ifl 库不应具有任何可能影响例程功能行为的配置选项。即对于给定的一组输入参数,输出应始终相同。例如,发生错误时返回的值不应是可配置的。

然而,允许库供应商添加与库实现相关的特定配置选项,例如用于资源消耗优化。

B. AUTOSAR 可追溯项变更历史

请注意,本章中的列表还包含在后续版本中已从规范中删除的规范项。这些规范项在文档中不显示为超链接。

B.1. 本文档与 AUTOSAR R22-11 相比的规范项变更历史

B.1.1. R23-11 中新增的规范项

无

B.1.2. R23-11 中变更的规范项

表B.1:R23-11 中变更的规范项(Changed Specification Items in R23-11)

编号 标题
[SWS_Ifl_00005] Definition of datatype Ifl_DPResultF32_Type
[SWS_Ifl_00021] Definition of API function Ifl_IpoCur_f32
[SWS_Ifl_00025] Definition of API function Ifl_IpoMap_f32
[SWS_Ifl_00030] Definition of API function Ifl_Interpolate_f32
[SWS_Ifl_00035] Definition of API function Ifl_IntIpoCur_f32_f32
[SWS_Ifl_00041] Definition of API function Ifl_IntIpoMap_f32f32_f32
[SWS_Ifl_00170]
[SWS_Ifl_91000] Definition of API function Ifl_IpoCub_f32
[SWS_Ifl_91001] Definition of API function Ifl_IpoCur_<InTypeMn>_f32
[SWS_Ifl_91002] Definition of API function Ifl_IpoMap_<InTypeMn>_f32
[SWS_Ifl_91003] Definition of API function Ifl_IpoCub_<InTypeMn>_f32

B.1.3. R23-11 中删除的规范项

无