当前位置: 首页 > news >正文

AUTOSAR进阶图解==>AUTOSAR_SWS_MFXLibrary

AUTOSAR 固定点数学库(MFX)详解

AUTOSAR标准固定点数学计算功能详细分析与应用

目录

  • 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架构中的定位与作用:

  1. 层级位置

    • MFX库位于AUTOSAR 基础软件(BSW)服务层
    • 作为标准化数学服务的一部分,提供基础计算能力
    • 与其他服务层模块(如通信服务、诊断服务、内存服务)并列
  2. 与应用层的关系

    • 应用软件组件通过 运行时环境(RTE) 间接使用MFX库提供的功能
    • 应用层不直接调用MFX库,而是通过RTE进行抽象调用
  3. 与系统其他部分的关联

    • 作为基础软件的一部分,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库的数据流和错误处理机制包含三个主要流程:

  1. 正常操作流程

    • 应用软件组件通过RTE调用MFX库函数
    • MFX函数执行参数校验后进行计算
    • 计算结果通过RTE返回给应用
  2. 参数错误处理流程

    • 应用提供的参数无效时,MFX库进行参数校验
    • 检测到参数错误时,MFX库通过DET(默认错误追踪器)报告错误
    • 同时返回默认值或错误码给应用
  3. 溢出处理流程

    • 当计算可能导致溢出时,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库提供的函数可分为三大类,每类函数针对特定计算需求提供解决方案:

  1. 基本算术运算函数

    • 加法函数(Mfx_Add_<DataType>):执行两个操作数的加法运算
    • 减法函数(Mfx_Sub_<DataType>):执行两个操作数的减法运算
    • 乘法函数(Mfx_Mul_<DataType>):执行两个操作数的乘法运算
    • 除法函数(Mfx_Div_<DataType>):执行两个操作数的除法运算
    • 取模函数(Mfx_Mod_<DataType>):计算两个操作数的模运算结果
  2. 特殊运算函数

    • 绝对值函数(Mfx_Abs_<DataType>):返回输入的绝对值
    • 差值绝对值函数(Mfx_AbsDiff_<DataType>):计算两个输入值差的绝对值
    • 限制函数(Mfx_Limit_<DataType>):将输入值限制在指定的最小值和最大值之间
    • 最小最大值限制函数(Mfx_Minmax_<DataType>):使用单一值同时作为最小值和最大值限制
  3. 组合运算函数

    • 乘除组合函数(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提供了一套完整、可靠的固定点数学计算解决方案,为开发高质量的汽车电子控制系统奠定了基础。

http://www.xdnf.cn/news/1097749.html

相关文章:

  • imx6ull-裸机学习实验17——SPI 实验
  • 数据结构与算法之美:广义表
  • 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
  • JAVA JVM的内存区域划分
  • 政安晨【开源人工智能硬件】【ESP乐鑫篇】 —— 在macOS上部署工具开发环境(小资的非开发者用苹果系统也可以玩乐鑫)
  • 在 Mac 上安装 Java 和 IntelliJ IDEA(完整笔记)
  • (鱼书)深度学习入门1:python入门
  • 【IO复用】五种IO模型
  • 【2025/07/10】GitHub 今日热门项目
  • steam独立游戏开发销售全流程:2025实战版
  • 数据结构笔记10:排序算法
  • 百度文心ERNIE4.5部署与性能白皮书:FastDeploy加速方案+全系列模型实测数据对比
  • jenkins部署springboot项目
  • 实验作业1+整理笔记截图
  • 缺乏日常项目进度例会机制,如何系统推进
  • Spring事务管理深度解析:原理、实践与陷阱
  • Web前端:table标签的用法与属性
  • CMake指令:add_custom_command和add_custom_target详解
  • RLHF(人类反馈的强化学习)
  • SD NAND闪存技术全面解析
  • Linux 文件 IO 详解:从系统调用到实际操作
  • BatchNorm解决梯度消失/爆炸
  • 三维旋转沿轴分解
  • MySQL断开连接后无法正常启动解决记录
  • (鱼书)深度学习入门2:手搓感知机
  • 华锐云空间展销编辑器:开启数字化展示新时代​
  • MBSE工具+架构建模:从效率提升到质量赋能
  • C++中的左值、右值与std::move()
  • 什么是Apache Ignite的affinity(亲和性)
  • 【科研绘图系列】R语言绘制相关系数图