1081 lines
43 KiB
Markdown
1081 lines
43 KiB
Markdown
# SWS_MFXLibrary — 定点数学例程规范
|
||
|
||
| 文档元信息 | 值 |
|
||
|------------|------|
|
||
| 文档标题 | Specification of Fixed Point Math Routines(定点数学例程规范) |
|
||
| 文档所有者 | AUTOSAR |
|
||
| 文档责任方 | AUTOSAR |
|
||
| 文档标识号 | 394 |
|
||
| 文档状态 | Final(最终版) |
|
||
| 所属 AUTOSAR 标准 | Classic Platform(经典平台) |
|
||
| 所属标准发布版本 | 4.4.0 |
|
||
| 发布版本 | AUTOSAR CP Release 4.4.0 |
|
||
|
||
## 文档变更历史
|
||
|
||
| 日期 | 发布版本 | 变更人 | 变更说明 |
|
||
|------|----------|--------|----------|
|
||
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 编辑性修改 |
|
||
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 添加 SWS_Mfx_00024 的需求追踪信息;从 SWS_Mfx_00024 的 Mul 变体中移除 (**);为 0x078 添加 (*);在缩写中将"Development Error Tracer"重命名为"Default Error Tracer" |
|
||
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 在缩写中将"Development Error Tracer"重命名为"Default Error Tracer";移除需求 SWS_Mfx_00204;更新 SWS_Mfx_00064 的最大移位值;更新 SWS_Mfx_00073 以澄清最小/最大处理;澄清说明 |
|
||
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 更新 SWS_Mfx_00017,将函数 ID 0x200 到 0x205 的移位值从 64 改为 63;更新 5.1 文件结构下 SWS_Mfx_00001 |
|
||
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 次要更正和澄清 |
|
||
| 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 编辑性修改 |
|
||
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 更正和删除重复函数;编辑性修改 |
|
||
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 编辑性修改 |
|
||
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | 为函数列表添加以确保一致性和完整性;修复文档中的拼写错误 |
|
||
| 2010-09-30 | 3.1.5 | AUTOSAR Administration | 创建新 API 以完成需求;文件结构已详细说明命名约定 |
|
||
| 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 库的功能、API 和配置。
|
||
|
||
此数学库(MFX)包含以下例程:
|
||
|
||
- 加法(addition)
|
||
- 减法(subtraction)
|
||
- 绝对值(absolute value)
|
||
- 差的绝对值(absolute value of differences)
|
||
- 乘法(multiplication)
|
||
- 除法(division)
|
||
- 乘除组合(combination of multiplication and division)
|
||
- 乘法和右移组合(combination of multiplication and shift right)
|
||
- 除法和左移组合(combination of division and shift left)
|
||
- 取模(modulo)
|
||
- 限制(limitation)
|
||
|
||
其中一些函数还为 2n 缩放整数提供:
|
||
|
||
- 加法
|
||
- 减法
|
||
- 绝对值
|
||
- 差的绝对值
|
||
- 乘法
|
||
- 除法
|
||
- 转换(特定于 2n 缩放整数)
|
||
|
||
所有例程都是可重入的(re-entrant),可同时被多个可运行实体使用。
|
||
|
||
## 2 缩略语与缩写
|
||
|
||
| 缩写 | 描述 |
|
||
|------|------|
|
||
| **Abs** | Absolute value(绝对值) |
|
||
| **AbsDiff** | Absolute value of a difference(差的绝对值) |
|
||
| **Add** | Addition(加法) |
|
||
| **AR** | Autosar |
|
||
| **BSW** | Basic Software(基本软件) |
|
||
| **DET** | Default Error Tracer(默认错误追踪器) |
|
||
| **Div** | Division(除法) |
|
||
| **DivShLeft** | Combination of division and shift left(除法和左移的组合) |
|
||
| **ECU** | Electronic Control Unit(电子控制单元) |
|
||
| **Limit** | Limitation routine(限制例程) |
|
||
| **Max** | Maximum(最大值) |
|
||
| **MFX/Mfx** | Math – Fixed Point library(数学定点库) |
|
||
| **Min** | Minimum(最小值) |
|
||
| **Minmax** | Limitation with only one value for min and max(仅一个值用于最小和最大的限制) |
|
||
| **Mod** | Modulo routine(取模例程) |
|
||
| **Mul** | Multiplication(乘法) |
|
||
| **MulDiv** | Combination of multiplication and division(乘法和除法的组合) |
|
||
| **MulShRight** | Combination of multiplication and shift right(乘法和右移的组合) |
|
||
| **s16** | sint16 的助记符,参见 AUTOSAR_SWS_PlatformTypes |
|
||
| **s32** | sint32 的助记符 |
|
||
| **s8** | sint8 的助记符 |
|
||
| **Sub** | Subtraction(减法) |
|
||
| **SWS** | Software Specification(软件规范) |
|
||
| **u16** | uint16 的助记符 |
|
||
| **u32** | uint32 的助记符 |
|
||
| **u8** | uint8 的助记符 |
|
||
|
||
## 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] AUTOSAR Basic Software Module Description Template, AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
|
||
- [6] Specification of Platform Types, AUTOSAR_SWS_PlatformTypes.pdf
|
||
- [7] Requirement on Libraries, AUTOSAR_SRS_Libraries.pdf
|
||
- [8] Specification of C Implementation Rules, AUTOSAR_TR_CImplementationRules.pdf
|
||
- [9] Specification of Standard Types, AUTOSAR_SWS_StandardTypes.pdf
|
||
|
||
### 3.2 相关标准与规范
|
||
|
||
- [10] ISO/IEC 9899:1990 Programming Language – C
|
||
|
||
## 4 约束与假设
|
||
|
||
### 4.1 局限性
|
||
|
||
- 服务库的需求不能以多种方式实现。许多小例程可以组合成一个实现文件。对于较大的例程,一个文件应包含一个例程实现。一般来说,从链接器优化角度,建议每个目标文件一个例程。对于位处理例程,多个例程可以贡献形成一个目标文件。这种分组在发布 4.0 Rev001 中未实现,将在发布 4.0 rev002 中解决。
|
||
|
||
### 4.2 对汽车领域的适用性
|
||
|
||
无限制。
|
||
|
||
## 5 与其他模块的依赖关系
|
||
|
||
### 5.1 文件结构
|
||
|
||
[SWS_Mfx_00001] ⌈ MFX 模块应提供以下文件:
|
||
|
||
- C 文件 `Mfx_<name>.c` 用于实现库。所有 C 文件应以 `Mfx` 为前缀。
|
||
- 头文件 `Mfx.h` 提供由 MFX 库规范定义的所有公共函数原型和类型。 ⌋(SRS_LIBS_00005)
|
||
|
||
建议按以下选项实现和分组(关于 C 文件的)例程,但无强制要求遵循:
|
||
|
||
**选项 1**:`<Name>` 可以是函数名,每个函数一个 C 文件。
|
||
例如:`Mfx_Add_u8u8_u8.c` 等。
|
||
|
||
**选项 2**:`<Name>` 可以是函数组的通用名称:
|
||
- 2.1 按对象族分组:例如 `Mfx_NomMath.c`、`Mfx_ScaledMath.c`
|
||
- 2.2 按例程族分组:例如 `Mfx_Add.c`
|
||
- 2.3 按方法族分组:如果有意义
|
||
- 2.4 按架构分组:例如 `Mfx_Add8.c`
|
||
- 2.5 按其他方式分组:(允许自定义分组)
|
||
|
||
**选项 3**:可以省略 `<Name>`,使单个 C 文件包含所有 MFX 函数,例如 `Mfx.c`。
|
||
|
||
使用以上选项可在减少 C 文件数量的同时灵活选择合适的粒度。在某些选项情况下,也可以只按需链接(linking only on-demand)。
|
||
|
||
## 6 需求可追溯性
|
||
|
||
| 需求 | 描述 | 由以下需求满足 |
|
||
|------|------|----------------|
|
||
| SRS_BSW_00003 | 所有软件模块应提供版本和标识信息。 | SWS_Mfx_00215 |
|
||
| SRS_BSW_00007 | 所有用 C 语言编写的 BSW 模块应符合 MISRA C 2012 标准。 | SWS_Mfx_00209 |
|
||
| SRS_BSW_00304 | 所有 AUTOSAR 基本软件模块应使用以下数据类型,而非原生 C 数据类型。 | SWS_Mfx_00212 |
|
||
| SRS_BSW_00305 | 数据类型命名约定。 | SWS_Mfx_00024 |
|
||
| SRS_BSW_00306 | AUTOSAR 基本软件模块应是编译器和平台无关的。 | SWS_Mfx_00213 |
|
||
| SRS_BSW_00318 | 每个 AUTOSAR 基本软件模块文件应在头文件中提供版本号。 | SWS_Mfx_00215 |
|
||
| SRS_BSW_00321 | AUTOSAR 基本软件模块的版本号应按特定规则枚举。 | SWS_Mfx_00215 |
|
||
| SRS_BSW_00348 | 所有 AUTOSAR 标准类型和常量应放置并组织在标准类型头文件中。 | SWS_Mfx_00211 |
|
||
| SRS_BSW_00374 | 所有基本软件模块应提供可读的模块供应商标识。 | SWS_Mfx_00214 |
|
||
| SRS_BSW_00378 | AUTOSAR 应提供 boolean 类型。 | SWS_Mfx_00212 |
|
||
| SRS_BSW_00379 | 所有软件模块应在头文件和模块 XML 描述文件中提供模块标识符。 | SWS_Mfx_00214 |
|
||
| SRS_BSW_00402 | 每个模块应提供版本信息。 | SWS_Mfx_00214 |
|
||
| SRS_BSW_00407 | 每个 BSW 模块应提供读取专用模块实现版本信息的函数。 | SWS_Mfx_00215, SWS_Mfx_00216 |
|
||
| SRS_BSW_00411 | 所有 AUTOSAR 基本软件模块应应用 API 存在启用/禁用的命名规则。 | SWS_Mfx_00216 |
|
||
| SRS_BSW_00437 | 内存映射应提供定义启动期间不初始化的 RAM 段的可能性。 | SWS_Mfx_00210 |
|
||
| SRS_LIBS_00001 | 每个库函数的功能行为不应可配置。 | SWS_Mfx_00218 |
|
||
| SRS_LIBS_00002 | 库应在所有 BSW 模块和应用 SWC 之前可用。 | SWS_Mfx_00200 |
|
||
| SRS_LIBS_00003 | 库应在关闭之前保持可用。 | SWS_Mfx_00201 |
|
||
| SRS_LIBS_00004 | 库的使用不应通过端口接口。 | SWS_Mfx_00203 |
|
||
| SRS_LIBS_00005 | 每个库应提供一个具有其公共接口的头文件。 | SWS_Mfx_00001 |
|
||
| SRS_LIBS_00007 | 库的使用应记录在文档中。 | SWS_Mfx_00205 |
|
||
| SRS_LIBS_00013 | 由运行时输入参数值检查产生的错误情况应在 SWS 中列出。 | SWS_Mfx_00217, SWS_Mfx_00220 |
|
||
| SRS_LIBS_00015 | 应可以配置微控制器,使库代码在所有调用者之间共享。 | SWS_Mfx_00206 |
|
||
| SRS_LIBS_00017 | 应避免使用宏。 | SWS_Mfx_00207 |
|
||
| SRS_LIBS_00018 | 库函数只能调用库函数。 | SWS_Mfx_00208 |
|
||
|
||
## 7 功能规范
|
||
|
||
### 7.1 错误分类
|
||
|
||
[SWS_Mfx_00227] ⌈ 由于库不支持 DET 调用,因此无错误分类定义。 ⌋()
|
||
|
||
### 7.2 错误检测
|
||
|
||
[SWS_Mfx_00220] ⌈ 错误检测:函数应在运行时(无论在生产代码还是开发代码中)检查输入参数的值,特别是当错误值可能导致致命错误或不可预测结果的情况,前提是这些值在函数规范允许的范围内。所有错误情况应在 SWS 中列出,并且函数应返回 SWS 中规定的不可配置的值。该值取决于具体的函数和错误情况,因此逐个确定。
|
||
|
||
如果传递给例程的值无效且不符合函数规范,则不检测此类错误。
|
||
|
||
**例如:** 如果传递值 > 32 作为位位置,或将负数轴分布样本数传递给例程。 ⌋(SRS_LIBS_00013)
|
||
|
||
### 7.3 错误通知
|
||
|
||
[SWS_Mfx_00217] ⌈ 函数不应调用 DET 进行错误通知。 ⌋(SRS_LIBS_00013)
|
||
|
||
### 7.4 初始化与关闭
|
||
|
||
[SWS_Mfx_00200] ⌈ MFX 库不需要初始化阶段。库函数可在 ECU 初始化的最开始被调用,例如甚至可由 OS 或 EcuM 调用,因此库应就绪。 ⌋(SRS_LIBS_00002)
|
||
|
||
[SWS_Mfx_00201] ⌈ MFX 库不需要关闭操作阶段。 ⌋(SRS_LIBS_00003)
|
||
|
||
### 7.5 使用库 API
|
||
|
||
[SWS_Mfx_00203] ⌈ MFX API 可直接从 BSW 模块或 SWC 调用。无需端口定义。这是一种纯函数调用。 ⌋(SRS_LIBS_00004)
|
||
|
||
[SWS_Mfx_00205] ⌈ 库的使用应记录在文档中。如果 BSW 模块或 SWC 使用某个库,开发人员应在 BSW/SWC 模板中添加 Implementation-DependencyOnArtifact。`minVersion` 和 `maxVersion` 参数对应于供应商版本。对于 AUTOSAR 库,这些参数可以留空,因为 SWC 或 BSW 模块可以依赖库行为而非供应商实现。但是,SWC 或 BSW 模块应与其所集成的 AUTOSAR 平台兼容。 ⌋(SRS_LIBS_00007)
|
||
|
||
### 7.6 库实现
|
||
|
||
[SWS_Mfx_00206] ⌈ MFX 库的实现方式应使代码可在不同内存分区中的调用者之间共享。 ⌋(SRS_LIBS_00015)
|
||
|
||
[SWS_Mfx_00207] ⌈ 应避免使用宏。函数应声明为函数或内联函数(inline)。不应使用 `#define` 宏。 ⌋(SRS_LIBS_00017)
|
||
|
||
[SWS_Mfx_00208] ⌈ 库函数不应调用任何 BSW 模块的函数,例如 DET。库函数可以调用其他库函数。因为库函数应是可重入的,但其他 BSW 模块函数可能不可重入。 ⌋(SRS_LIBS_00018)
|
||
|
||
[SWS_Mfx_00209] ⌈ 用 C 语言编写的库应符合 MISRA C 标准。请参阅 SWS_BSW_00115 了解更多详情。 ⌋(SRS_BSW_00007)
|
||
|
||
[SWS_Mfx_00210] ⌈ 每个 AUTOSAR 库模块实现 `<library>*.c` 和 `<library>*.h` 应使用 AUTOSAR 内存映射机制将其代码映射到内存段。 ⌋(SRS_BSW_00437)
|
||
|
||
[SWS_Mfx_00211] ⌈ 每个使用 AUTOSAR 整数数据类型和/或标准返回值的 AUTOSAR 库模块实现 `<library>*.c` 应包含头文件 `StandardTypes.h`。 ⌋(SRS_BSW_00348)
|
||
|
||
[SWS_Mfx_00212] ⌈ 所有 AUTOSAR 库模块应使用 AUTOSAR 数据类型(整数、布尔)而非原生 C 数据类型,除非该库明确被标识为仅与某个平台兼容。 ⌋(SRS_BSW_00378, SRS_BSW_00304)
|
||
|
||
[SWS_Mfx_00213] ⌈ 所有 AUTOSAR 库模块应避免直接使用编译器和平台特定的关键字,除非该库明确被标识为仅与某个平台兼容。 ⌋(SRS_BSW_00306)
|
||
|
||
[SWS_Mfx_00225] ⌈ 实现 Mfx 服务时必须遵守整数提升。因此,为了获得最大精度,中间结果不应被限制。 ⌋()
|
||
|
||
## 8 API 规范
|
||
|
||
### 8.1 导入类型
|
||
|
||
本章列出从以下模块包含的所有类型:
|
||
|
||
| 模块 | 导入类型 |
|
||
|------|----------|
|
||
| Std_Types | sint8, uint8, sint16, uint16, sint32, uint32 |
|
||
|
||
我们注意到,由于 C 语言提供的整数类型的大小是实现定义的,因此每种整数类型可以表示的值范围将因实现而异。
|
||
|
||
因此,为了提高软件的可移植性,这些类型在 PlatformTypes.h [6] 中定义。库例程名称中使用以下助记符:
|
||
|
||
| 大小 | 平台类型 | 助记符 |
|
||
|------|----------|--------|
|
||
| signed 8-Bit | sint8 | s8 |
|
||
| signed 16-Bit | sint16 | s16 |
|
||
| signed 32-Bit | sint32 | s32 |
|
||
| unsigned 8-Bit | uint8 | u8 |
|
||
| unsigned 16-Bit | uint16 | u16 |
|
||
| unsigned 32-Bit | uint32 | u32 |
|
||
|
||
**表 1:基本类型**
|
||
|
||
如 [6] 所述,每种基本类型的范围如表 2 所示。
|
||
|
||
| 基本类型 | 范围 |
|
||
|----------|------|
|
||
| uint8 | [ 0, 255 ] |
|
||
| sint8 | [ -128, 127 ] |
|
||
| uint16 | [ 0, 65535 ] |
|
||
| sint16 | [ -32768, 32767 ] |
|
||
| uint32 | [ 0, 4294967295 ] |
|
||
| sint32 | [ -2147483648, 2147483647 ] |
|
||
|
||
**表 2:基本类型范围**
|
||
|
||
作为本文档其余部分的约定:
|
||
- 助记符将用于例程名称中(使用 `<InTypeMn1>` 表示输入 1 的类型助记符)
|
||
- 实际类型将用于例程原型的描述中(使用 `<InType1>` 或 `<OutType>`)。
|
||
|
||
### 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 关于例程优化的说明
|
||
|
||
#### 8.4.1 使用常量优化
|
||
|
||
出于优化目的,在某些例程中,函数的参数"必须是常量"。
|
||
|
||
要求是表达式必须在编译时完全求值。它可以是常量字面量、宏或可在编译时计算的算术表达式。它不能包含变量或函数调用。
|
||
|
||
例如,基点参数是常量表达式,以便它们可以在编译的预处理阶段之后被消除。当正确地实现为内联函数或宏时,所需移位次数的计算在编译时完成,而不是在运行时完成。当不使用常量表达式时,会有 ROM/吞吐量损失。
|
||
|
||
### 8.5 数学例程定义
|
||
|
||
#### 8.5.1 加法
|
||
|
||
[SWS_Mfx_00002] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_Add_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_Add_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x_value, <InType2> y_value)` |
|
||
| 服务 ID[hex] | 0x01 to 0x18 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `x_value` 第一个参数;`y_value` 第二个参数 |
|
||
| 参数 (in-out) | 无 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | `<OutType>` 计算结果 |
|
||
| 描述 | 此例程对两个参数进行加法运算。 |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
[SWS_Mfx_00006] ⌈ 此例程对两个参数进行加法运算:`Return-value = x_value + y_value` ⌋()
|
||
|
||
[SWS_Mfx_00007] ⌈ 在发生负溢出或正溢出时,返回值应饱和为边界值。 ⌋()
|
||
|
||
[SWS_Mfx_00008] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x001 | `uint8 Mfx_Add_u8u8_u8(uint8, uint8)` |
|
||
| 0x002 | `uint8 Mfx_Add_u8s8_u8(uint8, sint8)` |
|
||
| 0x003 | `sint8 Mfx_Add_u8s8_s8(uint8, sint8)` |
|
||
| 0x004 | `uint8 Mfx_Add_s8s8_u8(sint8, sint8)` |
|
||
| 0x005 | `sint8 Mfx_Add_s8s8_s8(sint8, sint8)` |
|
||
| 0x006 | `uint16 Mfx_Add_u16u16_u16(uint16, uint16)` |
|
||
| 0x007 | `uint16 Mfx_Add_u16s16_u16(uint16, sint16)` |
|
||
| 0x008 | `sint16 Mfx_Add_u16s16_s16(uint16, sint16)` |
|
||
| 0x009 | `uint8 Mfx_Add_s16s16_u8(sint16, sint16)` |
|
||
| 0x00A | `sint8 Mfx_Add_s16s16_s8(sint16, sint16)` |
|
||
| 0x00B | `uint16 Mfx_Add_s16s16_u16(sint16, sint16)` |
|
||
| 0x00C | `sint16 Mfx_Add_s16s16_s16(sint16, sint16)` |
|
||
| 0x00D | `sint8 Mfx_Add_u32u32_s8(uint32, uint32)` |
|
||
| 0x00E | `sint16 Mfx_Add_u32u32_s16(uint32, uint32)` |
|
||
| 0x00F | `uint32 Mfx_Add_u32u32_u32(uint32, uint32)` |
|
||
| 0x010 | `sint32 Mfx_Add_u32u32_s32(uint32, uint32)` |
|
||
| 0x011-0x018 | 32 位加法的多个变体 |
|
||
| 0xA01-0xA0C | 扩展加法变体 |
|
||
|
||
⌋()
|
||
|
||
> **摘要标记**:8.5 节包含 15 个数学例程类别(`Mfx_Add_*`、`Mfx_Sub_*`、`Mfx_Abs_*`、`Mfx_AbsDiff_*`、`Mfx_Mul_*`、`Mfx_Div_*`、`Mfx_RDiv_*`、`Mfx_MulDiv_*`、`Mfx_RMulDiv_*`、`Mfx_MulShRight_*`、`Mfx_DivShLeft_*`、`Mfx_Mod_*`、`Mfx_Limit_*`、`Mfx_Minmax_*`、`Mfx_Min_*`/`Mfx_Max_*`),共数百个函数原型。由于内容极多,此处仅翻译关键定义和部分示例。完整表见原文 PDF。
|
||
|
||
#### 8.5.2 减法
|
||
|
||
[SWS_Mfx_00009] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_Sub_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_Sub_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x_value, <InType2> y_value)` |
|
||
| 服务 ID[hex] | 0x20 to 0x40 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 描述 | 此例程对两个参数进行减法运算。`Return-value = x_value - y_value` |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.5.3 绝对值
|
||
|
||
[SWS_Mfx_00013] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_Abs_<InTypeMn1>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_Abs_<InTypeMn1>_<OutTypeMn>(<InType1> x_value)` |
|
||
| 服务 ID[hex] | 0x50 to 0x57 |
|
||
| 描述 | 此例程计算有符号值的绝对值:`Return-value = |x_value|` |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.5.4 差的绝对值
|
||
|
||
[SWS_Mfx_00017] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_AbsDiff_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_AbsDiff_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x_value, <InType2> y_value)` |
|
||
| 服务 ID[hex] | 0x60 to 0x6a |
|
||
| 描述 | 此例程计算两个值之差的绝对值:`Return-value = |x_value - y_value|` |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.5.5 乘法
|
||
|
||
[SWS_Mfx_00021] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_Mul_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_Mul_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x_value, <InType2> y_value)` |
|
||
| 服务 ID[hex] | 0x70 to 0x08D |
|
||
| 描述 | 此例程对两个参数进行乘法运算:`Return-value = x_value * y_value` |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.5.6 向 0 舍入的除法
|
||
|
||
[SWS_Mfx_00025] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_Div_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_Div_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x_value, <InType2> y_value)` |
|
||
| 服务 ID[hex] | 0x90 to 0x112 |
|
||
| 描述 | 这些例程对两个参数进行除法运算:`Return-value = x_value / y_value`,结果向 0 舍入。 |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
[SWS_Mfx_00028] ⌈ 除零后的结果定义如下:
|
||
- 如果 `x_value ≥ 0`,则函数返回输出类型的最大值
|
||
- 如果 `x_value < 0`,则函数返回输出类型的最小值
|
||
|
||
⌋()
|
||
|
||
#### 8.5.7 四舍五入的除法
|
||
|
||
[SWS_Mfx_00032] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_RDiv_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_RDiv_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x_value, <InType2> y_value)` |
|
||
| 服务 ID[hex] | 0x120 to 0x142 |
|
||
| 描述 | 这些例程对两个参数进行除法运算:`Return-value = x_value / y_value`,结果四舍五入。 |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.5.8 乘法和向 0 舍入的除法组合
|
||
|
||
[SWS_Mfx_00039] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_MulDiv_<InTypeMn1><InTypeMn2><InTypeMn3>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_MulDiv_<InTypeMn1><InTypeMn2><InTypeMn3>_<OutTypeMn>(<InType1> x_value, <InType2> y_value, <InType3> z_value)` |
|
||
| 服务 ID[hex] | 0x150 to 0x162 |
|
||
| 描述 | 这些例程对两个参数进行乘法运算并除以第三个参数:`Return-value = x_value * y_value / z_value`,结果向 0 舍入。 |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.5.9 乘法和四舍五入的除法组合
|
||
|
||
[SWS_Mfx_00046] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_RMulDiv_<InTypeMn1><InTypeMn2><InTypeMn3>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_RMulDiv_<InTypeMn1><InTypeMn2><InTypeMn3>_<OutTypeMn>(<InType1> x_value, <InType2> y_value, <InType3> z_value)` |
|
||
| 服务 ID[hex] | 0x170 to 0x182 |
|
||
| 描述 | 这些例程对两个参数进行乘法运算并除以第三个参数:`Return-value = x_value * y_value / z_value`,结果四舍五入。 |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.5.10 乘法和右移组合
|
||
|
||
[SWS_Mfx_00053] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_MulShRight_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_MulShRight_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x_value, <InType2> y_value, uint8 shift)` |
|
||
| 服务 ID[hex] | 0x190 to 0x205 |
|
||
| 描述 | 此例程对两个参数进行乘法运算并应用由第三个参数定义的右移:`Return-value = (x_value * y_value) >> shift` |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
[SWS_Mfx_00055] ⌈ 我们明确指出,对于负数的右移,我们始终保留符号位。 ⌋()
|
||
|
||
#### 8.5.11 除法和左移组合
|
||
|
||
[SWS_Mfx_00058] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_DivShLeft_<InTypeMn1><InTypeMn2>u8_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_DivShLeft_<InTypeMn1><InTypeMn2>u8_<OutTypeMn>(<InType1> x_value, <InType2> y_value, uint8 shift)` |
|
||
| 服务 ID[hex] | 0x210 to 0x218 |
|
||
| 描述 | 此例程对第一个参数应用由第三个参数定义的左移,然后除以第二个参数:`Return-value = (x_value << shift) / y_value` |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.5.12 取模
|
||
|
||
[SWS_Mfx_00065] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_Mod_<TypeMn>` |
|
||
| 语法 | `<Type> Mfx_Mod_<TypeMn>(<Type> x_value, <Type> y_value)` |
|
||
| 服务 ID[hex] | 0x220 to 0x225 |
|
||
| 描述 | 如果 `y_value` 不为零,此例程返回除法 `x_value / y_value` 的余数。 |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
[SWS_Mfx_00066] ⌈ 如果 `y_value` 为零,则结果为零。 ⌋()
|
||
|
||
[SWS_Mfx_00068] ⌈ 在其他情况下,`Return-value = x_value mod y_value`。 ⌋()
|
||
|
||
[SWS_Mfx_00069] ⌈ 余数的符号与 `x_value` 的符号相同。 ⌋()
|
||
|
||
#### 8.5.13 限制
|
||
|
||
[SWS_Mfx_00073] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_Limit_<TypeMn>` |
|
||
| 语法 | `<Type> Mfx_Limit_<TypeMn>(<Type> value, <Type> min_value, <Type> max_value)` |
|
||
| 服务 ID[hex] | 0x230 to 0x235 |
|
||
| 描述 | 此例程将输入值限制在下界和上界之间。 |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
[SWS_Mfx_00074] ⌈ 如果 `value < min_value`,则 `Return-value = min_value`。 ⌋()
|
||
|
||
[SWS_Mfx_00075] ⌈ 如果 `value > max_value`,则 `Return-value = max_value`。 ⌋()
|
||
|
||
[SWS_Mfx_00076] ⌈ 在其他情况下,`Return-value = value`。 ⌋()
|
||
|
||
#### 8.5.14 仅一个值用于最小和最大的限制
|
||
|
||
[SWS_Mfx_00082] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_Minmax_<TypeMn>` |
|
||
| 语法 | `<Type> Mfx_Minmax_<TypeMn>(<Type> value, <Type> minmax_value)` |
|
||
| 服务 ID[hex] | 0x240 to 0x245 |
|
||
| 描述 | 此例程将值限制为最小值或最大值,取决于 `minmax_value` 的符号。 |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
#### 8.5.15 最小和最大
|
||
|
||
[SWS_Mfx_00090] ⌈ `Mfx_Min_<TypeMn>` 服务返回两个值中的最小值。 ⌋()
|
||
|
||
[SWS_Mfx_00093] ⌈ `Mfx_Max_<TypeMn>` 服务返回两个值中的最大值。 ⌋()
|
||
|
||
[SWS_Mfx_00096] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x250-0x255 | `Mfx_Min_*` (u8, s8, u16, s16, u32, s32) |
|
||
| 0x256-0x25B | `Mfx_Max_*` (u8, s8, u16, s16, u32, s32) |
|
||
|
||
⌋()
|
||
|
||
### 8.6 2n 缩放整数数学函数
|
||
|
||
对于以下所有函数,大写字母将用于操作数,小写字母将用于基数。
|
||
|
||
例如:
|
||
- "x" 是操作数,"a" 是表示其基数的参数
|
||
- "C" 是结果,"c" 是其基数的参数
|
||
|
||
基数将始终是 16 位有符号整数(sint16)。因此,助记符不会出现在函数名称中,以便具有较短的名称。
|
||
|
||
对于所有操作,给出有效范围作为信息。实际上,使用有效范围之外的参数的操作将在输出类型的范围内饱和。这有助于优化目的。
|
||
|
||
#### 8.6.1 转换
|
||
|
||
##### 8.6.1.1 16 位到 8 位 2n 缩放整数转换
|
||
|
||
[SWS_Mfx_00100] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_ConvertP2_<InTypeMn>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_ConvertP2_<InTypeMn>_<OutTypeMn>(<InType> x, sint16 a, sint16 c)` |
|
||
| 服务 ID[hex] | 0x260 to 0x261 |
|
||
| 参数 (in) | `x` 定点操作数的整数值;`a` 定点操作数的基点位置(必须是常量表达式);`c` 定点结果的基点位置(必须是常量表达式)。有效范围:`-15 ≤ (c - a) ≤ 7` |
|
||
| 返回值 | `<OutType>` = `2^(c-a) * x` |
|
||
| 描述 | 此例程将缩放的 16 位整数转换为缩放的 8 位整数。 |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
[SWS_Mfx_00101] ⌈ 函数返回定点转换的整数值(C),由 `C = 2^(c-a) * x` 确定。 ⌋()
|
||
|
||
[SWS_Mfx_00102] ⌈ 在发生负溢出或正溢出时,返回值应饱和为边界值。 ⌋()
|
||
|
||
[SWS_Mfx_00103] ⌈ 如果需要对该公式的结果进行舍入,则向 0 舍入。 ⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x260 | `uint8 Mfx_ConvertP2_u16_u8(uint16 x, sint16 a, sint16 c)` |
|
||
| 0x261 | `sint8 Mfx_ConvertP2_s16_s8(sint16 x, sint16 a, sint16 c)` |
|
||
|
||
##### 8.6.1.2 8 位到 16 位 2n 缩放整数转换
|
||
|
||
[SWS_Mfx_00106] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_ConvertP2_<InTypeMn>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_ConvertP2_<InTypeMn>_<OutTypeMn>(<InType> x, sint16 a, sint16 c)` |
|
||
| 服务 ID[hex] | 0x26A to 0x26B |
|
||
| 参数 (in) | `x`、`a`、`c`(有效范围:`-7 ≤ (c - a) ≤ 15`) |
|
||
| 返回值 | `<OutType>` = `2^(c-a) * x` |
|
||
| 描述 | 此例程将缩放的 8 位整数转换为缩放的 16 位整数。 |
|
||
| 通过 | Mfx.h |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x26A | `uint16 Mfx_ConvertP2_u8_u16(uint8 x, sint16 a, sint16 c)` |
|
||
| 0x26B | `sint16 Mfx_ConvertP2_s8_s16(sint8 x, sint16 a, sint16 c)` |
|
||
|
||
##### 8.6.1.3 32 位到 16 位 2n 缩放整数转换
|
||
|
||
[SWS_Mfx_00112] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_ConvertP2_<InTypeMn>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_ConvertP2_<InTypeMn>_<OutTypeMn>(<InType> x, sint16 a, sint16 c)` |
|
||
| 服务 ID[hex] | 0x270 to 0x271 |
|
||
| 参数 (in) | `x`、`a`、`c`(有效范围:`-31 ≤ (c - a) ≤ 15`) |
|
||
| 返回值 | `<OutType>` = `2^(c-a) * x` |
|
||
| 描述 | 此例程将缩放的 32 位整数转换为缩放的 16 位整数。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x270 | `uint16 Mfx_ConvertP2_u32_u16(uint32 x, sint16 a, sint16 c)` |
|
||
| 0x271 | `sint16 Mfx_ConvertP2_s32_s16(sint32 x, sint16 a, sint16 c)` |
|
||
|
||
##### 8.6.1.4 16 位到 32 位 2n 缩放整数转换
|
||
|
||
[SWS_Mfx_00118] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_ConvertP2_<InTypeMn>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_ConvertP2_<InTypeMn>_<OutTypeMn>(<InType> x, sint16 a, sint16 c)` |
|
||
| 服务 ID[hex] | 0x27A to 0x27B |
|
||
| 参数 (in) | `x`、`a`、`c`(有效范围:`-15 ≤ (c - a) ≤ 31`) |
|
||
| 返回值 | `<OutType>` = `2^(c-a) * x` |
|
||
| 描述 | 此例程将缩放的 16 位整数转换为缩放的 32 位整数。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x27A | `uint32 Mfx_ConvertP2_u16_u32(uint16 x, sint16 a, sint16 c)` |
|
||
| 0x27B | `sint32 Mfx_ConvertP2_s16_s32(sint16 x, sint16 a, sint16 c)` |
|
||
|
||
#### 8.6.2 乘法
|
||
|
||
##### 8.6.2.1 16 位 2n 缩放整数乘法
|
||
|
||
[SWS_Mfx_00124] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_MulP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_MulP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x, <InType2> y, sint16 a, sint16 b, sint16 c)` |
|
||
| 服务 ID[hex] | 0x280 to 0x285 |
|
||
| 参数 (in) | `x`、`y`;`a` 第一个定点操作数的基点位置;`b` 第二个定点操作数的基点位置;`c` 定点结果的基点位置(有效范围:`-31 ≤ (c - b - a) ≤ 15`) |
|
||
| 返回值 | `<OutType>` = `2^(c-b-a) * [x * y]` |
|
||
| 描述 | 此例程将两个 16 位整数相乘,缩放因子由输入参数设置。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x280 | `uint16 Mfx_MulP2_u16u16_u16(uint16 x, uint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x281 | `uint16 Mfx_MulP2_u16s16_u16(uint16 x, sint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x282 | `uint16 Mfx_MulP2_s16s16_u16(sint16 x, sint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x283 | `sint16 Mfx_MulP2_u16u16_s16(uint16 x, uint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x284 | `sint16 Mfx_MulP2_u16s16_s16(uint16 x, sint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x285 | `sint16 Mfx_MulP2_s16s16_s16(sint16 x, sint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
|
||
##### 8.6.2.2 32 位 2n 缩放整数乘法
|
||
|
||
[SWS_Mfx_00130] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_MulP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_MulP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x, <InType2> y, sint16 a, sint16 b, sint16 c)` |
|
||
| 服务 ID[hex] | 0x290 to 0x295 |
|
||
| 参数 (in) | `x`、`y`、`a`、`b`、`c`(有效范围:`-63 ≤ (c - b - a) ≤ 31`) |
|
||
| 返回值 | `<OutType>` = `2^(c-b-a) * [x * y]` |
|
||
| 描述 | 此例程将两个 32 位整数相乘,缩放因子由输入参数设置。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x290 | `uint32 Mfx_MulP2_u32u32_u32(uint32 x, uint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x291 | `uint32 Mfx_MulP2_u32s32_u32(uint32 x, sint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x292 | `uint32 Mfx_MulP2_s32s32_u32(sint32 x, sint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x293 | `sint32 Mfx_MulP2_u32u32_s32(uint32 x, uint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x294 | `sint32 Mfx_MulP2_u32s32_s32(uint32 x, sint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x295 | `sint32 Mfx_MulP2_s32s32_s32(sint32 x, sint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
|
||
#### 8.6.3 除法
|
||
|
||
##### 8.6.3.1 16 位 2n 缩放整数除法
|
||
|
||
[SWS_Mfx_00136] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_DivP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_DivP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x, <InType2> y, sint16 a, sint16 b, sint16 c)` |
|
||
| 服务 ID[hex] | 0x300 to 0x307 |
|
||
| 参数 (in) | `x`、`y`、`a`、`b`、`c`(有效范围:`-15 ≤ (c + b - a) ≤ 31`) |
|
||
| 返回值 | `<OutType>` = `[2^(c+b-a) * x] / y` |
|
||
| 描述 | 此例程将两个 16 位整数相除,缩放因子由输入参数设置。 |
|
||
|
||
⌋()
|
||
|
||
[SWS_Mfx_00139] ⌈ 如果除数 `y` 为零,结果定义如下:
|
||
- 如果 `x ≥ 0`,则函数返回输出类型的最大值
|
||
- 如果 `x < 0`,则函数返回输出类型的最小值
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x300 | `uint16 Mfx_DivP2_u16u16_u16(uint16 x, uint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x301 | `uint16 Mfx_DivP2_u16s16_u16(uint16 x, sint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x302 | `uint16 Mfx_DivP2_s16u16_u16(sint16 x, uint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x303 | `uint16 Mfx_DivP2_s16s16_u16(sint16 x, sint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x304 | `sint16 Mfx_DivP2_u16u16_s16(uint16 x, uint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x305 | `sint16 Mfx_DivP2_u16s16_s16(uint16 x, sint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x306 | `sint16 Mfx_DivP2_s16u16_s16(sint16 x, uint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x307 | `sint16 Mfx_DivP2_s16s16_s16(sint16 x, sint16 y, sint16 a, sint16 b, sint16 c)` |
|
||
|
||
##### 8.6.3.2 32 位 2n 缩放整数除法
|
||
|
||
[SWS_Mfx_00144] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_DivP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_DivP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x, <InType2> y, sint16 a, sint16 b, sint16 c)` |
|
||
| 服务 ID[hex] | 0x310 to 0x317 |
|
||
| 参数 (in) | `x`、`y`、`a`、`b`、`c`(有效范围:`-31 ≤ (c + b - a) ≤ 63`) |
|
||
| 返回值 | `<OutType>` = `[2^(c+b-a) * x] / y` |
|
||
| 描述 | 此例程将两个 32 位整数相除,缩放因子由输入参数设置。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x310 | `uint32 Mfx_DivP2_u32u32_u32(uint32 x, uint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x311 | `uint32 Mfx_DivP2_u32s32_u32(uint32 x, sint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x312 | `uint32 Mfx_DivP2_s32u32_u32(sint32 x, uint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x313 | `uint32 Mfx_DivP2_s32s32_u32(sint32 x, sint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x314 | `sint32 Mfx_DivP2_u32u32_s32(uint32 x, uint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x315 | `sint32 Mfx_DivP2_u32s32_s32(uint32 x, sint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x316 | `sint32 Mfx_DivP2_s32u32_s32(sint32 x, uint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
| 0x317 | `sint32 Mfx_DivP2_s32s32_s32(sint32 x, sint32 y, sint16 a, sint16 b, sint16 c)` |
|
||
|
||
#### 8.6.4 加法
|
||
|
||
##### 8.6.4.1 16 位 2n 缩放整数加法
|
||
|
||
[SWS_Mfx_00152] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_AddP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_AddP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x, <InType2> y, sint16 a, sint16 b, sint16 c)` |
|
||
| 服务 ID[hex] | 0x320 to 0x325 |
|
||
| 参数 (in) | `x`、`y`、`a`、`b`、`c`(有效范围:0 ≤ |a - b| ≤ 15 等) |
|
||
| 返回值 | `<OutType>` = `a ≥ b: 2^(c-a) * [x + (y * 2^(a-b))]`;`a < b: 2^(c-b) * [(x * 2^(b-a)) + y]` |
|
||
| 描述 | 此例程将两个 16 位整数相加,缩放因子由输入参数设置。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x320-0x325 | `Mfx_AddP2_u16u16_u16`、`Mfx_AddP2_u16s16_u16`、`Mfx_AddP2_s16s16_u16`、`Mfx_AddP2_u16u16_s16`、`Mfx_AddP2_u16s16_s16`、`Mfx_AddP2_s16s16_s16` |
|
||
|
||
##### 8.6.4.2 32 位 2n 缩放整数加法
|
||
|
||
[SWS_Mfx_00158] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_AddP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_AddP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x, <InType2> y, sint16 a, sint16 b, sint16 c)` |
|
||
| 服务 ID[hex] | 0x330 to 0x335 |
|
||
| 参数 (in) | `x`、`y`、`a`、`b`、`c`(有效范围:0 ≤ |a - b| ≤ 31 等) |
|
||
| 返回值 | 与 16 位版本相同的形式 |
|
||
| 描述 | 此例程将两个 32 位整数相加,缩放因子由输入参数设置。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x330-0x335 | `Mfx_AddP2_u32u32_u32`、`Mfx_AddP2_u32s32_u32`、`Mfx_AddP2_s32s32_u32`、`Mfx_AddP2_u32u32_s32`、`Mfx_AddP2_u32s32_s32`、`Mfx_AddP2_s32s32_s32` |
|
||
|
||
#### 8.6.5 减法
|
||
|
||
##### 8.6.5.1 16 位 2n 缩放整数减法
|
||
|
||
[SWS_Mfx_00164] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_SubP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_SubP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x, <InType2> y, sint16 a, sint16 b, sint16 c)` |
|
||
| 服务 ID[hex] | 0x340 to 0x347 |
|
||
| 返回值 | `<OutType>` = `a ≥ b: 2^(c-a) * [x - (y * 2^(a-b))]`;`a < b: 2^(c-b) * [(x * 2^(b-a)) - y]` |
|
||
| 描述 | 此例程将两个 16 位整数相减,缩放因子由输入参数设置。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x340-0x347 | `Mfx_SubP2_u16u16_u16`、`Mfx_SubP2_u16s16_u16`、`Mfx_SubP2_s16u16_u16`、`Mfx_SubP2_s16s16_u16`、`Mfx_SubP2_u16u16_s16`、`Mfx_SubP2_u16s16_s16`、`Mfx_SubP2_s16u16_s16`、`Mfx_SubP2_s16s16_s16` |
|
||
|
||
##### 8.6.5.2 32 位 2n 缩放整数减法
|
||
|
||
[SWS_Mfx_00170] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_SubP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_SubP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x, <InType2> y, sint16 a, sint16 b, sint16 c)` |
|
||
| 服务 ID[hex] | 0x350 to 0x357 |
|
||
| 描述 | 此例程将两个 32 位整数相减,缩放因子由输入参数设置。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x350-0x357 | `Mfx_SubP2_u32u32_u32`、`Mfx_SubP2_u32s32_u32`、`Mfx_SubP2_s32u32_u32`、`Mfx_SubP2_s32s32_u32`、`Mfx_SubP2_u32u32_s32`、`Mfx_SubP2_u32s32_s32`、`Mfx_SubP2_s32u32_s32`、`Mfx_SubP2_s32s32_s32` |
|
||
|
||
#### 8.6.6 2n 缩放整数的绝对差
|
||
|
||
[SWS_Mfx_00176] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_AbsDiffP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_AbsDiffP2_<InTypeMn1><InTypeMn2>_<OutTypeMn>(<InType1> x, <InType2> y, sint16 a, sint16 b, sint16 c)` |
|
||
| 服务 ID[hex] | 0x360 to 0x365 |
|
||
| 返回值 | `<OutType>` = `a ≥ b: 2^(c-a) * |x - (y * 2^(a-b))|`;`a < b: 2^(c-b) * |(x * 2^(b-a)) - y|` |
|
||
| 描述 | 此例程将两个 16 位整数相减并取绝对值,缩放因子由输入参数设置。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x360-0x365 | `Mfx_AbsDiffP2_u16u16_u16`、`Mfx_AbsDiffP2_u16s16_u16`、`Mfx_AbsDiffP2_s16s16_u16`、`Mfx_AbsDiffP2_u16u16_s16`、`Mfx_AbsDiffP2_u16s16_s16`、`Mfx_AbsDiffP2_s16s16_s16` |
|
||
|
||
#### 8.6.7 绝对值
|
||
|
||
##### 8.6.7.1 16 位 2n 缩放整数的绝对值
|
||
|
||
[SWS_Mfx_00182] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_AbsP2_s16_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_AbsP2_s16_<OutTypeMn>(<InType1> x, sint16 a, sint16 c)` |
|
||
| 服务 ID[hex] | 0x370 to 0x371 |
|
||
| 返回值 | `<OutType>` = `2^(c-a) * |x|` |
|
||
| 描述 | 此例程取 16 位整数的绝对值,缩放因子由输入参数设置。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x370 | `uint16 Mfx_AbsP2_s16_u16(sint16 x, sint16 a, sint16 c)` |
|
||
| 0x371 | `sint16 Mfx_AbsP2_s16_s16(sint16 x, sint16 a, sint16 c)` |
|
||
|
||
##### 8.6.7.2 32 位 2n 缩放整数的绝对值
|
||
|
||
[SWS_Mfx_00188] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_AbsP2_s32_<OutTypeMn>` |
|
||
| 语法 | `<OutType> Mfx_AbsP2_s32_<OutTypeMn>(<InType1> x, sint16 a, sint16 c)` |
|
||
| 服务 ID[hex] | 0x37A to 0x37B |
|
||
| 返回值 | `<OutType>` = `2^(c-a) * |x|` |
|
||
| 描述 | 此例程取 32 位整数的绝对值,缩放因子由输入参数设置。 |
|
||
|
||
⌋()
|
||
|
||
**已实现函数:**
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x37A | `uint32 Mfx_AbsP2_s32_u32(sint32 x, sint16 a, sint16 c)` |
|
||
| 0x37B | `sint32 Mfx_AbsP2_s32_s32(sint32 x, sint16 a, sint16 c)` |
|
||
|
||
### 8.7 函数使用示例
|
||
|
||
#### 8.7.1 乘法和右移组合
|
||
|
||
将参数乘以给定范围的因子的函数可以解释为乘法和右移的组合。
|
||
|
||
如果我们考虑作为 2 的幂的因子:2^n1
|
||
如果我们考虑用于编码因子的类型的最大值:2^(n2-1)
|
||
那么我们应该应用于乘法结果的右移由下式给出:(n2-n1)
|
||
|
||
例如,我们将 s8 值(argument1)乘以 1 (2^0) 编码的因子,最大值(Max(u8)=2^8-1)。
|
||
因子的物理范围是 [0, 0.996]。
|
||
结果是:
|
||
|
||
```c
|
||
Mfx_MulShRight_s16s16u8_s8(argument1, factor, 8)
|
||
```
|
||
|
||
#### 8.7.2 除法和左移组合
|
||
|
||
在动力总成域中,将两个参数相除以计算给定范围的因子的函数可以解释为除法和左移的组合。
|
||
|
||
如果我们考虑作为 2 的幂的因子:2^n1
|
||
如果我们考虑用于编码结果(因子)的类型的最大值:2^(n2-1)
|
||
那么我们应该应用于除法结果的左移由下式给出:(n2-n1)
|
||
|
||
例如,我们将两个 u16 值(argument1 和 argument2)相除以获得 1 (2^0) 编码的因子,最大值(Max(u16)=2^16-1)。
|
||
结果的物理范围是 [0, 0.999985]。
|
||
结果是:
|
||
|
||
```c
|
||
Mfx_DivShLeft_u16u16u8_u16(argument1, argument2, 16)
|
||
```
|
||
|
||
### 8.8 版本 API
|
||
|
||
#### 8.8.1 Mfx_GetVersionInfo
|
||
|
||
[SWS_Mfx_00215] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Mfx_GetVersionInfo` |
|
||
| 语法 | `void Mfx_GetVersionInfo(Std_VersionInfoType* versioninfo)` |
|
||
| 服务 ID[hex] | 0x400 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | 无 |
|
||
| 参数 (in-out) | 无 |
|
||
| 参数 (out) | `versioninfo` 指向存储此模块版本信息的位置。格式符合 [BSW00321]。 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 返回此库的版本信息。 |
|
||
| 通过 | Mfx.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_Mfx_00216] ⌈ 如果 `Mfx_GetVersionInfo` 的调用方和被调用方的源代码都可用,Mfx 库应将 `Mfx_GetVersionInfo` 实现为模块头文件中定义的宏。 ⌋(SRS_BSW_00407, SRS_BSW_00411)
|
||
|
||
### 8.9 回调通知
|
||
|
||
无。
|
||
|
||
### 8.10 调度函数
|
||
|
||
MFX 库没有调度函数。
|
||
|
||
### 8.11 预期接口
|
||
|
||
无。
|
||
|
||
#### 8.11.1 强制接口
|
||
|
||
无。
|
||
|
||
#### 8.11.2 可选接口
|
||
|
||
无。
|
||
|
||
#### 8.11.3 可配置接口
|
||
|
||
无。
|
||
|
||
## 9 时序图
|
||
|
||
不适用。
|
||
|
||
## 10 配置规范
|
||
|
||
### 10.1 发布信息
|
||
|
||
[SWS_Mfx_00214] ⌈ 如 [3] 中 SRS_BSW_00402 要求的标准化通用发布参数,应在本模块的头文件中发布,并需要在 BSW Module Description 中提供。相应的模块缩写可在 [1] 基本软件模块列表中找到。 ⌋(SRS_BSW_00402, SRS_BSW_00374, SRS_BSW_00379)
|
||
|
||
其他模块特定的发布参数(如果适用)将在下面列出。
|
||
|
||
### 10.2 配置选项
|
||
|
||
[SWS_Mfx_00218] ⌈ MFX 库不应具有任何可能影响例程功能行为的配置选项。即对于给定的输入参数集合,输出应始终相同。例如,出错时返回的值不应可配置。 ⌋(SRS_LIBS_00001)
|
||
|
||
但是,库供应商被允许添加与库实现相关的特定配置选项,例如用于资源消耗优化。
|
||
|
||
## 11 不适用的需求
|
||
|
||
[SWS_Mfx_00222] ⌈ 这些需求不适用于本规范。 ⌋()
|
||
|
||
---
|
||
|
||
## 翻译说明
|
||
|
||
1. 本文档为 AUTOSAR CP Release 4.4.0 的 MFX 库软件规范(SWS)。
|
||
2. 所有 API 标识符(如 `Mfx_Add_u8u8_u8`、`Mfx_Sub_u8s8_s8`、`Mfx_Mul_s32s32_s32` 等)保留英文原名。
|
||
3. 数据类型(`uint8`、`uint16`、`uint32`、`sint8`、`sint16`、`sint32`、`boolean`)保留英文原名。
|
||
4. 需求 ID(如 `SWS_Mfx_00002`)保留原样。
|
||
5. 章节中包含的所有 C 代码片段按原文翻译并保留格式。
|
||
6. AUTOSAR 方框符 `⌈⌋` 已保留。
|
||
7. 文档涵盖 8.5 节的所有 15 个数学例程类别(加法、减法、绝对值、差的绝对值、乘法、除法、四舍五入除法、乘除组合、四舍五入乘除组合、乘右移、除左移、取模、限制、MinMax、最小/最大)和 8.6 节的所有 7 个 2n 缩放整数数学函数类别(转换、乘法、除法、加法、减法、绝对差、绝对值)。由于内容极多(数百个函数原型),此处仅翻译关键定义和前几个示例。完整表见原文 PDF。
|