# SWS_EFXLibrary — 扩展定点例程规范 | 文档元信息 | 值 | |------------|------| | 文档标题 | Specification of Extended Fixed Point Routines(扩展定点例程规范) | | 文档所有者 | AUTOSAR | | 文档责任方 | AUTOSAR | | 文档标识号 | 400 | | 文档状态 | Final(最终版) | | 所属 AUTOSAR 标准 | Classic Platform(经典平台) | | 所属标准发布版本 | 4.4.0 | | 发布版本 | AUTOSAR CP Release 4.4.0 | ## 文档变更历史 | 日期 | 发布版本 | 变更人 | 变更说明 | |------|----------|--------|----------| | 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 更新需求 SWS_EFX_00220、SWS_EFX_00223、SWS_EFX_00226、SWS_EFX_00229、SWS_EFX_00232、SWS_EFX_00235、SWS_EFX_00240、SWS_EFX_00243、SWS_EFX_00246、SWS_EFX_00250、SWS_EFX_00253、SWS_EFX_00256 的范围和分辨率 | | 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 在 8.1 节中添加注释以澄清 Boolean 数据类型助记符的使用;更新 SWS_Efx_00355 中 Boolean 的数据类型;对 SWS_Efx_00355、SWS_Efx_00309、SWS_Efx_00307 和 SWS_Efx_00193 包含指向常量(P2CONST);正确分类 SWS_Efx_00376 的参数为 InOut | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 更新 SWS_Efx_00810 和 SWS_Efx_00822 需求的 SRS_BSW_General 引用;更新 EFX 文档以支持 MISRA 2012 标准;更新 SWS_Efx_00275 和 SWS_Efx_00276 以提供参数分辨率的更多清晰度;更新 SWS_Efx_00278 和 SWS_Efx_00279 以提供舍入和 Param_cpcst->SlopeXXX_u32 * dT_s32 最小值的更多清晰度;更新控制器例程结构定义的 8.5.3.1 节;更新 SWS_Efx_00240、SWS_Efx_00243、SWS_Efx_00246、SWS_Efx_00250、SWS_Efx_00253 和 SWS_Efx_00256 以更正函数名的大小写敏感性;第 2 节已修订为更新 Default Error Tracer;从 BSW UML 模型中移除过时的 Efx_ISetParam;移除 SWS_Efx_00520 和 SWS_Efx_00525 的重复跟踪环境;移除标记为已弃用的需求 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 根据约定更新 SWS_Efx_00033 的需求 ID;根据标准约定更新 SWS_Efx_00436 (UML) 的 OutTypeMn;更新 5.1 文件结构下 SWS_Efx_00001 的命名约定;更正 SWS_Efx_00365 的输入参数数据类型 | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 为 SWS_Efx_00412 (0xE2 - 0xE9) 添加新变体;为 SWS_Efx_00053、SWS_Efx_00072 和 8.5.3.1 节添加注释;为澄清斜边函数公式添加声明;为澄清 SWS_Efx_00451 中提到的公式添加声明;以一致的方式更新 EFX 文档中 const 的使用;更正 8.5.3.1 节中 TeQ_ 的公式;更新 SWS_Efx_00071、SWS_Efx_00091、SWS_Efx_00502、SWS_Efx_00151 和 SWS_Efx_00156 的舍入 | | 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 修改 HpFilter、Average、Array_Average 和 MovingAverage 函数的舍入机制;在 SWS_Efx_00307 下方为 Efx_RampGetSwitchPos 函数添加注释 | | 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 弃用 Efx_DeadTime 函数;移除 Efx_SlewRate、Efx_RampCalc 和 Efx_RampCalcJump 函数的需求;为 Efx_RampCalc 函数添加 SWS_Efx_00837;修改 Efx_RampCalc 和 Efx_RampSetParam 的描述;为 Efx_SlewRate、Efx_Div 和 Efx_MovingAverage 函数的变体语法;为 Efx_Arcsin 和 Efx_Arccos 函数的输入参数分辨率;将"下溢"重命名为"负溢出" | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | 为滞后函数添加 8 位和 16 位变体;修改斜边函数的公式;一阶低通滤波函数的第二计算已弃用;更正 Efx_HystLeftRight、Efx_HystDeltaRight、Efx_HystCenterHalfDelta 函数的不等式;修改 Efx_Div、Efx_Debounce、Efx_HystLeftDelta、Efx_SortAscend、Efx_SortDescend、Efx_EdgeBipol、Efx_Hysteresis、Efx_MovingAverage 函数的描述和需求;更正 Efx_DebounceSetParam、Efx_Debounce 函数的输入参数描述;修改 LpFilter 第一次计算中'fac'参数的物理范围;重命名 RS_FlipFlop 函数以删除后缀;为整数提升添加 SWS_Efx_00823;修改 Efx_Gt、Efx_Debounce 函数的语法 | | 2011-12-22 | 4.0.3 | AUTOSAR Administration | 为"计数器例程"引入初始化功能;更正 Efx_CtrlSetLimit 接口;更正 Efx_MovingAverage 例程接口;更新 Efx_RampCalcSwitch 例程定义和需求以实现正确行为;更正 Efx_Debounce_u8_u8 接口 | | 2010-09-30 | 3.1.5 | AUTOSAR Administration | 为控制器引入额外的 LIMITED 函数;为有效使用优化斜坡函数;分离 DT1 Type 1 和 Type 2 控制器函数;引入计算 TeQ 的额外近似函数 | | 2010-02-02 | 3.1.4 | AUTOSAR Administration | 初始发布 | --- ## 目录 1. [引言与功能概述](#1-引言与功能概述) 2. [缩略语与缩写](#2-缩略语与缩写) 3. [相关文档](#3-相关文档) 4. [约束与假设](#4-约束与假设) 5. [与其他模块的依赖关系](#5-与其他模块的依赖关系) 6. [需求可追溯性](#6-需求可追溯性) 7. [功能规范](#7-功能规范) 8. [API 规范](#8-api-规范) 9. [时序图](#9-时序图) 10. [配置规范](#10-配置规范) 11. [不适用的需求](#11-不适用的需求) --- ## 1 引言与功能概述 AUTOSAR 库例程是 AUTOSAR 架构中系统服务的一部分,下图展示了 AUTOSAR 库在分层架构中的位置。 ``` ┌─────────────────────────────┐ A │ Application Layer │ U ├─────────────────────────────┤ T │ Runtime Environment (RTE) │ O ├─────────────────────────────┤ S │ Basic Software │ A │ │ R ├─────────────────────────────┤ │ ECU Hardware │ L └─────────────────────────────┘ I B ``` **图:分层架构** Efx 库(扩展定点库)包含以下例程: - 转换 - 一阶低通滤波器 - 一阶高通滤波器 - 控制器例程(P、PT1、DT1、PD、I、PI、PID) - 信号限制 - 滞后函数 - 死区时间(已弃用) - 去抖 - 排序(升序、降序、中值) - 边沿检测 - 区间例程 - 计数器例程 - 触发器例程 - 限制器例程 - 64 位函数 所有例程都是可重入的(re-entrant),可同时被多个可运行实体使用。 ## 2 缩略语与缩写 | 缩写 | 描述 | |------|------| | **DET** | Default Error Tracer(默认错误追踪器) | | **EFX** | Extended Fixed-point library(扩展定点库) | | **Duty Cycle** | 占空比 | | **Edge Bipol** | 双极性边沿 | | **Dbnc** | Debounce(去抖) | | **Flip-Flop** | 触发器 | | **FlipFlop RS** | RS 触发器(复位/置位) | | **Hyst** | Hysteresis(滞后) | | **LpFilter** | Low-pass filter(低通滤波器) | | **HpFilter** | High-pass filter(高通滤波器) | | **F** | Function(函数) | | **N** | Number of samples(样本数) | ## 3 相关文档 ### 3.1 输入文档 - [1] List of Basic Software Modules, AUTOSAR_TR_BSWModuleList.pdf - [2] Layered Software Architecture, AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf - [3] General Requirements on Basic Software Modules, AUTOSAR_SRS_BSWGeneral.pdf - [4] Specification of ECU Configuration, AUTOSAR_TPS_ECUConfiguration.pdf - [5] Basic Software Module Description Template, AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf - [6] Specification of Platform Types, AUTOSAR_SWS_PlatformTypes.pdf - [7] Specification of Standard Types, AUTOSAR_SWS_StandardTypes.pdf - [8] Requirement on Libraries, AUTOSAR_SRS_Libraries.pdf - [9] Memory mapping mechanism, AUTOSAR_SWS_MemoryMapping.pdf - [10] Specification of C Implementation Rules, AUTOSAR_TR_CImplementationRules.pdf - [11] Specification of ECU State Manager, AUTOSAR_SWS_EcuM.pdf ### 3.2 相关标准与规范 - [12] ISO/IEC 9899:1990 Programming Language – C ## 4 约束与假设 ### 4.1 局限性 - 无特殊限制。 ### 4.2 对汽车领域的适用性 - 无限制。 ## 5 与其他模块的依赖关系 ### 5.1 文件结构 [SWS_Efx_00001] ⌈ Efx 模块应提供以下文件: - C 文件 `Efx_.c` 用于实现库。所有 C 文件应以 `Efx` 为前缀。 - 头文件 `Efx.h` 提供所有公共函数原型和类型。 实现和分组(关于 C 文件的)例程可以根据以下选项灵活进行,没有强制要求遵循: **选项 1**:`` 可以是函数名,每个函数一个 C 文件。 **选项 2**:`` 可以是函数组的通用名称: - 2.1 按对象族分组 - 2.2 按例程族分组 - 2.3 按方法族分组 - 2.4 按其他方式分组(允许自定义分组) **选项 3**:可以省略 ``,使单个 C 文件包含所有 Efx 函数。 使用以上选项可在减少 C 文件数量的同时灵活选择合适的粒度。链接时也支持按需链接。 ## 6 需求可追溯性 | 需求 | 描述 | 由以下需求满足 | |------|------|----------------| | SRS_BSW_00003 | 所有软件模块应提供版本和标识信息。 | SWS_Efx_00815 | | SRS_BSW_00007 | 所有用 C 语言编写的 BSW 模块应符合 MISRA C 2012 标准。 | SWS_Efx_00809 | | SRS_BSW_00304 | 所有 AUTOSAR 基本软件模块应使用以下数据类型,而非原生 C 数据类型。 | SWS_Efx_00812 | | SRS_BSW_00306 | AUTOSAR 基本软件模块应是编译器和平台无关的。 | SWS_Efx_00813 | | SRS_BSW_00318 | 每个 AUTOSAR 基本软件模块文件应在头文件中提供版本号。 | SWS_Efx_00815 | | SRS_BSW_00321 | AUTOSAR 基本软件模块的版本号应按特定规则枚举。 | SWS_Efx_00815 | | SRS_BSW_00348 | 所有 AUTOSAR 标准类型和常量应放置并组织在标准类型头文件中。 | SWS_Efx_00811 | | SRS_BSW_00374 | 所有基本软件模块应提供可读的模块供应商标识。 | SWS_Efx_00814 | | SRS_BSW_00378 | AUTOSAR 应提供 boolean 类型。 | SWS_Efx_00812 | | SRS_BSW_00379 | 所有软件模块应在头文件和模块 XML 描述文件中提供模块标识符。 | SWS_Efx_00814 | | SRS_BSW_00402 | 每个模块应提供版本信息。 | SWS_Efx_00814 | | SRS_BSW_00407 | 每个 BSW 模块应提供读取专用模块实现版本信息的函数。 | SWS_Efx_00815, SWS_Efx_00816 | | SRS_BSW_00411 | 所有 AUTOSAR 基本软件模块应应用 API 存在启用/禁用的命名规则。 | SWS_Efx_00816 | | SRS_BSW_00437 | 内存映射应提供定义启动期间不初始化的 RAM 段的可能性。 | SWS_Efx_00810 | | SRS_BSW_00448 | 模块 SWS 不应包含来自其他模块的需求。 | SWS_Efx_00822 | | SRS_LIBS_00001 | 每个库函数的功能行为不应可配置。 | SWS_Efx_00818 | | SRS_LIBS_00002 | 库应在所有 BSW 模块和应用 SWC 之前可用。 | SWS_Efx_00800 | | SRS_LIBS_00003 | 库应在关闭之前保持可用。 | SWS_Efx_00801 | | SRS_LIBS_00005 | 每个库应提供一个具有其公共接口的头文件。 | SWS_Efx_00001 | | SRS_LIBS_00013 | 由运行时输入参数值检查产生的错误情况应在 SWS 中列出。 | SWS_Efx_00817, SWS_Efx_00819 | | SRS_LIBS_00015 | 应可以配置微控制器,使库代码在所有调用者之间共享。 | SWS_Efx_00806 | | SRS_LIBS_00017 | 应避免使用宏。 | SWS_Efx_00807 | | SRS_LIBS_00018 | 库函数只能调用库函数。 | SWS_Efx_00808 | ## 7 功能规范 ### 7.1 错误分类 [SWS_Efx_00821] ⌈ 由于库不支持 DET 调用,因此无错误分类定义。 ⌋() ### 7.2 错误检测 [SWS_Efx_00819] ⌈ 错误检测:函数应在运行时(无论在生产代码还是开发代码中)检查输入参数的值,特别是当错误值可能导致致命错误或不可预测结果的情况,前提是这些值在函数规范允许的范围内。所有错误情况应在 SWS 中列出,并且函数应返回 SWS 中规定的不可配置的值。该值取决于具体的函数和错误情况,因此逐个确定。 如果传递给例程的值无效且不符合函数规范,则不检测此类错误。 **例如:** 如果传递值 > 32 作为位位置,或将负数轴分布样本数传递给例程。 ⌋(SRS_LIBS_00013) ### 7.3 错误通知 [SWS_Efx_00817] ⌈ 函数不应调用 DET 进行错误通知。 ⌋(SRS_LIBS_00013) ### 7.4 初始化与关闭 [SWS_Efx_00800] ⌈ Efx 库不需要初始化阶段。库函数可在 ECU 初始化的最开始被调用,例如甚至可由 OS 或 EcuM 调用,因此库应就绪。 ⌋(SRS_LIBS_00002) [SWS_Efx_00801] ⌈ Efx 库不需要关闭操作阶段。 ⌋(SRS_LIBS_00003) ### 7.5 使用库 API Efx API 可直接从 BSW 模块或 SWC 调用。无需端口定义。这是一种纯函数调用。 `Efx.h` 语句应由开发人员或应用程序代码生成器放置,而不是由 RTE 生成器放置。 库的使用应记录在文档中。如果 BSW 模块或 SWC 使用某个库,开发人员应在 BSW/SWC 模板中添加 Implementation-DependencyOnArtifact。 `minVersion` 和 `maxVersion` 参数对应于供应商版本。对于 AUTOSAR 库,这些参数可以留空,因为 SWC 或 BSW 模块可以依赖库行为而非供应商实现。但是,SWC 或 BSW 模块应与其所集成的 AUTOSAR 平台兼容。 ### 7.6 库实现 [SWS_Efx_00806] ⌈ Efx 库的实现方式应使代码可在不同内存分区中的调用者之间共享。 ⌋(SRS_LIBS_00015) [SWS_Efx_00807] ⌈ 应避免使用宏。函数应声明为函数或内联函数(inline)。不应使用 `#define` 宏。 ⌋(SRS_LIBS_00017) [SWS_Efx_00808] ⌈ 库函数不应调用任何 BSW 模块的函数,例如 DET。库函数可以调用其他库函数。因为库函数应是可重入的,但其他 BSW 模块函数可能不可重入。 ⌋(SRS_LIBS_00018) [SWS_Efx_00809] ⌈ 用 C 语言编写的库应符合 MISRA C 标准。请参阅 SWS_BSW_00115 了解更多详情。 ⌋(SRS_BSW_00007) [SWS_Efx_00810] ⌈ 每个 AUTOSAR 库模块实现 `*.c` 和 `*.h` 应使用 AUTOSAR 内存映射机制将其代码映射到内存段。 ⌋(SRS_BSW_00437) [SWS_Efx_00811] ⌈ 每个使用 AUTOSAR 整数数据类型和/或标准返回值的 AUTOSAR 库模块实现 `*.c` 应包含头文件 `StandardTypes.h`。 ⌋(SRS_BSW_00348) [SWS_Efx_00812] ⌈ 所有 AUTOSAR 库模块应使用 AUTOSAR 数据类型(整数、布尔)而非原生 C 数据类型,除非该库明确被标识为仅与某个平台兼容。 ⌋(SRS_BSW_00304, SRS_BSW_00378) [SWS_Efx_00813] ⌈ 所有 AUTOSAR 库模块应避免直接使用编译器和平台特定的关键字,例如 `#pragma`、`typeof` 等,除非该库明确被标识为仅与某个平台兼容。 ⌋(SRS_BSW_00306) [SWS_Efx_00823] ⌈ 整数提升必须遵守 Efx 服务。 ⌋() ## 8 API 规范 ### 8.1 导入类型 本章列出从以下模块包含的所有类型: | 头文件 | 导入类型 | |--------|----------| | Std_Types.h | boolean, sint8, uint8, sint16, uint16, sint32, uint32 | 由于 C 语言提供的整数类型的大小是实现定义的,因此每种整数类型可以表示的值范围将因实现而异。 库例程名称中使用以下助记符: | 大小 | 平台类型 | 助记符 | 范围 | |------|----------|--------|------| | unsigned 8-Bit | boolean | u8 | [ TRUE, FALSE ] | | signed 8-Bit | sint8 | s8 | [ -128, 127 ] | | signed 16-Bit | sint16 | s16 | [ -32768, 32767 ] | | signed 32-Bit | sint32 | s32 | [ -2147483648, 2147483647 ] | | signed 64-Bit | sint64 | s64 | [-9223372036854775808, 9223372036854775807] | | unsigned 8-Bit | uint8 | u8 | [ 0, 255 ] | | unsigned 16-Bit | uint16 | u16 | [ 0, 65535 ] | | unsigned 32-Bit | uint32 | u32 | [ 0, 4294967295 ] | | unsigned 64-Bit | uint64 | u64 | [0, 18446744073709551615] | **表 1:基本类型** > **注意:** 对于返回类型/参数类型为 boolean 的 API,命名约定采用 `_u8`,应解释为 `_b`(Boolean)。如果返回类型/参数类型中不存在 boolean 数据类型,则 `_u8` 应解释为 `_u8` 本身。 作为本文档其余部分的约定: - 助记符将用于例程名称中(使用 `` 表示输入 1 的类型助记符) - 实际类型将用于例程原型的描述中(使用 `` 或 ``)。 ### 8.2 类型定义 无。 ### 8.3 关于舍入的说明 可以应用两种舍入类型: **结果"四舍五入"(rounded off):** - `0 <= X < 0.5` 舍入为 0 - `0.5 <= X < 1` 舍入为 1 - `-0.5 < X <= 0` 舍入为 0 - `-1 < X <= -0.5` 舍入为 -1 **结果"向零舍入"(rounded towards zero):** - `0 <= X < 1` 舍入为 0 - `-1 < X <= 0` 舍入为 0 ### 8.4 关于目标优化的例程说明 本规范中描述的例程可作为常规例程或内联函数(inline)实现。为了 ROM 优化目的,建议 C 例程实现为单独的源文件,以便可以根据需要进行链接。 例如,根据目标,可以进行两种类型的优化: - 某些例程可被使用整数提升的另一个例程替换 - 某些例程可被限制例程和具有不同签名的例程的组合替换 ### 8.5 数学函数定义 下表描述了以下章节中使用的符号含义: | 符号 | 描述 | |------|------| | Yn | 要计算的实际输出 | | Yn-1 | 一个时间步长之前的输出值 | | Xn | 从输入给出的实际输入 | | Xn-1 | 一个时间步长之前的输入 | | a, b0, b1 | 滤波器相关常数 | #### 8.5.1 一阶低通滤波器 我们考虑一个具有传递函数的递归一阶低通滤波器: ``` H(z) = b1 / (1 + a * z^(-1)) ``` 在任何时间点,新的返回值(Yn)可以根据先前的值(Yn-1)、当前值(Xn)和已知常数(K)计算。计算公式如下: ``` Yn = Yn-1 + (Xn - Yn-1) * K ``` 其中 b1=K,a = K - 1。 滤波器是收敛低通滤波器,仅当平均值 K 包含在 [0,1] 中时。 ##### 8.5.1.1 第一次计算 [SWS_Efx_00005] ⌈ | 项 | 内容 | |----|------| | 服务名称 | `Efx_LpFilterFac1__` | | 语法 | ` Efx_LpFilterFac1__( Yn-1, Xn, fac)` | | 服务 ID[hex] | 0x01 to 0x08 | | 描述 | 此服务计算一阶低通滤波器的输出。 | | 通过 | Efx.h | ⌋() [SWS_Efx_00006] ⌈ ```c Yn = Yn-1 + (((Xn - Yn-1) * fac) >> n) ``` 其中 'n' 是移位,取决于函数用于因子的类型。 ⌋() [SWS_Efx_00007] ⌈ 为了始终收敛,使用以下逻辑校正结果以实现值饱和: ```c if (Yn == Yn-1) if (((Xn - Yn-1) * fac) > 0) Yn++ else if (((Xn - Yn-1) * fac) < 0) Yn-- ``` ⌋() [SWS_Efx_00008] ⌈ 已实现函数列表: | 服务 ID[hex] | 语法 | 关联移位 | |--------------|------|----------| | 0x01 | `sint16 Efx_LpFilterFac1_s16s16s16_s16(sint16, sint16, sint16)` | 15 | | 0x02 | `sint16 Efx_LpFilterFac1_s16s16u16_s16(sint16, sint16, uint16)` | 16 | | 0x03 | `sint32 Efx_LpFilterFac1_s32s32u16_s32(sint32, sint32, uint16)` | 16 | | 0x04 | `uint16 Efx_LpFilterFac1_u16u16s16_u16(uint16, uint16, sint16)` | 15 | | 0x05 | `uint16 Efx_LpFilterFac1_u16u16u16_u16(uint16, uint16, uint16)` | 16 | | 0x06 | `uint8 Efx_LpFilterFac1_u8u8u8_u8(uint8, uint8, uint8)` | 8 | | 0x07 | `uint32 Efx_LpFilterFac1_u32u32u32_u32(uint32, uint32, uint32)` | 32 | | 0x08 | `uint32 Efx_LpFilterFac1_u32u32u16_u32(uint32, uint32, uint16)` | 16 | ⌋() ##### 8.5.1.2 第三次计算 [SWS_Efx_00012] ⌈ | 项 | 内容 | |----|------| | 服务名称 | `Efx_LpFilter__` | | 语法 | ` Efx_LpFilter__( input, old_output, uint32 tau_const, uint16 recurrence, uint8 reset, init_val, uint8* started)` | | 服务 ID[hex] | 0x0D and 0x0E | | 参数 (in) | `input` 输入信号;`old_output` 滤波器前一个值;`tau_const` 滤波器参数 Tau:时间常数(秒);`recurrence` 函数两次执行之间的时间增量;`reset` 重置滤波信号的标志;`init_val` 滤波器的初始值 | | 参数 (in-out) | `started` 指向用于检测函数第一次调用的标志的指针 | | 描述 | 此服务计算一阶离散滤波器。 | ⌋() [SWS_Efx_00013] ⌈ 如果 `tau_const==0`,则 `output = input`。 ⌋() [SWS_Efx_00014] ⌈ 如果 `*started==0`,则 `output = init_val`。此标志用于指示滤波器状态。`*Started = 0` 表示当前函数调用是函数的第一次调用以触发初始化。 ⌋() [SWS_Efx_00015] ⌈ 此服务计算一阶离散滤波器: ``` output = old_output + (input - old_output) * (1 - exp(-recurrence/tau_const)) output = old_output * exp(-recurrence/tau_const) + input * (1 - exp(-recurrence/tau_const)) ``` **公式 1** > **注:** 指数函数可以使用插值计算。 ⌋() [SWS_Efx_00016] ⌈ 如果 `(reset == 1)` 或 `(*started == 0)`,则 `output = init_val`。 ⌋() [SWS_Efx_00017] ⌈ 如果 `*started == 0`,则 `*started=1`。 ⌋() [SWS_Efx_00018] ⌈ 已实现函数列表: | 服务 ID[hex] | 语法 | |--------------|------| | 0x0D | `uint32 Efx_LpFilter_u32_u32(uint32, uint32, uint32, uint16, uint8, uint32, uint8*)` | | 0x0E | `sint32 Efx_LpFilter_s32_s32(sint32, sint32, uint32, uint16, uint8, sint32, uint8 *)` | ⌋() > **注意:** 不建议在满足任何条件的情况下调用 `Efx_LpFilter__`。必须在每次重复时调用它,即使未使用。如果不满足条件,则输出应一直冻结为前一个值。参数 `started` 必须由调用方声明为私有变量,并应初始化为 0(默认初始化),因为函数使用此输出的先前值(因此不得使用堆栈)。 #### 8.5.2 一阶高通滤波器 我们考虑一个具有传递函数的递归一阶高通滤波器: ``` H(z) = (b0 * z + b1) / (z + a) ``` 在任何时间点,新的返回值(Yn)可以根据先前的值(Yn-1)、当前输入(Xn)、先前的输入(Xn-1)和已知常数(K)计算。计算公式如下: ``` Yn = Yn-1 - K * Yn-1 + (Xn - Xn-1) ``` 其中 b0 = 1, b1 = -1,a = K - 1。 滤波器是收敛高通滤波器,仅当因子值 m 包含在 [0,1] 中时。 [SWS_Efx_00022] ⌈ | 项 | 内容 | |----|------| | 服务名称 | `Efx_HpFilter_u8_s16` | | 语法 | `sint16 Efx_HpFilter_u8_s16(sint16 Yn-1, uint8 Xn, uint8 Xn-1, uint16 K)` | | 服务 ID[hex] | 0x10 | | 描述 | 此服务计算一阶高通滤波器的输出。 | ⌋() [SWS_Efx_00023] ⌈: ``` Yn = Yn-1 - (K * Yn-1 / 2^16) + (Xn - Xn-1) * 2^7 ``` 结果向 0 舍入。 ⌋() [SWS_Efx_00024] ⌈ 在发生负溢出或正溢出时,返回值应饱和为边界值。 ⌋() [SWS_Efx_00025] ⌈ 对结果应用饱和校正以使输出收敛到零: - 如果 `(Yn 等于 Yn-1)` 且 `(Yn-1 > 0)`,则 Yn 减一 - 如果 `(Yn 等于 Yn-1)` 且 `(Yn-1 < 0)`,则 Yn 加一 ⌋() > **摘要标记**:8.5.3 至 8.5.23 包含以下例程类别(完整定义见原文 PDF): > > - **8.5.3 控制器例程**:P、PT1、DT1、PD、I、PI、PID 控制器(多个变体) > - **8.5.4 范围和限制定义** > - **8.5.5 浮点数学例程** > - **8.5.6 限制** > - **8.5.7 对数和指数** > - **8.5.8 三角函数** > - **8.5.9 平均值** > - **8.5.10 数组平均值** > - **8.5.11 斜边** > - **8.5.12 斜坡例程** > - **8.5.13 滞后例程** > - **8.5.14 死区时间(已弃用)** > - **8.5.15 去抖例程** > - **8.5.16 升序排序例程** > - **8.5.17 降序排序例程** > - **8.5.18 中值排序例程** > - **8.5.19 边沿检测例程** > - **8.5.20 区间例程** > - **8.5.21 计数器例程** > - **8.5.22 触发器例程** > - **8.5.23 限制器例程** > - **8.5.24 64 位函数** > > 由于文档体量较大(112 页,包含数百个函数原型),此处仅翻译关键定义和前几个示例。完整表见原文 PDF。 ### 8.6 函数使用示例 见原文档 8.6 节。 ### 8.7 版本 API #### 8.7.1 Efx_GetVersionInfo [SWS_Efx_00815] ⌈ | 项 | 内容 | |----|------| | 服务名称 | `Efx_GetVersionInfo` | | 语法 | `void Efx_GetVersionInfo(Std_VersionInfoType* versioninfo)` | | 服务 ID[hex] | 0xff | | 同步/异步 | 同步 | | 可重入性 | 可重入 | | 参数 (in) | 无 | | 参数 (in-out) | 无 | | 参数 (out) | `versioninfo` 指向存储此模块版本信息的位置。格式符合 [BSW00321]。 | | 返回值 | 无 | | 描述 | 返回此库的版本信息。 | | 通过 | Efx.h | ⌋(SRS_BSW_00407, SRS_BSW_00003, SRS_BSW_00318, SRS_BSW_00321) BSW 模块的版本信息通常包含: - Module Id(模块 ID) - Vendor Id(供应商 ID) - Vendor specific version numbers(供应商特定版本号)(SRS_BSW_00407)。 [SWS_Efx_00816] ⌈ 如果 `Efx_GetVersionInfo` 的调用方和被调用方的源代码都可用,Efx 库应将 `Efx_GetVersionInfo` 实现为模块头文件中定义的宏。 ⌋(SRS_BSW_00407, SRS_BSW_00411) ### 8.8 回调通知 无。 ### 8.9 调度函数 Efx 库没有调度函数。 ### 8.10 预期接口 无。 #### 8.10.1 强制接口 无。 #### 8.10.2 可选接口 无。 #### 8.10.3 可配置接口 无。 ## 9 时序图 不适用。 ## 10 配置规范 ### 10.1 发布信息 [SWS_Efx_00814] ⌈ 如 [3] 中 SRS_BSW_00402 要求的标准化通用发布参数,应在本模块的头文件中发布,并需要在 BSW Module Description 中提供。相应的模块缩写可在 [1] 基本软件模块列表中找到。 ⌋(SRS_BSW_00402, SRS_BSW_00374, SRS_BSW_00379) 其他模块特定的发布参数(如果适用)将在下面列出。 ### 10.2 配置选项 [SWS_Efx_00818] ⌈ Efx 库不应具有任何可能影响例程功能行为的配置选项。即对于给定的输入参数集合,输出应始终相同。例如,出错时返回的值不应可配置。 ⌋(SRS_LIBS_00001) 但是,库供应商被允许添加与库实现相关的特定配置选项,例如用于资源消耗优化。 ## 11 不适用的需求 [SWS_Efx_00822] ⌈ 这些需求不适用于本规范。 ⌋(SRS_BSW_00448) --- ## 翻译说明 1. 本文档为 AUTOSAR CP Release 4.4.0 的 EFX 库软件规范(SWS)。 2. 所有 API 标识符(如 `Efx_LpFilterFac1_s16s16s16_s16`、`Efx_HpFilter_u8_s16`、`Efx_GetVersionInfo` 等)保留英文原名。 3. 数据类型(`uint8`、`uint16`、`uint32`、`sint8`、`sint16`、`sint32`、`boolean`)保留英文原名。 4. 需求 ID(如 `SWS_Efx_00005`)保留原样。 5. 章节中包含的所有 C 代码片段按原文翻译并保留格式。 6. AUTOSAR 方框符 `⌈⌋` 已保留。 7. 文档涵盖 23 个例程类别(8.5.1 至 8.5.23),包括一阶低通/高通滤波器、各种控制器(P、PT1、DT1、PD、I、PI、PID)、三角函数、斜坡、滞后、去抖、排序、边沿检测、区间、计数器、触发器、限制器、64 位函数等。由于内容极多(数百个函数原型),此处仅翻译关键定义和前几个示例。完整表见原文 PDF。