1141 lines
39 KiB
Markdown
1141 lines
39 KiB
Markdown
# SWS_BFXLibrary — 位处理例程规范
|
||
|
||
| 文档元信息 | 值 |
|
||
|------------|------|
|
||
| 文档标题 | Specification of Bit Handling Routines(位处理例程规范) |
|
||
| 文档所有者 | AUTOSAR |
|
||
| 文档责任方 | AUTOSAR |
|
||
| 文档标识号 | 399 |
|
||
| 文档状态 | Final(最终版) |
|
||
| 所属 AUTOSAR 标准 | Classic Platform(经典平台) |
|
||
| 所属标准发布版本 | 4.4.0 |
|
||
| 发布版本 | AUTOSAR CP Release 4.4.0 |
|
||
|
||
## 文档变更历史
|
||
|
||
| 日期 | 发布版本 | 变更人 | 变更说明 |
|
||
|------|----------|--------|----------|
|
||
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 新增 64 位处理需求 |
|
||
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 为布尔型添加助记符 "u8";编辑性修改 |
|
||
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 移除需求 SWS_Bfx_00204;更新 MISRA 违反注释格式;更新 BitPn、BitStartPn、BitLn 与 ShiftCnt 的未指定值范围;澄清说明 |
|
||
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 更新 SWS_Bfx_00017,将 Bfx_GetBit 函数返回类型从 1 和 0 改为 TRUE 和 FALSE;更新第 8.1 章中位寻址定义以及 Bfx_SetBit、Bfx_ClrBit、Bfx_GetBit、Bfx_SetBits、Bfx_CopyBit、Bfx_PutBits、Bfx_PutBit 的示例;将表 2 中的 Boolean 替换为 boolean;在 SWS_Bfx_00029 的示例中将 BFX_GetBits_u16u8u8_u16 替换为 Bfx_GetBits_u16u8u8_u16 |
|
||
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 正确使用函数声明中的 const;编辑性修改 |
|
||
| 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 编辑性修改 |
|
||
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 改进 C 文件的函数映射方式描述;改进错误分类定义;编辑性修改 |
|
||
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 将 Test Bit API 的返回值改为 boolean;改进内存映射处理;更改 Put Bit API 的参数数量 |
|
||
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | 更清晰地描述位移位和循环移位操作的需求;更正 PutBit 例程的表;更正 Copy Bit 例程的接口;移除错误分类支持和定义(库不支持 DET 调用);移除版本信息例程的配置参数描述/支持;将缩写中的 DET 重命名为 "Default Error Tracer" |
|
||
| 2009-12-18 | 4.0.1 | AUTOSAR Administration | 优化位处理函数签名以方便使用;消除有符号变量上的位处理;引入额外的位处理函数 |
|
||
| 2010-02-02 | 3.1.4 | AUTOSAR Administration | 初始发布 |
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
1. [引言与功能概述](#1-引言与功能概述)
|
||
2. [缩略语与缩写](#2-缩略语与缩写)
|
||
3. [相关文档](#3-相关文档)
|
||
- 3.1 [输入文档](#31-输入文档)
|
||
- 3.2 [相关标准与规范](#32-相关标准与规范)
|
||
4. [约束与假设](#4-约束与假设)
|
||
- 4.1 [局限性](#41-局限性)
|
||
- 4.2 [对汽车领域的适用性](#42-对汽车领域的适用性)
|
||
5. [与其他模块的依赖关系](#5-与其他模块的依赖关系)
|
||
- 5.1 [文件结构](#51-文件结构)
|
||
6. [需求可追溯性](#6-需求可追溯性)
|
||
7. [功能规范](#7-功能规范)
|
||
- 7.1 [错误分类](#71-错误分类)
|
||
- 7.2 [错误检测](#72-错误检测)
|
||
- 7.3 [错误通知](#73-错误通知)
|
||
- 7.4 [初始化与关闭](#74-初始化与关闭)
|
||
- 7.5 [使用库 API](#75-使用库-api)
|
||
- 7.6 [库实现](#76-库实现)
|
||
8. [API 规范](#8-api-规范)
|
||
- 8.1 [导入类型](#81-导入类型)
|
||
- 8.2 [类型定义](#82-类型定义)
|
||
- 8.3 [关于目标优化的函数说明](#83-关于目标优化的函数说明)
|
||
- 8.4 [位函数定义](#84-位函数定义)
|
||
- 8.5 [回调通知](#85-回调通知)
|
||
- 8.6 [调度函数](#86-调度函数)
|
||
- 8.7 [预期接口](#87-预期接口)
|
||
- 8.8 [版本 API](#88-版本-api)
|
||
9. [时序图](#9-时序图)
|
||
10. [配置规范](#10-配置规范)
|
||
- 10.1 [发布信息](#101-发布信息)
|
||
- 10.2 [配置选项](#102-配置选项)
|
||
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
|
||
```
|
||
|
||
**图:分层架构**
|
||
|
||
Bfx 例程规范规定了 AUTOSAR 位处理功能库的功能、API 和配置,该库专用于定点算术例程。
|
||
|
||
所有位函数都是可重入的(re-entrant),可以处理来自应用程序的多个并发请求。
|
||
|
||
## 2 缩略语与缩写
|
||
|
||
具有局部范围、因此未包含在 AUTOSAR 词汇表中的缩略语和缩写必须出现在局部词汇表中。
|
||
|
||
**缩写说明:**
|
||
|
||
| 缩写 | 描述 |
|
||
|------|------|
|
||
| **Bfx** | 定点位域函数的简称 |
|
||
| **u8** | uint8 的简称,参见 AUTOSAR_SWS_PlatformTypes |
|
||
| **u16** | uint16 的简称,参见 AUTOSAR_SWS_PlatformTypes |
|
||
| **u32** | uint32 的简称,参见 AUTOSAR_SWS_PlatformTypes |
|
||
| **s8** | sint8 的简称,参见 AUTOSAR_SWS_PlatformTypes |
|
||
| **s16** | sint16 的简称,参见 AUTOSAR_SWS_PlatformTypes |
|
||
| **s32** | sint32 的简称,参见 AUTOSAR_SWS_PlatformTypes |
|
||
| **boolean** | 布尔数据类型,参见 AUTOSAR_SWS_PlatformTypes |
|
||
| **DET** | Default Error Tracer(默认错误追踪器) |
|
||
|
||
## 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] Specification of Standard Types, AUTOSAR_SWS_StandardTypes.pdf
|
||
- [8] Requirement on Libraries, AUTOSAR_SRS_Libraries.pdf
|
||
- [9] Specification of Memory Mapping, AUTOSAR_SWS_MemoryMapping
|
||
- [10] Software Component Template, AUTOSAR_TPS_SoftwareComponentTemplateSoftware
|
||
- [11] Specification of C Implementation Rules, AUTOSAR_TR_CImplementationRules.pdf
|
||
|
||
### 3.2 相关标准与规范
|
||
|
||
- [10] ISO/IEC 9899:1990 Programming Language – C
|
||
|
||
## 4 约束与假设
|
||
|
||
### 4.1 局限性
|
||
|
||
无局限性。
|
||
|
||
### 4.2 对汽车领域的适用性
|
||
|
||
无限制。
|
||
|
||
## 5 与其他模块的依赖关系
|
||
|
||
### 5.1 文件结构
|
||
|
||
[SWS_Bfx_00220] ⌈ Bfx 模块应提供以下文件:
|
||
|
||
- C 文件 `Bfx_<name>.c` 用于实现库。所有 C 文件应以 `Bfx` 为前缀。
|
||
- 头文件 `Bfx.h` 提供由 BFX 库规范定义的所有公共函数原型和类型。 ⌋(SRS_LIBS_00005)
|
||
|
||
[SWS_Bfx_00222] ⌈ 库例程的实现和分组(相对于 C 文件)应按以下选项之一进行。⌋()
|
||
|
||
**选项 1**:`<Name>` 可以是函数名,每个函数一个 C 文件。
|
||
例如:`Bfx_setbit.c` 等。
|
||
|
||
**选项 2**:`<Name>` 可以是函数组的通用名称:
|
||
- 2.1 按对象族分组:例如 `Bfx_set.c`、`Bfx_get.c`
|
||
- 2.2 按例程族分组:例如 `Bfx_bit8.c`、`Bfx_bit16.c` 等
|
||
- 2.3 按其他方式分组:(允许自定义分组)
|
||
|
||
**选项 3**:可以省略 `<Name>`,使单个 C 文件包含所有 Bfx 函数,例如 `Bfx.c`。
|
||
|
||
使用以上选项可在减少 C 文件数量的同时灵活选择合适的粒度。根据工具链,按需链接(linking on demand)可能可行也可能不可行。
|
||
|
||
## 6 需求可追溯性
|
||
|
||
| 需求 | 描述 | 由以下需求满足 |
|
||
|------|------|----------------|
|
||
| SRS_BSW_00007 | 所有用 C 语言编写的 BSW 模块应符合 MISRA C 2012 标准。 | SWS_Bfx_00209 |
|
||
| SRS_BSW_00304 | 所有 AUTOSAR 基本软件模块应使用以下数据类型,而非原生 C 数据类型。 | SWS_Bfx_00212 |
|
||
| SRS_BSW_00348 | 所有 AUTOSAR 标准类型和常量应放置并组织在标准类型头文件中。 | SWS_Bfx_00213 |
|
||
| SRS_BSW_00378 | AUTOSAR 应提供 boolean 类型。 | SWS_Bfx_00212 |
|
||
| SRS_BSW_00407 | 每个 BSW 模块应提供读取专用模块实现版本信息的函数。 | SWS_Bfx_00302 |
|
||
| SRS_BSW_00411 | 所有 AUTOSAR 基本软件模块应应用 API 存在启用/禁用的命名规则。 | SWS_Bfx_00302 |
|
||
| SRS_BSW_00448 | 模块 SWS 不应包含来自其他模块的需求。 | SWS_Bfx_00999 |
|
||
| SRS_LIBS_00001 | 每个库函数的功能行为不应可配置。 | SWS_Bfx_00314 |
|
||
| SRS_LIBS_00002 | 库应在所有 BSW 模块和应用 SWC 之前可用。 | SWS_Bfx_00200 |
|
||
| SRS_LIBS_00003 | 库应在关闭之前保持可用。 | SWS_Bfx_00201 |
|
||
| SRS_LIBS_00005 | 每个库应提供一个具有其公共接口的头文件。 | SWS_Bfx_00220 |
|
||
| SRS_LIBS_00007 | 库的使用应记录在文档中。 | SWS_Bfx_00205 |
|
||
| SRS_LIBS_00013 | 由运行时输入参数值检查产生的错误情况应在 SWS 中列出。 | SWS_Bfx_00216 |
|
||
| SRS_LIBS_00015 | 应可以配置微控制器,使库代码在所有调用者之间共享。 | SWS_Bfx_00206 |
|
||
| SRS_LIBS_00017 | 应避免使用宏。 | SWS_Bfx_00207 |
|
||
| SRS_LIBS_00018 | 库函数只能调用库函数。 | SWS_Bfx_00203, SWS_Bfx_00208, SWS_Bfx_00217 |
|
||
|
||
## 7 功能规范
|
||
|
||
### 7.1 错误分类
|
||
|
||
[SWS_Bfx_00223] ⌈ 库不应支持错误分类定义——如 Det 错误 ID。 ⌋ ()
|
||
|
||
### 7.2 错误检测
|
||
|
||
[SWS_Bfx_00216] ⌈ 错误检测:函数应在运行时(无论在生产代码还是开发代码中)检查输入参数的值,特别是当错误值可能导致致命错误或不可预测结果的情况,前提是这些值在函数规范允许的范围内。所有错误情况应在 SWS 中列出,并且函数应返回 SWS 中规定的不可配置的值。该值取决于具体的函数和错误情况,因此逐个确定。如果传递给库例程的值不在有效范围内、超出边界条件或不符合函数规范,则库例程不检测此类错误。 ⌋(SRS_LIBS_00013)
|
||
|
||
### 7.3 错误通知
|
||
|
||
[SWS_Bfx_00217] ⌈ 库函数只能调用库函数:函数在出错时不应调用 DET。 ⌋(SRS_LIBS_00018)
|
||
|
||
### 7.4 初始化与关闭
|
||
|
||
[SWS_Bfx_00200] ⌈ Bfx 库不需要初始化阶段。库函数可在 ECU 初始化的最开始被调用,例如甚至可由 OS 或 EcuM 调用,因此库应就绪。 ⌋(SRS_LIBS_00002)
|
||
|
||
[SWS_Bfx_00201] ⌈ Bfx 库不需要关闭操作阶段。 ⌋(SRS_LIBS_00003)
|
||
|
||
### 7.5 使用库 API
|
||
|
||
[SWS_Bfx_00203] ⌈ Bfx API 可直接从 BSW 模块或 SWC 调用。无需端口定义。这是一种纯函数调用。 ⌋(SRS_LIBS_00018)
|
||
|
||
[SWS_Bfx_00205] ⌈ 库的使用应记录在文档中。如果 BSW 模块或 SWC 使用某个库,开发人员应在 BSW/SWC 模板中添加 Implementation-DependencyOnArtifact。`minVersion` 和 `maxVersion` 参数对应于供应商版本。对于 AUTOSAR 库,这些参数可以留空,因为 SWC 或 BSW 模块可以依赖库行为而非供应商实现。但是,SWC 或 BSW 模块应与其所集成的 AUTOSAR 平台兼容。 ⌋(SRS_LIBS_00007)
|
||
|
||
### 7.6 库实现
|
||
|
||
[SWS_Bfx_00206] ⌈ Bfx 库的实现方式应使代码可在不同内存分区中的调用者之间共享。 ⌋(SRS_LIBS_00015)
|
||
|
||
[SWS_Bfx_00207] ⌈ 在库的上下文中必须避免使用宏。库函数必须声明为函数或内联函数(inline),不应使用 `#define` 宏。 ⌋( SRS_LIBS_00017)
|
||
|
||
[SWS_Bfx_00208] ⌈ 库函数不应调用任何 BSW 模块的函数,例如 DET。库函数可以调用任何其他库函数,因为所有库函数都是可重入的,但 BSW 模块函数可能不可重入。 ⌋(SRS_LIBS_00018)
|
||
|
||
[SWS_Bfx_00209] ⌈ 用 C 语言编写的库应符合 MISRA C 标准。请参阅 SWS_BSW_00115 了解更多详情。 ⌋(SRS_BSW_00007)
|
||
|
||
[SWS_Bfx_00212] ⌈ 所有 AUTOSAR 库模块应使用 AUTOSAR 数据类型(整数、布尔)而非原生 C 数据类型,除非该库明确被标识为仅与某个平台兼容。 ⌋(SRS_BSW_00304, SRS_BSW_00378)
|
||
|
||
[SWS_Bfx_00213] ⌈ 所有 AUTOSAR 库模块应避免直接使用编译器和平台特定的关键字,除非该库明确被标识为仅与某个平台兼容。 ⌋(SRS_BSW_00348)
|
||
|
||
[SWS_Bfx_00214] ⌈ 所有位处理库模块应避免处理用户错误和超出指定范围的值。 ⌋()
|
||
|
||
## 8 API 规范
|
||
|
||
### 8.1 导入类型
|
||
|
||
本章列出从以下模块包含的所有类型:
|
||
|
||
| 头文件 | 导入类型 |
|
||
|--------|----------|
|
||
| Std_Types.h | boolean, sint8, uint8, sint16, uint16, sint32, uint32 |
|
||
|
||
我们注意到,由于 C 语言提供的整数类型的大小是实现定义的,因此每种整数类型可以表示的值范围将因实现而异。
|
||
|
||
因此,为了提高软件的可移植性,这些类型在 PlatformTypes.h [6] 中定义。库例程名称中使用以下助记符。
|
||
|
||
**注意:**
|
||
对于返回类型/参数类型为 boolean 的 API,命名约定采用 `_u8`,应解释为 `_b`(Boolean)。
|
||
如果返回类型/参数类型中不存在 boolean 数据类型,则 `_u8` 应解释为 `_u8` 本身。
|
||
|
||
| 大小 | 平台类型 | 助记符 |
|
||
|------|----------|--------|
|
||
| unsigned 8-Bit | boolean | u8 |
|
||
| 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 所示。
|
||
|
||
| 基本类型 | 范围 |
|
||
|----------|------|
|
||
| boolean | [TRUE, FALSE] |
|
||
| uint8 | [ 0, 255 ] |
|
||
| sint8 | [ -128, 127 ] |
|
||
| uint16 | [ 0, 65535 ] |
|
||
| sint16 | [ -32768, 32767 ] |
|
||
| uint32 | [ 0, 4294967295 ] |
|
||
| sint32 | [ -2147483648, 2147483647 ] |
|
||
|
||
**表 2:基本类型范围**
|
||
|
||
作为本文档其余部分的约定:
|
||
|
||
- 助记符将用于例程名称中(使用 `<InTypeMn1>` 表示输入 1 的类型助记符)
|
||
- 实际类型将用于例程原型的描述中(使用 `<InType>` 或 `<OutType>`)。
|
||
|
||
本文档的位寻址规则:
|
||
- 最低有效位(LSB)的位位置定义为 0(零)
|
||
- 位域长度定义为位的数量
|
||
|
||
### 8.2 类型定义
|
||
|
||
无。
|
||
|
||
### 8.3 关于目标优化的函数说明
|
||
|
||
本规范中描述的函数可作为常规函数或内联函数(inline)实现。
|
||
|
||
### 8.4 位函数定义
|
||
|
||
#### 8.4.1 Bfx_SetBit
|
||
|
||
[SWS_Bfx_00001] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_SetBit_<TypeMn>u8` |
|
||
| 语法 | `void Bfx_SetBit_<TypeMn>u8(<Type>* Data, uint8 BitPn)` |
|
||
| 服务 ID[hex] | 0x01 to 0x03 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `BitPn` 位位置 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应在请求的位位置将输入数据的逻辑状态设置为 '1'。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00002] ⌈ 预期功能:
|
||
|
||
```c
|
||
*Data = *Data | (0x01 << BitPn)
|
||
```
|
||
|
||
**例如:**
|
||
```c
|
||
Data = 10001010b
|
||
Bfx_SetBit_u8u8(&Data, 2)
|
||
Data 将被更新为 10001110b
|
||
```
|
||
|
||
⌋()
|
||
|
||
[SWS_Bfx_00008] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | BitPn 最大值 |
|
||
|--------------|----------|--------------|
|
||
| 0x001 | `void Bfx_SetBit_u8u8(uint8*, uint8)` | 7 |
|
||
| 0x002 | `void Bfx_SetBit_u16u8(uint16*, uint8)` | 15 |
|
||
| 0x003 | `void Bfx_SetBit_u32u8(uint32*, uint8)` | 31 |
|
||
| 0x004 | `void Bfx_SetBit_u64u8(uint64*, uint8)` | 63 |
|
||
|
||
⌋
|
||
|
||
#### 8.4.2 Bfx_ClrBit
|
||
|
||
[SWS_Bfx_00010] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_ClrBit_<TypeMn>u8` |
|
||
| 语法 | `void Bfx_ClrBit_<TypeMn>u8(<Type>* Data, uint8 BitPn)` |
|
||
| 服务 ID[hex] | 0x06 to 0x08 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `BitPn` 位位置 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应在请求的位位置将输入数据的逻辑状态清除为 '0'。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00011] ⌈ 预期功能:
|
||
|
||
```c
|
||
*Data = (*Data & ~(0x01 << BitPn))
|
||
```
|
||
|
||
**例如:**
|
||
```c
|
||
Data = 10001010b
|
||
Bfx_ClrBit_u8u8(&Data, 1)
|
||
Data 将被更新为 10001000b
|
||
```
|
||
|
||
⌋()
|
||
|
||
[SWS_Bfx_00015] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | BitPn 最大值 |
|
||
|--------------|----------|--------------|
|
||
| 0x006 | `void Bfx_ClrBit_u8u8(uint8*, uint8)` | 7 |
|
||
| 0x007 | `void Bfx_ClrBit_u16u8(uint16*, uint8)` | 15 |
|
||
| 0x008 | `void Bfx_ClrBit_u32u8(uint32*, uint8)` | 31 |
|
||
| 0x009 | `void Bfx_ClrBit_u64u8(uint64*, uint8)` | 63 |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.3 Bfx_GetBit
|
||
|
||
[SWS_Bfx_00016] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_GetBit_<InTypeMn>u8_u8` |
|
||
| 语法 | `boolean Bfx_GetBit_<InTypeMn>u8_u8(<InType> Data, uint8 BitPn)` |
|
||
| 服务 ID[hex] | 0x0a to 0x0c |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `Data` 输入数据;`BitPn` 位位置 |
|
||
| 参数 (in-out) | 无 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | `boolean` 位状态 |
|
||
| 描述 | 此函数应返回请求位位置上输入数据的逻辑状态。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00017] ⌈
|
||
|
||
```c
|
||
Result = TRUE, ((Data & (0x01 << BitPn)) != 0)
|
||
Result = FALSE, 其他情况
|
||
```
|
||
|
||
**例如:**
|
||
```c
|
||
Bfx_GetBit_u8u8(10001010b, 1) 返回 TRUE
|
||
```
|
||
|
||
⌋()
|
||
|
||
[SWS_Bfx_00020] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | BitPn 最大值 |
|
||
|--------------|----------|--------------|
|
||
| 0x00A | `boolean Bfx_GetBit_u8u8_u8(uint8, uint8)` | 7 |
|
||
| 0x00B | `boolean Bfx_GetBit_u16u8_u8(uint16, uint8)` | 15 |
|
||
| 0x00C | `boolean Bfx_GetBit_u32u8_u8(uint32, uint8)` | 31 |
|
||
| 0x00D | `boolean Bfx_GetBit_u64u8_u8(uint64, uint8)` | 63 |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.4 Bfx_SetBits
|
||
|
||
[SWS_Bfx_00021] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_SetBits_<TypeMn>u8u8u8` |
|
||
| 语法 | `void Bfx_SetBits_<TypeMn>u8u8u8(<Type>* Data, uint8 BitStartPn, uint8 BitLn, uint8 Status)` |
|
||
| 服务 ID[hex] | 0x20 to 0x22 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `BitStartPn` 起始位位置;`BitLn` 位域长度;`Status` 状态值 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应根据 `Status` 值将输入数据从 `BitStartPn` 开始的长度为 `BitLn` 的位设置为 '1' 或 '0'。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00022] ⌈
|
||
|
||
```
|
||
15 14 13 12 11 10 9 ... 2 1 0
|
||
1 1 1 0 1 0 0 ... 0 0 0
|
||
<BitStartPn>
|
||
< BitLn >
|
||
```
|
||
|
||
**例如:**
|
||
```c
|
||
Data = 1110100000000111b
|
||
Bfx_SetBits_u16u8u8u8(&Data, 5, 5, 1)
|
||
Data 将被更新为 1110101111100111b
|
||
```
|
||
|
||
⌋()
|
||
|
||
[SWS_Bfx_00025] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | BitLn 最大值 | BitStartPn 最大值 | BitStartPn + BitLn 最大值 |
|
||
|--------------|----------|--------------|-------------------|---------------------------|
|
||
| 0x020 | `void Bfx_SetBits_u8u8u8u8(uint8*, uint8, uint8, uint8)` | 8 | 7 | 8 |
|
||
| 0x021 | `void Bfx_SetBits_u16u8u8u8(uint16*, uint8, uint8, uint8)` | 16 | 15 | 16 |
|
||
| 0x022 | `void Bfx_SetBits_u32u8u8u8(uint32*, uint8, uint8, uint8)` | 32 | 31 | 32 |
|
||
| 0x023 | `void Bfx_SetBits_u64u8u8u8(uint64*, uint8, uint8, uint8)` | 64 | 63 | 64 |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.5 Bfx_GetBits
|
||
|
||
[SWS_Bfx_00028] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_GetBits_<TypeMn>u8u8_<TypeMn>` |
|
||
| 语法 | `<Type> Bfx_GetBits_<TypeMn>u8u8_<TypeMn>(<Type> Data, uint8 BitStartPn, uint8 BitLn)` |
|
||
| 服务 ID[hex] | 0x26 to 0x28 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `Data` 输入数据;`BitStartPn` 起始位位置;`BitLn` 位域长度 |
|
||
| 参数 (in-out) | 无 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | `<Type>` 位域序列 |
|
||
| 描述 | 此函数应返回输入数据从 `BitStartPn` 开始的长度为 `BitLn` 的位。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00029] ⌈
|
||
|
||
```
|
||
15 14 13 12 11 10 9 ... 2 1 0
|
||
1 1 1 0 1 0 0 ... 0 1 1
|
||
BitStartPn
|
||
< BitLn >
|
||
```
|
||
|
||
**例如:**
|
||
```c
|
||
Bfx_GetBits_u16u8u8_u16(1110100000000111b, 9, 5) 返回 0000000000010100b
|
||
```
|
||
|
||
⌋()
|
||
|
||
[SWS_Bfx_00034] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | BitLn 最大值 | BitStartPn 最大值 | BitStartPn + BitLn 最大值 |
|
||
|--------------|----------|--------------|-------------------|---------------------------|
|
||
| 0x026 | `uint8 Bfx_GetBits_u8u8u8_u8(uint8, uint8, uint8)` | 8 | 7 | 8 |
|
||
| 0x027 | `uint16 Bfx_GetBits_u16u8u8_u16(uint16, uint8, uint8)` | 16 | 15 | 16 |
|
||
| 0x028 | `uint32 Bfx_GetBits_u32u8u8_u32(uint32, uint8, uint8)` | 32 | 31 | 32 |
|
||
| 0x029 | `uint64 Bfx_GetBits_u64u8u8_u64(uint64, uint8, uint8)` | 64 | 63 | 64 |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.6 Bfx_SetBitMask
|
||
|
||
[SWS_Bfx_00035] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_SetBitMask_<TypeMn><TypeMn>` |
|
||
| 语法 | `void Bfx_SetBitMask_<TypeMn><TypeMn>(<Type>* Data, <Type> Mask)` |
|
||
| 服务 ID[hex] | 0x2a to 0x2c |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `Mask` 用于设置位的掩码 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应根据掩码中相应位为 1 时将数据设置为逻辑状态 '1',其余位保持原值。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00036] ⌈ 预期功能:
|
||
```c
|
||
*Data = *Data | Mask
|
||
```
|
||
⌋()
|
||
|
||
[SWS_Bfx_00038] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x02A | `void Bfx_SetBitMask_u8u8(uint8*, uint8)` |
|
||
| 0x02B | `void Bfx_SetBitMask_u16u16(uint16*, uint16)` |
|
||
| 0x02C | `void Bfx_SetBitMask_u32u32(uint32*, uint32)` |
|
||
| 0x02D | `void Bfx_SetBitMask_u64u64(uint64*, uint64)` |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.7 Bfx_ClrBitMask
|
||
|
||
[SWS_Bfx_00039] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_ClrBitMask_<TypeMn><TypeMn>` |
|
||
| 语法 | `void Bfx_ClrBitMask_<TypeMn><TypeMn>(<Type>* Data, <Type> Mask)` |
|
||
| 服务 ID[hex] | 0x30 to 0x32 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `Mask` 掩码值 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应根据掩码将输入数据所有相应位的逻辑状态清除为 '0'。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00040] ⌈ 此函数应根据相应掩码位为 1 时将数据清除为逻辑状态 '0',其余位保持原值。预期功能:
|
||
```c
|
||
*Data = *Data & ~Mask
|
||
```
|
||
⌋()
|
||
|
||
[SWS_Bfx_00045] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x030 | `void Bfx_ClrBitMask_u8u8(uint8*, uint8)` |
|
||
| 0x031 | `void Bfx_ClrBitMask_u16u16(uint16*, uint16)` |
|
||
| 0x032 | `void Bfx_ClrBitMask_u32u32(uint32*, uint32)` |
|
||
| 0x033 | `void Bfx_ClrBitMask_u64u64(uint64*, uint64)` |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.8 Bfx_TstBitMask
|
||
|
||
[SWS_Bfx_00046] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_TstBitMask_<InTypeMn><InTypeMn>_u8` |
|
||
| 语法 | `boolean Bfx_TstBitMask_<InTypeMn><InTypeMn>_u8(<InType> Data, <InType> Mask)` |
|
||
| 服务 ID[hex] | 0x36 to 0x38 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `Data` 输入数据;`Mask` 掩码值 |
|
||
| 参数 (in-out) | 无 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | `boolean` 值 |
|
||
| 描述 | 如果输入数据 Data 中 Mask 值所定义的所有位均被设置,则此函数应返回 TRUE。其他所有情况下,此函数应返回 FALSE。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00047] ⌈
|
||
```c
|
||
Result = TRUE, ((Data & Mask) == Mask)
|
||
Result = FALSE, 其他所有情况
|
||
```
|
||
**例如:**
|
||
```c
|
||
Bfx_TstBitMask_u8u8_u8(10010011b, 10010000b) 返回 TRUE
|
||
```
|
||
|
||
[SWS_Bfx_00050] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x036 | `boolean Bfx_TstBitMask_u8u8_u8(uint8, uint8)` |
|
||
| 0x037 | `boolean Bfx_TstBitMask_u16u16_u8(uint16, uint16)` |
|
||
| 0x038 | `boolean Bfx_TstBitMask_u32u32_u8(uint32, uint32)` |
|
||
| 0x039 | `boolean Bfx_TstBitMask_u64u64_u8(uint64, uint64)` |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.9 Bfx_TstBitLnMask
|
||
|
||
[SWS_Bfx_00051] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_TstBitLnMask_<InTypeMn><InTypeMn>_u8` |
|
||
| 语法 | `boolean Bfx_TstBitLnMask_<InTypeMn><InTypeMn>_u8(<InType> Data, <InType> Mask)` |
|
||
| 服务 ID[hex] | 0x3a to 0x3c |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `Data` 输入数据;`Mask` 掩码值 |
|
||
| 参数 (in-out) | 无 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | `boolean` 数据 |
|
||
| 描述 | 此函数对输入数据进行测试,如果根据掩码至少有一位被设置,则函数返回 TRUE,否则返回 FALSE。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00055] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x03A | `boolean Bfx_TstBitLnMask_u8u8_u8(uint8, uint8)` |
|
||
| 0x03B | `boolean Bfx_TstBitLnMask_u16u16_u8(uint16, uint16)` |
|
||
| 0x03C | `boolean Bfx_TstBitLnMask_u32u32_u8(uint32, uint32)` |
|
||
| 0x03D | `boolean Bfx_TstBitLnMask_u64u64_u8(uint64, uint64)` |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.10 Bfx_TstParityEven
|
||
|
||
[SWS_Bfx_00056] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_TstParityEven_<InTypeMn>_u8` |
|
||
| 语法 | `boolean Bfx_TstParityEven_<InTypeMn>_u8(<InTypeMn> Data)` |
|
||
| 服务 ID[hex] | 0x40 to 0x42 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `Data` 输入数据 |
|
||
| 参数 (in-out) | 无 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | `boolean` 状态 |
|
||
| 描述 | 此函数测试设置为 1 的位数。如果此数字为偶数,则返回 TRUE;否则返回 FALSE。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00060] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x040 | `boolean Bfx_TstParityEven_u8_u8(uint8)` |
|
||
| 0x041 | `boolean Bfx_TstParityEven_u16_u8(uint16)` |
|
||
| 0x042 | `boolean Bfx_TstParityEven_u32_u8(uint32)` |
|
||
| 0x043 | `boolean Bfx_TstParityEven_u64_u8(uint64)` |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.11 Bfx_ToggleBits
|
||
|
||
[SWS_Bfx_00061] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_ToggleBits_<TypeMn>` |
|
||
| 语法 | `void Bfx_ToggleBits_<TypeMn>(<Type>* Data)` |
|
||
| 服务 ID[hex] | 0x46 to 0x48 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | 无 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数切换数据的所有位(1 的补码)。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00065] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x046 | `void Bfx_ToggleBits_u8(uint8*)` |
|
||
| 0x047 | `void Bfx_ToggleBits_u16(uint16*)` |
|
||
| 0x048 | `void Bfx_ToggleBits_u32(uint32*)` |
|
||
| 0x049 | `void Bfx_ToggleBits_u64(uint64*)` |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.12 Bfx_ToggleBitMask
|
||
|
||
[SWS_Bfx_00066] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_ToggleBitMask_<TypeMn><TypeMn>` |
|
||
| 语法 | `void Bfx_ToggleBitMask_<TypeMn><TypeMn>(<Type>* Data, <Type> Mask)` |
|
||
| 服务 ID[hex] | 0x4a to 0x4c |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `Mask` 掩码 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 当掩码中相应的位启用并设置为 1 时,此函数切换数据的位。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00069] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x04A | `void Bfx_ToggleBitMask_u8u8(uint8*, uint8)` |
|
||
| 0x04B | `void Bfx_ToggleBitMask_u16u16(uint16*, uint16)` |
|
||
| 0x04C | `void Bfx_ToggleBitMask_u32u32(uint32*, uint32)` |
|
||
| 0x04D | `void Bfx_ToggleBitMask_u64u64(uint64*, uint64)` |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.13 Bfx_ShiftBitRt
|
||
|
||
[SWS_Bfx_00070] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_ShiftBitRt_<TypeMn>u8` |
|
||
| 语法 | `void Bfx_ShiftBitRt_<TypeMn>u8(<Type>* Data, uint8 ShiftCnt)` |
|
||
| 服务 ID[hex] | 0x50 to 0x52 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `ShiftCnt` 右移位数 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应将数据右移 ShiftCnt 位。最高有效位(最左位)由 '0' 位替换,最低有效位(最右位)在每个单次位移循环中被丢弃。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00075] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | ShiftCnt 最大值 |
|
||
|--------------|----------|-----------------|
|
||
| 0x050 | `void Bfx_ShiftBitRt_u8u8(uint8*, uint8)` | 7 |
|
||
| 0x051 | `void Bfx_ShiftBitRt_u16u8(uint16*, uint8)` | 15 |
|
||
| 0x052 | `void Bfx_ShiftBitRt_u32u8(uint32*, uint8)` | 31 |
|
||
| 0x053 | `void Bfx_ShiftBitRt_u64u8(uint64*, uint8)` | 63 |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.14 Bfx_ShiftBitLt
|
||
|
||
[SWS_Bfx_00076] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_ShiftBitLt_<TypeMn>u8` |
|
||
| 语法 | `void Bfx_ShiftBitLt_<TypeMn>u8(<Type>* Data, uint8 ShiftCnt)` |
|
||
| 服务 ID[hex] | 0x56 to 0x58 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `ShiftCnt` 左移位数 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应将数据左移 ShiftCnt 位。最低有效位(最右位)由 '0' 位替换,最高有效位(最左位)在每个单次位移循环中被丢弃。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
[SWS_Bfx_00080] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | ShiftCnt 最大值 |
|
||
|--------------|----------|-----------------|
|
||
| 0x056 | `void Bfx_ShiftBitLt_u8u8(uint8*, uint8)` | 7 |
|
||
| 0x057 | `void Bfx_ShiftBitLt_u16u8(uint16*, uint8)` | 15 |
|
||
| 0x058 | `void Bfx_ShiftBitLt_u32u8(uint32*, uint8)` | 31 |
|
||
| 0x059 | `void Bfx_ShiftBitLt_u64u8(uint64*, uint8)` | 63 |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.15 Bfx_RotBitRt
|
||
|
||
[SWS_Bfx_00086] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_RotBitRt_<TypeMn>u8` |
|
||
| 语法 | `void Bfx_RotBitRt_<TypeMn>u8(<Type>* Data, uint8 ShiftCnt)` |
|
||
| 服务 ID[hex] | 0x5a to 0x5c |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `ShiftCnt` 移位次数 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应将数据右旋转 ShiftCnt 位。在每个单次位移循环中,最低有效位被循环到最高有效位位置。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
**例如:**
|
||
- 如果 `ShiftCnt = 1`,则:
|
||
- `uint8 Data = 0001 0111`(右旋转前)
|
||
- `Data = 1000 1011`(右旋转后)
|
||
|
||
- 如果 `ShiftCnt = 3`,则:
|
||
- `uint8 Data = 0001 0111`(右旋转前)
|
||
- `Data = 1110 0010`(右旋转后)
|
||
|
||
[SWS_Bfx_00090] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | ShiftCnt 最大值 |
|
||
|--------------|----------|-----------------|
|
||
| 0x05A | `void Bfx_RotBitRt_u8u8(uint8*, uint8)` | 7 |
|
||
| 0x05B | `void Bfx_RotBitRt_u16u8(uint16*, uint8)` | 15 |
|
||
| 0x05C | `void Bfx_RotBitRt_u32u8(uint32*, uint8)` | 31 |
|
||
| 0x05D | `void Bfx_RotBitRt_u64u8(uint64*, uint8)` | 63 |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.16 Bfx_RotBitLt
|
||
|
||
[SWS_Bfx_00095] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_RotBitLt_<TypeMn>u8` |
|
||
| 语法 | `void Bfx_RotBitLt_<TypeMn>u8(<Type>* Data, uint8 ShiftCnt)` |
|
||
| 服务 ID[hex] | 0x60 to 0x62 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `ShiftCnt` 移位次数 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应将数据左旋转 ShiftCnt 位。在每个单次位移循环中,最高有效位被循环到最低有效位位置。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
**例如:**
|
||
- 如果 `ShiftCnt = 1`,则:
|
||
- `uint8 Data = 1011 0111`(左旋转前)
|
||
- `Data = 0110 1111`(左旋转后)
|
||
|
||
- 如果 `ShiftCnt = 3`,则:
|
||
- `uint8 Data = 1011 0111`(左旋转前)
|
||
- `Data = 1011 1101`(左旋转后)
|
||
|
||
[SWS_Bfx_00098] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | ShiftCnt 最大值 |
|
||
|--------------|----------|-----------------|
|
||
| 0x060 | `void Bfx_RotBitLt_u8u8(uint8*, uint8)` | 7 |
|
||
| 0x061 | `void Bfx_RotBitLt_u16u8(uint16*, uint8)` | 15 |
|
||
| 0x062 | `void Bfx_RotBitLt_u32u8(uint32*, uint8)` | 31 |
|
||
| 0x063 | `void Bfx_RotBitLt_u64u8(uint64*, uint8)` | 63 |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.17 Bfx_CopyBit
|
||
|
||
[SWS_Bfx_00101] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_CopyBit_<TypeMn>u8<TypeMn>u8` |
|
||
| 语法 | `void Bfx_CopyBit_<TypeMn>u8<TypeMn>u8(<Type>* DestinationData, uint8 DestinationPosition, <Type> SourceData, uint8 SourcePosition)` |
|
||
| 服务 ID[hex] | 0x66 to 0x68 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `DestinationPosition` 目标位置;`SourceData` 源数据;`SourcePosition` 源位置 |
|
||
| 参数 (in-out) | `DestinationData` 目标数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应将源数据中指定位位置的位复制到目标数据的指定位位置。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
**例如:**
|
||
```c
|
||
DestinationData = 10100001b
|
||
BFX_CopyBit_u8u8u8u8(&DestinationData, 6, 11011010, 1)
|
||
DestinationData 将变为 11100001b
|
||
```
|
||
|
||
[SWS_Bfx_00108] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | SourcePosition 和 DestinationPosition 最大值 |
|
||
|--------------|----------|-----------------------------------------------|
|
||
| 0x066 | `void Bfx_CopyBit_u8u8u8u8(uint8*, uint8, uint8, uint8)` | 7 |
|
||
| 0x067 | `void Bfx_CopyBit_u16u8u16u8(uint16*, uint8, uint16, uint8)` | 15 |
|
||
| 0x068 | `void Bfx_CopyBit_u32u8u32u8(uint32*, uint8, uint32, uint8)` | 31 |
|
||
| 0x069 | `void Bfx_CopyBit_u64u8u64u8(uint64*, uint8, uint64, uint8)` | 63 |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.18 Bfx_PutBits
|
||
|
||
[SWS_Bfx_00110] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_PutBits_<TypeMn>u8u8<TypeMn>` |
|
||
| 语法 | `void Bfx_PutBits_<TypeMn>u8u8<TypeMn>(<Type>* Data, uint8 BitStartPn, uint8 BitLn, <Type> Pattern)` |
|
||
| 服务 ID[hex] | 0x70 to 0x72 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `BitStartPn` 起始位位置;`BitLn` 位域长度;`Pattern` 要设置的模式 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应按照 Pattern 所述将位放入输入数据中,从指定位位置开始。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
**例如:**
|
||
```c
|
||
Data = 11110000b
|
||
Bfx_PutBits_u8u8u8u8(&Data, 1, 3, 00000011b)
|
||
Data 将变为 11110110b
|
||
```
|
||
|
||
[SWS_Bfx_00112] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | BitLn 最大值 | BitStartPn 最大值 | BitStartPn + BitLn 最大值 |
|
||
|--------------|----------|--------------|-------------------|---------------------------|
|
||
| 0x070 | `void Bfx_PutBits_u8u8u8u8(uint8*, uint8, uint8, uint8)` | 8 | 7 | 8 |
|
||
| 0x071 | `void Bfx_PutBits_u16u8u8u16(uint16*, uint8, uint8, uint16)` | 16 | 15 | 16 |
|
||
| 0x072 | `void Bfx_PutBits_u32u8u8u32(uint32*, uint8, uint8, uint32)` | 32 | 31 | 32 |
|
||
| 0x073 | `void Bfx_PutBits_u64u8u8u64(uint64*, uint8, uint8, uint64)` | 64 | 63 | 64 |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.19 Bfx_PutBitsMask
|
||
|
||
[SWS_Bfx_00120] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_PutBitsMask_<TypeMn><TypeMn><TypeMn>` |
|
||
| 语法 | `void Bfx_PutBitsMask_<TypeMn><TypeMn><TypeMn>(<Type>* Data, <Type> Pattern, <Type> Mask)` |
|
||
| 服务 ID[hex] | 0x80 to 0x82 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `Pattern` 要设置的模式;`Mask` 掩码值 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应将 Pattern 中定义且对应 Mask 位设置为 1 的所有位放入输入数据中。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
**例如:**
|
||
```c
|
||
Bfx_PutBitsMask_u8u8u8(11100000b, 11001101b, 00001111b)
|
||
结果为 *Data = 11101101b
|
||
```
|
||
|
||
[SWS_Bfx_00124] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 |
|
||
|--------------|----------|
|
||
| 0x080 | `void Bfx_PutBitsMask_u8u8u8(uint8*, uint8, uint8)` |
|
||
| 0x081 | `void Bfx_PutBitsMask_u16u16u16(uint16*, uint16, uint16)` |
|
||
| 0x082 | `void Bfx_PutBitsMask_u32u32u32(uint32*, uint32, uint32)` |
|
||
| 0x083 | `void Bfx_PutBitsMask_u64u64u64(uint64*, uint64, uint64)` |
|
||
|
||
⌋()
|
||
|
||
#### 8.4.20 Bfx_PutBit
|
||
|
||
[SWS_Bfx_00130] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_PutBit_<TypeMn>u8u8` |
|
||
| 语法 | `void Bfx_PutBit_<TypeMn>u8u8(<Type>* Data, uint8 BitPn, boolean Status)` |
|
||
| 服务 ID[hex] | 0x85 to 0x87 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | `BitPn` 位位置;`Status` 状态值 |
|
||
| 参数 (in-out) | `Data` 输入数据指针 |
|
||
| 参数 (out) | 无 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 此函数应根据 `Status` 值将输入数据中由 BitPn 指定的位更新为 '1' 或 '0'。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ ()
|
||
|
||
**例如:**
|
||
```c
|
||
uint8 InputData = 11100111b;
|
||
Bfx_PutBit_u8u8u8(&InputData, 4, TRUE);
|
||
结果为 InputData = 11110111b
|
||
```
|
||
|
||
[SWS_Bfx_00132] ⌈ 已实现函数列表:
|
||
|
||
| 函数 ID[hex] | 函数原型 | BitPn 最大值 |
|
||
|--------------|----------|--------------|
|
||
| 0x085 | `void Bfx_PutBit_u8u8u8(uint8*, uint8, boolean)` | 7 |
|
||
| 0x086 | `void Bfx_PutBit_u16u8u8(uint16*, uint8, boolean)` | 15 |
|
||
| 0x087 | `void Bfx_PutBit_u32u8u8(uint32*, uint8, boolean)` | 31 |
|
||
| 0x088 | `void Bfx_PutBit_u64u8u8(uint64*, uint8, boolean)` | 63 |
|
||
|
||
⌋()
|
||
|
||
### 8.5 回调通知
|
||
|
||
无。
|
||
|
||
### 8.6 调度函数
|
||
|
||
Bfx 库没有调度函数。
|
||
|
||
### 8.7 预期接口
|
||
|
||
无。
|
||
|
||
#### 8.7.1 强制接口
|
||
|
||
无。
|
||
|
||
#### 8.7.2 可选接口
|
||
|
||
无。
|
||
|
||
#### 8.7.3 可配置接口
|
||
|
||
无。
|
||
|
||
### 8.8 版本 API
|
||
|
||
#### 8.8.1 Bfx_GetVersionInfo
|
||
|
||
[SWS_Bfx_00301] ⌈
|
||
|
||
| 项 | 内容 |
|
||
|----|------|
|
||
| 服务名称 | `Bfx_GetVersionInfo` |
|
||
| 语法 | `void Bfx_GetVersionInfo(Std_VersionInfoType* Versioninfo)` |
|
||
| 服务 ID[hex] | 0xff |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 可重入 |
|
||
| 参数 (in) | 无 |
|
||
| 参数 (in-out) | 无 |
|
||
| 参数 (out) | `Versioninfo` 指向存储此模块版本信息的位置。格式符合 [BSW00321]。 |
|
||
| 返回值 | 无 |
|
||
| 描述 | 返回此库的版本信息。 |
|
||
| 通过 | Bfx.h |
|
||
|
||
⌋ () BSW 模块的版本信息通常包含:
|
||
|
||
- Module Id(模块 ID)
|
||
- Vendor Id(供应商 ID)
|
||
- Vendor specific version numbers(供应商特定版本号)
|
||
|
||
[SWS_Bfx_00302] ⌈ 如果 Bfx_GetVersionInfo 的调用方和被调用方的源代码都可用,Bfx 库应将 Bfx_GetVersionInfo 实现为模块头文件中定义的宏。 ⌋( SRS_BSW_00407, SRS_BSW_00411)
|
||
|
||
## 9 时序图
|
||
|
||
不适用。
|
||
|
||
## 10 配置规范
|
||
|
||
### 10.1 发布信息
|
||
|
||
[SWS_Bfx_00133] ⌈ 如 [3] 中 SRS_BSW_00402 要求的标准化通用发布参数,应在本模块的头文件中发布,并需要在 BSW 模块描述中提供。相应的模块缩写可在 [1] 基本软件模块列表中找到。 ⌋()
|
||
|
||
其他模块特定的发布参数(如果适用)将在下面列出。
|
||
|
||
### 10.2 配置选项
|
||
|
||
[SWS_Bfx_00314] ⌈ Bfx 库不应具有任何可能影响例程功能行为的配置选项。即对于给定的输入参数集合,输出应始终相同。例如,出错时返回的值不应可配置。 ⌋(SRS_LIBS_00001)
|
||
|
||
但是,库供应商被允许添加与库实现相关的特定配置选项,例如用于资源消耗优化。
|
||
|
||
## 11 不适用的需求
|
||
|
||
[SWS_Bfx_00999] ⌈ 这些需求不适用于本规范。 ⌋ (SRS_BSW_00448)
|
||
|
||
---
|
||
|
||
## 翻译说明
|
||
|
||
1. 本文档为 AUTOSAR CP Release 4.4.0 的 BFX 库软件规范(SWS)。
|
||
2. 所有 API 标识符(如 `Bfx_SetBit_u8u8`、`Bfx_GetBit_u32u8_u8` 等)保留英文原名。
|
||
3. 数据类型(`uint8`、`uint16`、`uint32`、`sint8`、`sint16`、`sint32`、`boolean`)保留英文原名。
|
||
4. 需求 ID(如 `SWS_Bfx_00001`)保留原样。
|
||
5. 章节中包含的所有 C 代码片段按原文翻译并保留格式。
|
||
6. AUTOSAR 方框符 `⌈⌋` 已保留。
|
||
7. 本文档所有 20 个位函数(Bfx_SetBit 至 Bfx_PutBit)均已完整翻译。
|