AUTOSAR进阶图解==>AUTOSAR_SWS_EFXLibrary
AUTOSAR 扩展定点数学库 (EFX) 详解
目录
- 1. 概述
- 1.1 EFX库的作用
- 1.2 架构定位
- 2. 架构设计
- 2.1 EFX库在AUTOSAR架构中的位置
- 2.2 EFX库的组件结构
- 3. 功能组件详解
- 3.1 控制器函数
- 3.2 控制器函数流程
- 4. API详解
- 4.1 通用API
- 4.2 版本管理API
- 4.3 控制器API
- 5. 总结
1. 概述
1.1 EFX库的作用
AUTOSAR扩展定点数学库(EFX)是AUTOSAR基础软件层中的系统服务组件,提供了一系列用于定点数学计算的函数。这些函数广泛应用于需要高精度、确定性数学计算的嵌入式系统,尤其是在资源受限且不支持浮点运算的平台上。
EFX库的主要特点:
- 提供完整的定点数数学运算支持
- 所有函数均支持可重入性,可被多个runnable同时调用
- 符合AUTOSAR标准规范,具有良好的兼容性
- 优化的实现确保高效执行和低资源占用
1.2 架构定位
EFX库作为AUTOSAR架构中的一部分,位于基础软件层的系统服务中。它为上层应用软件组件提供标准化的定点数学函数接口,隐藏了底层实现细节,提高了软件的可移植性和重用性。
2. 架构设计
2.1 EFX库在AUTOSAR架构中的位置
组件 EFX库:
- 职责: 提供AUTOSAR标准的扩展定点数学功能
- 功能点:
- 提供定点数学计算API
- 支持多种控制器和滤波器算法
- 实现高精度数学运算
- 确保计算结果的确定性
层 应用层:
- 范围: 包含具体应用功能的软件组件
- 包含模块: 应用软件组件等
层 运行时环境:
- 范围: 连接应用层和基础软件层的中间层
- 包含模块: RTE组件
层 基础软件层:
- 范围: 提供标准化的基础软件功能
- 包含模块:
- 系统服务(包括AUTOSAR库、操作系统等)
- 微控制器抽象层(包括硬件驱动等)
关系 应用软件组件–>EFX库:
- 应用软件通过标准API调用EFX库提供的数学函数进行复杂计算
关系 基础软件层–>ECU硬件:
- 基础软件层通过微控制器抽象层控制底层硬件资源
代码示例:
/* 应用层调用EFX库函数的示例 */
#include "Efx.h"void Application_ControlFunction(void)
{sint32 input = 1000; /* 输入值 */sint32 output; /* 输出值 */uint16 factor = 16384; /* 控制因子, 对应0.5 (16384/32768) *//* 调用EFX库的低通滤波函数处理传感器输入 */output = Efx_LpFiltFac1_s32_s32(input, factor);/* 使用处理后的输出进行控制 */Actuator_SetValue(output);
}
2.2 EFX库的组件结构
组件 EFX库:
- 职责: 提供完整的定点数学功能集合
- 结构: 包含多个功能模块,每个模块提供特定类别的数学功能
组件 控制器函数:
- 职责: 实现各种控制器算法
- 功能点:
- PT1控制器: 一阶低通滤波控制器,用于平滑信号
- DT1控制器: 微分时间控制器,用于处理信号变化率
- PD控制器: 比例-微分控制器,用于快速响应系统变化
- I控制器: 积分控制器,用于消除静态误差
- PI控制器: 比例-积分控制器,结合P和I优点
- PID控制器: 比例-积分-微分控制器,用于全面控制系统
组件 滤波函数:
- 职责: 提供信号滤波算法
- 功能点:
- 低通滤波器: 允许低频信号通过,滤除高频干扰
- 高通滤波器: 允许高频信号通过,滤除低频干扰
- 移动平均: 计算信号的滑动平均值,平滑数据
组件 三角函数:
- 职责: 提供定点数实现的三角函数
- 功能点:
- 正弦函数: 计算角度的正弦值
- 余弦函数: 计算角度的余弦值
- 反正弦函数: 计算正弦值对应的角度
- 反余弦函数: 计算余弦值对应的角度
组件 限幅函数:
- 职责: 限制信号在特定范围内
- 功能点:
- 斜率限制器: 限制信号变化速率
- 分段限制器: 根据不同条件应用不同限制
- 滞环函数: 实现带滞回特性的限幅功能
组件 数学函数:
- 职责: 提供基础数学运算
- 功能点:
- 平方根: 计算数值的平方根
- 斜坡函数: 生成斜坡信号
- 死区: 处理信号中的死区
- 轴角计算: 计算斜边长度(勾股定理)
组件 数组操作:
- 职责: 提供数组处理算法
- 功能点:
- 升序排序: 将数组元素按升序排列
- 降序排序: 将数组元素按降序排列
- 中值排序: 找出数组的中值
代码示例:
/* EFX库组件之间的交互示例 */
#include "Efx.h"/* 控制器状态和参数结构体 */
Efx_StatePT1_Type pt1State;
Efx_ParamPD_Type pdParam;/* 传感器信号处理处理函数 */
void ProcessSignal(sint32 rawSignal, sint32* processedSignal)
{sint32 filteredSignal;sint32 limitedSignal;sint32 controlOutput;/* 使用低通滤波器消除噪声 */filteredSignal = Efx_LpFiltFac1_s32_s32(rawSignal, 16384); /* 因子0.5 *//* 使用斜率限制器限制变化速率 */limitedSignal = Efx_SlewRate_s32(filteredSignal, 100); /* 最大变化率100 *//* 使用PT1控制器处理信号 */controlOutput = Efx_PT1_s32(limitedSignal, &pt1State);/* 返回处理后的信号 */*processedSignal = controlOutput;
}
3. 功能组件详解
3.1 控制器函数
控制器函数是EFX库中最重要的组件之一,它们用于实现各种控制算法。这些控制器使用拉普拉斯-Z变换推导参数,以实现精确的定点数控制计算。
主要控制器类型:
- PT1控制器: 一阶低通滤波控制器,使用滞后环节平滑输入信号
- DT1控制器: 微分-时间控制器,对输入信号的变化率进行处理
- PD控制器: 比例-微分控制器,结合比例控制和微分控制的优点
- I控制器: 积分控制器,消除静态误差
- PI控制器: 比例-积分控制器,结合快速响应和稳态精度
- PID控制器: 比例-积分-微分控制器,提供全面的控制性能
控制器系统状态结构体:
/* PT1控制器状态结构体 */
typedef struct {sint32 X1; /* 前一时间步输入值 */sint32 Y1; /* 前一时间步输出值 */
} Efx_StatePT1_Type;/* DT1-Type1控制器状态结构体 */
typedef struct {sint32 X1; /* 前一时间步输入值 */sint32 X2; /* 前两个时间步输入值 */sint32 Y1; /* 前一时间步输出值 */
} Efx_StateDT1Typ1_Type;/* PD控制器参数结构体 */
typedef struct {sint32 K_C; /* 比例系数 */sint32 Tv_C; /* 前置时间 */
} Efx_ParamPD_Type;
3.2 控制器函数流程
控制器函数的一般流程包括:
- 输入控制器参数: 包括放大系数K、前置时间Tv、跟随时间Tn和衰减时间常量T1等
- 创建控制器状态结构体: 用于存储控制器的状态变量,如前一时间步的输入和输出
- 应用系统参数换算: 进行参数转换,如计算Tnrec、T1rec和TeQ等值
- 根据控制器类型执行计算: 不同控制器使用不同的计算公式
- 执行饱和限制处理: 确保输出在有效范围内,防止溢出
- 更新控制器状态: 保存当前输入和输出作为下一步的状态
- 输出计算结果: 返回控制器的计算结果
详细解释:
PT1控制器计算:
- PT1控制器实现一阶低通滤波功能
- 计算公式:
Yn = (Xn + X1) / 2 + TeQ * (Yn-1 - Xn)
- 其中TeQ是时间等效参数,由
TeQ = exp(-dT/T1)
计算得出 - 饱和处理确保输出不会超出sint32范围
代码示例:
/* PT1控制器函数实现示例 */
sint32 Efx_PT1_s32(sint32 Xn, Efx_StatePT1_Type* State)
{sint32 Yn;sint32 TeQ = 16384; /* 时间等效参数,这里使用0.5作为示例 */if (State == NULL_PTR) {return 0; /* 错误处理 */}/* 执行PT1控制器计算 */Yn = ((Xn + State->X1) >> 1) + /* (Xn + X1) / 2 */((TeQ * (State->Y1 - Xn)) >> 15); /* TeQ * (Yn-1 - Xn) / 32768 *//* 执行饱和限制处理 */if (Yn > INT32_MAX) {Yn = INT32_MAX;}else if (Yn < INT32_MIN) {Yn = INT32_MIN;}/* 更新控制器状态 */State->X1 = Xn;State->Y1 = Yn;return Yn;
}
4. API详解
4.1 通用API
EFX库提供了一套标准化的API,遵循AUTOSAR命名规范。主要API类别包括:
控制器API:
Efx_PT1_*
: PT1控制器函数Efx_DT1_*
: DT1控制器函数Efx_PD_*
: PD控制器函数Efx_I_*
: I控制器函数Efx_PI_*
: PI控制器函数Efx_PID_*
: PID控制器函数
滤波器API:
Efx_LpFilt*
: 低通滤波器函数Efx_HpFilt*
: 高通滤波器函数Efx_MovingAverage_*
: 移动平均函数
数学函数API:
Efx_Sin_*
: 正弦函数Efx_Cos_*
: 余弦函数Efx_Arcsin_*
: 反正弦函数Efx_Arccos_*
: 反余弦函数Efx_Sqrt_*
: 平方根函数Efx_Hypot_*
: 斜边计算函数
限幅函数API:
Efx_SlewRate_*
: 斜率限制器Efx_Limiter_*
: 分段限制器Efx_Hysteresis_*
: 滞环函数
数组操作API:
Efx_SortAscend_*
: 升序排序函数Efx_SortDescend_*
: 降序排序函数Efx_MedianSort_*
: 中值排序函数
4.2 版本管理API
根据AUTOSAR标准,EFX库提供了版本信息查询功能:
/* 版本信息结构体定义 */
typedef struct {uint16 vendorID; /* 供应商ID */uint16 moduleID; /* 模块ID */uint8 sw_major_version; /* 软件主版本号 */uint8 sw_minor_version; /* 软件次版本号 */uint8 sw_patch_version; /* 软件补丁版本号 */
} Efx_VersionInfoType;/* 获取EFX库版本信息的函数 */
void Efx_GetVersionInfo(Efx_VersionInfoType* versioninfo);
4.3 控制器API
控制器API是EFX库的核心功能,提供了各种控制算法的实现:
PT1控制器:
/* PT1控制器函数 */
sint32 Efx_PT1_s32(sint32 Xn, Efx_StatePT1_Type* State);
sint16 Efx_PT1_s16(sint16 Xn, Efx_StatePT1_Type* State);
DT1控制器:
/* DT1控制器函数 - 类型1 */
sint32 Efx_DT1Typ1_s32(sint32 Xn, Efx_StateDT1Typ1_Type* State);/* DT1控制器函数 - 类型2 */
sint32 Efx_DT1Typ2_s32(sint32 Xn, Efx_StateDT1Typ2_Type* State);
PID控制器:
/* PID控制器函数 */
sint32 Efx_PID_s32(sint32 Xn, Efx_StatePID_Type* State, Efx_ParamPID_Type* Param);
5. 总结
AUTOSAR扩展定点数学库(EFX)是AUTOSAR标准的重要组成部分,为嵌入式系统提供了标准化、高效的定点数学功能。通过提供一系列控制器、滤波器、三角函数等数学功能,EFX库使开发者能够在资源受限的平台上实现复杂的数学计算。
EFX库的主要优势:
- 标准化接口: 符合AUTOSAR标准,提高软件可移植性
- 可重入性: 所有函数支持可重入性,适合并发环境
- 高效实现: 优化的定点数实现,减少资源消耗
- 全面功能: 提供丰富的数学函数和控制算法
应用场景:
- 汽车电子控制单元(ECU): 执行各种控制算法
- 实时系统: 需要确定性计算结果的场景
- 资源受限平台: 不支持浮点硬件的微控制器
- 安全关键系统: 需要高可靠性数学计算的场景
EFX库作为AUTOSAR标准的一部分,将持续发展以满足现代嵌入式系统日益增长的复杂计算需求。