AUTOSAR 固定点插值库 (IFX Library) 详解
基于 AUTOSAR CP Release 4.4.0 的规范文档
目录
- 概述
- 架构设计
2.1 模块架构
2.2 数据流设计
2.3 数据类型定义 - 功能规范
3.1 错误分类与检测
3.2 初始化与关闭
3.3 库实现要求 - 例程规范
4.1 数据类型
4.2 舍入规则
4.3 目标优化
4.4 特殊情况处理 - 总结
1. 概述
AUTOSAR固定点插值库(IFX Library)是AUTOSAR平台中的基础组件,提供固定点数学运算和插值功能,用于实现各种数值计算。本文档详细分析了IFX库的规范、架构和使用方法。
IFX库的主要特点:
- 提供固定点插值运算功能
- 支持各种数据类型的输入/输出
- 无需初始化和关闭阶段
- 不依赖于DET错误处理机制
- 符合MISRA C 2012标准
- 使用AUTOSAR标准数据类型
2. 架构设计
2.1 模块架构
IFX库在AUTOSAR架构中的位置及其与其它模块的关系如下图所示:
架构解释
IFX库位置:
- 功能:IFX库位于AUTOSAR基础软件层,属于库(Libraries)模块
- 主要组成:插值函数(Interpolation)、查表函数(Map Lookup)、数据点搜索(DP Search)
- 调用方式:可直接被应用软件组件(SWC)或其他BSW模块调用
调用关系:
- 应用软件组件可以直接调用IFX库函数
- 其他BSW模块也可以直接调用IFX库函数
- 不需要通过RTE或其他中间层
特性说明:
- 无初始化和关闭阶段:IFX库可以在ECU初始化的最早阶段被调用
- 不依赖DET:不使用DET进行错误通知
- 无状态设计:采用纯函数调用方式,无内部状态
- 符合标准:遵循MISRA-C 2012编码标准
- 数据类型:使用AUTOSAR标准数据类型
2.2 数据流设计
IFX库中数据的处理流程和各模块间的交互如下图所示:
数据流解释
基本调用流程:
- 调用IFX API:应用软件组件或BSW模块调用IFX库函数
- 数据处理路径:
- 插值函数路径:调用插值函数→找到相邻数据点→计算插值结果→返回结果
- 查表函数路径:调用查表函数→找到相邻数据点→查表获取结果→返回结果
数据点搜索特性:
- 处理单调递增数据系列
- 返回索引和插值比率
- 比率分辨率为2^-16
- 使用结构体
Ifx_DPResultU16_Type
存储结果
插值计算规则:
- 边界处理:
- 输入值小于第一个分布点:使用第一个值
- 输入值大于最后一个分布点:使用最后一个值
- 中间结果向零舍入
2.3 数据类型定义
IFX库使用的数据类型及其关系如下图所示:
数据类型解释
标准数据类型:
- IFX库使用AUTOSAR标准数据类型:
boolean
:布尔类型,值为TRUE或FALSEsint8
/s8
:有符号8位整型,范围[-128, 127]uint8
/u8
:无符号8位整型,范围[0, 255]sint16
/s16
:有符号16位整型,范围[-32768, 32767]uint16
/u16
:无符号16位整型,范围[0, 65535]sint32
/s32
:有符号32位整型,范围[-2147483648, 2147483647]uint32
/u32
:无符号32位整型,范围[0, 4294967295]
自定义数据类型:
Ifx_DPResultU16_Type
:用于数据点搜索的结构体,包含:Index
:数据点索引Ratio
:插值比率,分辨率为2^-16,向零舍入- 此结构体不应被用户直接读/写/修改
API函数类型:
- 数据点搜索函数:
Ifx_DP_search_<InTypeMn1>(...)
- 插值函数:
Ifx_Ipo_<InTypeMn1>_<OutTypeMn1>(...)
和Ifx_IntIpo_<InTypeMn1>_<OutTypeMn1>(...)
- 查表函数:
Ifx_IpoMap_<InTypeMn1>_<OutTypeMn1>(...)
和Ifx_IntIpoMap_<InTypeMn1>_<OutTypeMn1>(...)
命名约定:
InTypeMn1
:输入类型助记符 (u8, s8, u16, s16, u32, s32)OutTypeMn1
:输出类型助记符 (u8, s8, u16, s16, u32, s32)- 示例:
Ifx_IpoMap_s16u8_s8
表示使用sint16输入X, uint8输入Y, sint8输出
数据类型示例代码
/* Ifx_DPResultU16_Type结构体定义 */
typedef struct {
uint16 Index; /* 数据点索引 */
uint16 Ratio; /* 数据点比率,分辨率2^-16 */
} Ifx_DPResultU16_Type;
/* 数据点搜索函数示例 */
Ifx_DPResultU16_Type Ifx_DP_search_s16(
const sint16* X_TablePtr, /* X坐标表指针 */
uint16 NoOfPoints, /* 点数量 */
sint16 X /* 查询点X坐标 */
);
/* 插值函数示例 */
sint16 Ifx_Ipo_s16_s16(
const sint16* X_TablePtr, /* X坐标表指针 */
const sint16* Y_TablePtr, /* Y坐标表指针 */
uint16 NoOfPoints, /* 点数量 */
sint16 X /* 查询点X坐标 */
);
/* 查表函数示例 */
sint16 Ifx_IpoMap_s16u8_s16(
const sint16* X_TablePtr, /* X坐标表指针 */
uint16 NoOfXPoints, /* X点数量 */
const uint8* Y_TablePtr, /* Y坐标表指针 */
uint16 NoOfYPoints, /* Y点数量 */
const sint16* Z_TablePtr, /* Z值表指针 */
sint16 X, /* 查询点X坐标 */
uint8 Y /* 查询点Y坐标 */
);
3. 功能规范
3.1 错误分类与检测
IFX库采用简单的错误处理机制:
- 无错误分类定义:IFX库不支持DET(Default Error Tracer)调用
- 错误检测:函数应在运行时检查输入参数值,特别是那些可能导致致命错误或不可预测结果的情况
- 错误处理:当检测到错误时,函数应返回规范中指定的非可配置值
- 不检测的错误:如果传递给例程的值无效且超出函数规范范围,则不检测此类错误
/* 错误检测示例 */
sint16 Ifx_Ipo_s16_s16(
const sint16* X_TablePtr,
const sint16* Y_TablePtr,
uint16 NoOfPoints,
sint16 X
)
{
/* 参数验证 */
if (X_TablePtr == NULL || Y_TablePtr == NULL || NoOfPoints == 0) {
return 0; /* 返回规范指定的错误值 */
}
/* 其它处理逻辑 */
/* ... */
}
3.2 初始化与关闭
IFX库的初始化和关闭特性:
- 无初始化阶段:IFX库不需要初始化阶段,可在ECU初始化的第一步被调用
- 无关闭阶段:IFX库不需要关闭操作阶段
- 直接API调用:IFX API可直接从BSW模块或SWC调用,无需端口定义
- 无状态设计:纯函数调用,无内部状态维护
3.3 库实现要求
IFX库的实现必须遵循以下要求:
- 代码共享:库代码应实现为可在不同内存分区的调用者之间共享
- 避免宏:应避免使用宏,函数应声明为函数或内联函数
- 函数调用限制:库函数可以调用其他库函数,但不能调用任何BSW模块函数
- 编码标准:应符合MISRA C标准
- 内存映射:使用AUTOSAR内存映射机制映射代码到内存段
- 标准类型:包含
StandardTypes.h
头文件,使用AUTOSAR整数数据类型 - 平台独立性:避免直接使用编译器和平台特定关键字
4. 例程规范
4.1 数据类型
IFX库使用的数据类型及助记符:
- 布尔类型:
boolean
,值为TRUE或FALSE - 有符号整型:
sint8
/s8
:范围[-128, 127]sint16
/s16
:范围[-32768, 32767]sint32
/s32
:范围[-2147483648, 2147483647]
- 无符号整型:
uint8
/u8
:范围[0, 255]uint16
/u16
:范围[0, 65535]uint32
/u32
:范围[0, 4294967295]
这些助记符用在例程名称中表示输入和输出类型。
4.2 舍入规则
IFX库中的舍入规则:
- 向零舍入:
- 0 ≤ X < 1 舍入为 0
- -1 < X ≤ 0 舍入为 0
- 插值计算中的舍入:插值计算中的中间结果应向零舍入
4.3 目标优化
IFX库支持两种优化方式:
-
目标优化:
- 部分例程可被另一个使用整数提升的例程替代
- 部分例程可被限制例程和不同签名的例程组合替代
-
例程数量优化:
- 通过交换’X’和’Y’数据类型减少例程总数
- 优化规则:
- 规则1:较大数据类型优先(16位优先于8位)
- 规则2:无符号类型优先于有符号类型(u16优先于s16)
- 数据类型优先级:u32, s32, u16, s16, u8, s8
4.4 特殊情况处理
IFX库对特殊情况的处理规定:
- 输入值小于第一个分布条目:返回或使用分布数组的第一个值
- 输入值大于最后一个分布条目:返回或使用分布数组的最后一个值
- 轴分布要求:传递给Ifx例程的轴分布必须具有严格单调序列
5. 总结
AUTOSAR固定点插值库(IFX)是AUTOSAR平台中的基础组件,提供了一系列用于固定点数学运算和插值的功能。它的设计特点包括:
- 无状态设计:纯函数调用,无需初始化和关闭阶段
- 错误处理简化:不依赖DET,直接返回规范指定的错误值
- 优化灵活:支持多种优化方式,适应不同目标平台
- 标准遵循:符合MISRA C 2012标准,使用AUTOSAR标准数据类型
- 特殊情况处理:对边界情况有明确定义的处理方式
IFX库作为AUTOSAR平台的基础库,为各种数值计算提供支持,包括插值、查表和数据点搜索等功能,适用于需要高效固定点数学计算的各种应用场景。