AUTOSAR进阶图解==>AUTOSAR_SWS_MFXLibrary
AUTOSAR 固定点数学库(MFX)详解
目录
- 1. 概述
- 1.1 MFX库的作用
- 1.2 MFX库在AUTOSAR架构中的位置
- 2. MFX库架构设计
- 2.1 模块结构
- 2.2 数据流与错误处理
- 3. MFX库功能详解
- 3.1 基本算术运算函数
- 3.2 特殊运算函数
- 3.3 组合运算函数
- 4. 数据类型支持
- 4.1 标准数据类型
- 4.2 2^n尺度整数
- 5. 总结
1. 概述
1.1 MFX库的作用
AUTOSAR固定点数学库(MFX)是AUTOSAR基础软件的一部分,专门用于提供固定点数值的算术运算。在嵌入式系统和汽车电子领域,由于浮点运算的性能和资源消耗问题,固定点数学计算被广泛应用于各种控制算法和信号处理中。
MFX库提供了一系列标准化的算术运算函数,包括基本运算(加、减、乘、除、模)、特殊运算(绝对值、限制器)以及组合运算(乘除组合、移位组合)等。这些函数对于开发高性能、可靠的嵌入式应用至关重要。
1.2 MFX库在AUTOSAR架构中的位置
图1.1 AUTOSAR固定点数学库在软件架构中的位置
1.2.1 架构层次解释
MFX库位于AUTOSAR软件架构的基础软件层中,具体属于服务层的数学库服务模块。从图中可以看出,其在整个AUTOSAR架构中的定位与作用:
-
层级位置:
- MFX库位于AUTOSAR 基础软件(BSW) 的 服务层 中
- 作为标准化数学服务的一部分,提供基础计算能力
- 与其他服务层模块(如通信服务、诊断服务、内存服务)并列
-
与应用层的关系:
- 应用软件组件通过 运行时环境(RTE) 间接使用MFX库提供的功能
- 应用层不直接调用MFX库,而是通过RTE进行抽象调用
-
与系统其他部分的关联:
- 作为基础软件的一部分,MFX库遵循AUTOSAR标准的模块化设计
- 提供可重入的函数接口,可被多个可运行实体同时使用
1.2.2 功能定位解释
MFX库在AUTOSAR架构中的核心功能定位:
- 提供标准化的固定点数学计算:为不支持或不希望使用浮点运算的ECU提供精确的数学计算能力
- 确保跨平台一致性:不同ECU上的计算结果保持一致,提高软件可移植性
- 优化资源使用:相比浮点运算,固定点计算在嵌入式环境中更为高效
1.2.3 代码调用示例
应用软件如何通过RTE访问MFX库功能:
/* 应用软件组件中调用MFX库函数的示例 *//* RTE接口声明 */
extern sint16 Rte_Call_MathServices_Mfx_Add_s16(sint16 op1, sint16 op2);
extern sint16 Rte_Call_MathServices_Mfx_Mul_s16(sint16 op1, sint16 op2);/* 应用函数示例 */
sint16 App_CalculateControlValue(sint16 sensorValue, sint16 offsetValue, sint16 gainFactor)
{sint16 adjustedValue;sint16 controlValue;/* 使用MFX加法函数计算校正后的传感器值 */adjustedValue = Rte_Call_MathServices_Mfx_Add_s16(sensorValue, offsetValue);/* 使用MFX乘法函数应用增益因子 */controlValue = Rte_Call_MathServices_Mfx_Mul_s16(adjustedValue, gainFactor);return controlValue;
}
2. MFX库架构设计
2.1 模块结构
MFX库包含多种数学函数,这些函数按照功能类型分组并提供一致的接口规范。基于源文档分析,MFX库具有以下主要特点:
- 可重入性:所有MFX库函数都是可重入的,可被多个可运行实体同时使用
- 标准化接口:遵循AUTOSAR标准的命名规则和接口定义
- 多数据类型支持:支持不同位宽的有符号和无符号整数类型
- 错误处理机制:通过标准的错误报告机制处理异常情况
2.2 数据流与错误处理
图2.1 MFX库数据流和错误处理序列图
2.2.1 数据流程解释
MFX库的数据流和错误处理机制包含三个主要流程:
-
正常操作流程:
- 应用软件组件通过RTE调用MFX库函数
- MFX函数执行参数校验后进行计算
- 计算结果通过RTE返回给应用
-
参数错误处理流程:
- 应用提供的参数无效时,MFX库进行参数校验
- 检测到参数错误时,MFX库通过DET(默认错误追踪器)报告错误
- 同时返回默认值或错误码给应用
-
溢出处理流程:
- 当计算可能导致溢出时,MFX库提供多种处理方式
- 根据配置,可以执行饱和处理或报告错误
- 饱和处理时返回可表示的最大/最小值
- 报错时通过DET报告并返回特定错误码
2.2.2 序列参与者解释
序列图中的参与者各自承担不同角色:
-
应用软件组件:
- 角色:调用方
- 职责:通过RTE请求数学计算服务,处理返回结果
-
运行时环境(RTE):
- 角色:中介层
- 职责:转发函数调用,隔离基础软件与应用软件
-
MFX库函数:
- 角色:服务提供方
- 职责:执行实际计算,处理异常情况,确保计算结果正确
-
默认错误追踪器(DET):
- 角色:错误处理服务
- 职责:记录和管理开发错误,提供统一的错误处理机制
2.2.3 错误处理代码示例
/* MFX库函数实现示例,包含错误处理 */
sint16 Mfx_Add_s16(sint16 op1, sint16 op2)
{sint32 result;/* 计算结果,使用更大的类型避免中间计算溢出 */result = (sint32)op1 + (sint32)op2;/* 检查溢出,如果结果超出sint16范围 */if (result > INT16_MAX) {/* 溢出处理 - 饱和到最大值 */
#if (MFX_DEV_ERROR_DETECT == STD_ON)/* 报告溢出错误 */Det_ReportError(MFX_MODULE_ID, 0, MFX_ADD_API_ID, MFX_E_OVERFLOW);
#endifreturn INT16_MAX;}else if (result < INT16_MIN) {/* 溢出处理 - 饱和到最小值 */
#if (MFX_DEV_ERROR_DETECT == STD_ON)/* 报告溢出错误 */Det_ReportError(MFX_MODULE_ID, 0, MFX_ADD_API_ID, MFX_E_OVERFLOW);
#endifreturn INT16_MIN;}/* 正常情况 - 返回计算结果 */return (sint16)result;
}
3. MFX库功能详解
3.1 固定点数学函数概览
图3.1 MFX库函数分类与功能概览
3.1.1 函数分类解释
MFX库提供的函数可分为三大类,每类函数针对特定计算需求提供解决方案:
-
基本算术运算函数:
- 加法函数(Mfx_Add_<DataType>):执行两个操作数的加法运算
- 减法函数(Mfx_Sub_<DataType>):执行两个操作数的减法运算
- 乘法函数(Mfx_Mul_<DataType>):执行两个操作数的乘法运算
- 除法函数(Mfx_Div_<DataType>):执行两个操作数的除法运算
- 取模函数(Mfx_Mod_<DataType>):计算两个操作数的模运算结果
-
特殊运算函数:
- 绝对值函数(Mfx_Abs_<DataType>):返回输入的绝对值
- 差值绝对值函数(Mfx_AbsDiff_<DataType>):计算两个输入值差的绝对值
- 限制函数(Mfx_Limit_<DataType>):将输入值限制在指定的最小值和最大值之间
- 最小最大值限制函数(Mfx_Minmax_<DataType>):使用单一值同时作为最小值和最大值限制
-
组合运算函数:
- 乘除组合函数(Mfx_MulDiv_<DataType>):在一个原子操作中完成乘法后接除法的计算
- 乘法右移组合函数(Mfx_MulShRight_<DataType>):在一个原子操作中完成乘法后接右移的计算
- 除法左移组合函数(Mfx_DivShLeft_<DataType>):在一个原子操作中完成除法后接左移的计算
3.1.2 基本算术运算函数详解
基本算术运算函数是MFX库的核心功能,用于执行基础数学计算。这些函数具有以下共同特点:
- 溢出保护:检测并处理计算过程中可能出现的溢出情况
- 多数据类型:每种运算都支持不同位宽的有符号和无符号整数
- 标准化接口:函数接口遵循统一的命名和参数规范
以下是基本算术运算函数的示例实现:
/* 基本算术运算函数示例实现 *//* 加法函数 */
sint16 Mfx_Add_s16(sint16 op1, sint16 op2)
{sint32 result;/* 使用更大的数据类型进行计算,避免中间溢出 */result = (sint32)op1 + (sint32)op2;/* 溢出检查和处理 */if (result > INT16_MAX) {return INT16_MAX; /* 正溢出处理 */}else if (result < INT16_MIN) {return INT16_MIN; /* 负溢出处理 */}return (sint16)result;
}/* 乘法函数 */
sint16 Mfx_Mul_s16(sint16 op1, sint16 op2)
{sint32 result;/* 使用更大的数据类型进行计算,避免中间溢出 */result = (sint32)op1 * (sint32)op2;/* 溢出检查和处理 */if (result > INT16_MAX) {return INT16_MAX; /* 正溢出处理 */}else if (result < INT16_MIN) {return INT16_MIN; /* 负溢出处理 */}return (sint16)result;
}
3.1.3 特殊运算函数详解
特殊运算函数扩展了MFX库的功能,提供了常见数学操作的优化实现:
- 绝对值函数:用于获取输入值的绝对值,广泛用于差值计算和信号处理
- 限制函数:用于确保数值在有效范围内,对控制算法尤为重要
以下是特殊运算函数的示例实现:
/* 特殊运算函数示例实现 *//* 绝对值函数 */
sint16 Mfx_Abs_s16(sint16 op1)
{if (op1 == INT16_MIN) {/* 特殊情况:INT16_MIN的绝对值超出sint16范围 */return INT16_MAX; /* 返回可表示的最大值 */}return (op1 < 0) ? (sint16)(-op1) : op1;
}/* 差值绝对值函数 */
uint16 Mfx_AbsDiff_s16(sint16 op1, sint16 op2)
{sint32 result;/* 计算差值,使用sint32避免中间计算溢出 */result = (sint32)op1 - (sint32)op2;/* 取绝对值 */if (result < 0) {result = -result;}/* 结果可能大于UINT16_MAX,需要饱和处理 */if (result > UINT16_MAX) {return UINT16_MAX;}return (uint16)result;
}/* 限制函数 */
sint16 Mfx_Limit_s16(sint16 value, sint16 min, sint16 max)
{if (min > max) {/* 参数错误处理 */return value; /* 或其他错误处理 */}if (value < min) {return min; /* 下限限制 */}else if (value > max) {return max; /* 上限限制 */}return value; /* 值在范围内,不需要限制 */
}
3.1.4 组合运算函数详解
组合运算函数提供了复杂计算场景的优化实现,减少中间结果可能造成的溢出风险:
- 乘除组合函数:通常用于比例因子应用,如传感器信号校准
- 移位组合函数:为2^n尺度整数提供高效的数值转换和计算
以下是组合运算函数的示例实现:
/* 组合运算函数示例实现 *//* 乘除组合函数 */
sint16 Mfx_MulDiv_s16(sint16 op1, sint16 op2, sint16 op3)
{sint32 result;/* 参数校验 */if (op3 == 0) {/* 除零错误处理 */
#if (MFX_DEV_ERROR_DETECT == STD_ON)Det_ReportError(MFX_MODULE_ID, 0, MFX_MULDIV_API_ID, MFX_E_DIVIDE_BY_ZERO);
#endifreturn 0; /* 或其他错误值 */}/* 先乘后除,使用sint32避免中间计算溢出 */result = ((sint32)op1 * (sint32)op2) / (sint32)op3;/* 溢出检查和处理 */if (result > INT16_MAX) {return INT16_MAX; /* 正溢出处理 */}else if (result < INT16_MIN) {return INT16_MIN; /* 负溢出处理 */}return (sint16)result;
}/* 乘法右移组合函数(用于2^n尺度整数) */
sint16 Mfx_MulShRight_s16(sint16 op1, sint16 op2, uint8 shift)
{sint32 result;/* 参数校验 */if (shift > 15) { /* 对于sint16,最大移位值为15 *//* 参数错误处理 */
#if (MFX_DEV_ERROR_DETECT == STD_ON)Det_ReportError(MFX_MODULE_ID, 0, MFX_MULSHRIGHT_API_ID, MFX_E_PARAM_INVALID);
#endifreturn 0; /* 或其他错误值 */}/* 先乘后右移,使用sint32避免中间计算溢出 */result = ((sint32)op1 * (sint32)op2) >> shift;/* 溢出检查和处理 */if (result > INT16_MAX) {return INT16_MAX; /* 正溢出处理 */}else if (result < INT16_MIN) {return INT16_MIN; /* 负溢出处理 */}return (sint16)result;
}
4. 数据类型支持
4.1 标准数据类型
MFX库支持多种标准数据类型,这些类型在AUTOSAR_SWS_PlatformTypes中定义:
- sint8/uint8 (s8/u8):8位有符号/无符号整数
- sint16/uint16 (s16/u16):16位有符号/无符号整数
- sint32/uint32 (s32/u32):32位有符号/无符号整数
以下是基于这些数据类型的函数命名约定:
- Mfx_Add_s16:16位有符号整数加法
- Mfx_Mul_u32:32位无符号整数乘法
- Mfx_Div_s8:8位有符号整数除法
4.2 2^n尺度整数
MFX库还专门支持2^n尺度整数,这是一种特殊的固定点表示法,其比例因子为2的幂。这种表示方式在计算效率和精度间取得了良好平衡。
针对2^n尺度整数,MFX库提供了特殊的组合运算函数:
- Mfx_MulShRight_<DataType>:乘法后接右移,用于比例因子放大
- Mfx_DivShLeft_<DataType>:除法后接左移,用于比例因子缩小
/* 2^n尺度整数应用示例 *//** 示例:油门踏板位置传感器信号处理* - 传感器原始值范围:0-1023 (10位ADC)* - 需要转换为百分比:0-100%* - 使用2^n尺度整数表示:百分比值 = (原始值 * 100 * 2^8) / 1023* - 最终缩放后数值以2^8为比例因子,即256表示1.0*/
uint16 ProcessThrottleSignal(uint16 adcValue)
{uint16 scaledPercentage;/* 计算百分比值,保留小数精度 *//* 结果是0-100%的值,以2^8为比例因子(0-25600) */scaledPercentage = Mfx_MulDiv_u16(adcValue, 25600u, 1023u);return scaledPercentage; /* 百分比值,256表示1% */
}/* 使用上述比例值进行PID控制 */
sint16 ApplyPIDControl(uint16 scaledPercentage, sint16 targetValue)
{sint16 error;sint16 controlOutput;/* 计算误差,两个值都以2^8为比例因子 */error = (sint16)targetValue - (sint16)scaledPercentage;/* 应用比例增益(Kp=1.5),以2^8为比例因子表示为384 *//* 使用乘法右移组合函数,结果仍以2^8为比例因子 */controlOutput = Mfx_MulShRight_s16(error, 384, 8);return controlOutput;
}
5. 总结
AUTOSAR固定点数学库(MFX)为汽车电子系统提供了标准化、高效的固定点数学计算能力。通过本文的分析,我们深入了解了MFX库的架构位置、功能组成、数据流程和应用场景。
5.1 MFX库的优势
- 标准化接口:遵循AUTOSAR标准,提高软件可移植性
- 多数据类型支持:适应不同精度和范围的计算需求
- 完善的错误处理:溢出保护和参数检查确保计算可靠性
- 可重入性:支持多任务环境下的并发调用
- 优化的组合运算:减少中间结果溢出风险,提高计算精度
5.2 应用场景
MFX库在汽车电子系统中有广泛的应用场景:
- 控制系统:发动机控制、变速箱控制、底盘控制等需要高效固定点计算
- 信号处理:传感器信号校准、滤波和变换
- 诊断功能:故障检测和处理中的阈值计算
- 能量管理:电池管理系统中的电量和温度计算
通过MFX库,AUTOSAR提供了一套完整、可靠的固定点数学计算解决方案,为开发高质量的汽车电子控制系统奠定了基础。