这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
cc2640r2f:ble_throughput [2017/08/31 16:30] 127.0.0.1 外部编辑 |
cc2640r2f:ble_throughput [2021/06/22 23:14] (当前版本) |
||
---|---|---|---|
行 3: | 行 3: | ||
## 介绍 ## | ## 介绍 ## | ||
- | 本章分别测试了TI CC2640R2F | + | 本章分别测试了 TI CC2640R2F |
该工程中进行了一些修改以方便进行吞吐量测试: | 该工程中进行了一些修改以方便进行吞吐量测试: | ||
- | - 改变项目MTU大小 | + | - 改变项目 MTU 大小 |
- 通过消息计数器发送通知 | - 通过消息计数器发送通知 | ||
- | - 增加Throughput配置文件 | + | - 增加 Throughput 配置文件 |
- 增加按键菜单 | - 增加按键菜单 | ||
## 硬件环境 ## | ## 硬件环境 ## | ||
- | 使用USB连接< | + | 使用 USB 连接 <a href="http://docs.leconiot.com/doku.php? |
![](http:// | ![](http:// | ||
## 参数修改 ## | ## 参数修改 ## | ||
- | 基本思想是不断发送GATT通知,尽可能减少开销,尽可能减少停机时间。以下参数在增加吞吐量时必须加以考虑。 | + | 基本思想是不断发送 GATT 通知,尽可能减少开销,尽可能减少停机时间。 |
+ | 以下参数在增加吞吐量时必须加以考虑: | ||
### ATT_MTU大小 ### | ### ATT_MTU大小 ### | ||
- | 有关最大传输单元(ATT_MTU)的说明,请参见< | + | 有关最大传输单元(ATT_MTU)的说明,请参见 <a href="http://docs.leconiot.com/doku.php? |
- | 这里定义6个Tx缓冲区,每个缓冲区251字节。用户应用程序应该根据自身堆栈情况进行分配。如果没有足够的堆栈,可以通过减少`MAX_NUM_PDU`,这样可能导致吞吐量的损失。实际使用中的最坏情况是`MAX_NUM_PDU`和`MAX_PDU_SIZE`的乘积。设计人员应该根据设备的可用内存来平衡这些参数。 | + | 这里定义 6 个Tx缓冲区,每个缓冲区 251 字节。用户应用程序应根据自身堆栈情况进行分配。如果没有足够的堆栈,可以减少 `MAX_NUM_PDU` ,但这样可能导致吞吐量的损失。实际使用中的最坏情况是 `MAX_NUM_PDU` 和 `MAX_PDU_SIZE` 的乘积,即缺乏堆栈时能减少的最大值。设计人员应该根据设备的可用内存来平衡这些参数。 |
````C | ````C | ||
#define MAX_NUM_PDU | #define MAX_NUM_PDU | ||
#define MAX_PDU_SIZE | #define MAX_PDU_SIZE | ||
```` | ```` | ||
- | > 注意:最好在options-> | + | > 注意:最好在 options-> |
- | > 注意:MTU更新过程在连接之后主机自动发起和从机进行协商。选择双方支持最大MTU。 | + | > 注意:MTU 更新过程在连接之后主机自动发起和从机进行协商。选择双方支持最大 MTU。 |
### LE 2M PHY ### | ### LE 2M PHY ### | ||
- | 这里使用2M PHY,使每个连接事件期间从PHY发送的数据增加一倍(需要连接之后通过按键菜单自行选择)。 | + | 这里使用 2M PHY,使每个连接事件期间从 PHY 发送的数据增加一倍(需要连接之后通过按键菜单自行选择)。 |
- | ### LE数据长度拓展 ### | + | ### LE 数据长度拓展 ### |
- | 在蓝牙4.2规范中允许控制器发送最多251个字节的单个数据包。这与以前的27个字节相比大大增加了吞吐量。此功能称为数据长度拓展。有关这方面详细介绍请参考< | + | 在蓝牙 4.2 规范中允许控制器发送最多 251 个字节的单个数据包,这与以前的 27 个字节相比大大增加了吞吐量,此功能称为数据长度拓展。有关这方面详细介绍请参考 <a href="http://docs.leconiot.com/doku.php? |
- | 下面的PDU更新过程的代码片段可以在`throughput_peripheral.c`文件中找到 | + | 下面的 PDU 更新过程的代码片段可以在 `throughput_peripheral.c` 文件中找到 |
````C | ````C | ||
// | // | ||
行 59: | 行 60: | ||
### 连接间隔 ### | ### 连接间隔 ### | ||
- | 根据前后处理数量,控制器需要2-3ms来准备下一个连接事件。因此更长的连接间隔可以提高吞吐量。由于使用notify方式传输,更高的连接间隔意味着连接事件减少。此示例将使用100ms的连接间隔,请注意,在实际情况下更高的连接间隔有着明显的缺点:由于射频干扰导致的连接事件将大大降低吞吐量。因此用户需要根据所需吞吐量进行权衡。当连接间隔大于100ms后,吞吐量将不会增加。 | + | 根据前后处理数量,控制器需要 2-3ms 来准备下一个连接事件,因此更长的连接间隔可以提高吞吐量。由于使用 notify 方式传输,增加连接间隔意味着连接事件减少。此示例将使用 100ms 的连接间隔,在实际情况下增加连接间隔有着明显的缺点:由于射频干扰导致的连接事件将大大降低吞吐量。因此用户需要根据所需吞吐量进行权衡,当连接间隔大于 100ms 后,吞吐量将不会增加。 |
### 通知排队 ### | ### 通知排队 ### | ||
- | 这段代码设计能保证队列中始终有需要发送的数据,以便在通知开始时不会处于饥饿状态。 | + | 这段代码设计能保证队列中始终有需要发送的数据,避免在通知开始时处于饥饿状态。 |
````C | ````C | ||
// | // | ||
行 104: | 行 105: | ||
} | } | ||
```` | ```` | ||
- | 本代码仅为最大吞吐量测试,在实际应用中,由于其他处理需求,应用程序可能无法维持此吞吐量(例如必须通过串口传输有效数据负载)。此外`blastData`函数最大限度的增加了数据的排队,因此`GATT_Notification`会返回非SUCCESS状态,例如队列已满时的`blePending`。Tx队列的深度由上面定义的`MAX_NUM_PDU`决定。 | + | 本代码仅为最大吞吐量测试,在实际应用中,由于其他处理需求,应用程序可能无法维持此吞吐量(例如必须通过串口传输有效数据负载)。此外 `blastData` 函数最大限度的增加了数据的排队,因此 `GATT_Notification` 会返回非 SUCCESS 状态,例如队列已满时的 `blePending`。Tx 队列的深度由 `MAX_NUM_PDU` 决定。 |
## 分组开销 ## | ## 分组开销 ## | ||
- | 主机和从机的有效数据载荷已经被优化为251字节。这是吞吐量的最大值。然后,由于ATT和L2CAP级别的开销,并不是所有251个字节都可以用作应用程序数据。这是蓝牙规范说必须的,对此的简要说明如下: | + | 主机和从机的有效数据载荷已经被优化为 251 字节,这是吞吐量的最大值。由于 ATT 和 L2CAP 级别的开销,并不是所有 251 个字节都可以用作应用程序数据,这是蓝牙规范所必须的。对 ATT 和 L2CAP 的简要说明如下: |
- | ### ATT通知头 ### | + | ### ATT 通知头 ### |
- | 所有ATT通知包具有标识 | + | 所有 ATT 通知包具有标识 |
- | 发送通知的属性的操作码和句柄所需的3字节头。 | + | 发送通知的属性的操作码和句柄所需的 3 字节头。 |
- | 发送ATT通知有3字节开销。 | + | 发送 ATT 通知有 3 字节开销。 |
### L2CAP头 ### | ### L2CAP头 ### | ||
- | 在L2CAP层,需要类似的开销来设置分组的长度 | + | 在 L2CAP 层,需要类似的开销来设置分组的长度 |
和适当的信道标识符(CID)。 | 和适当的信道标识符(CID)。 | ||
- | 这些字段中的每一个都是16位(2字节),导致4个字节的L2CAP 开销。 | + | 这些字段中的每一个都是 16 位( 2 字节),导致 4 个字节的 L2CAP 开销。 |
- | 结合L2CAP和ATT数据包开销产生: | + | 结合 L2CAP 和 ATT 数据包开销产生: |
````C | ````C | ||
TOTAL_PACKET_OVERHEAD = 7 bytes | TOTAL_PACKET_OVERHEAD = 7 bytes | ||
```` | ```` | ||
## 测试结果 ## | ## 测试结果 ## | ||
- | 分别对PDU为27 Bytes和251 Bytes以及PHY为1 Mbps、2 Mbps、Coded: | + | 分别对 PDU 为 27 Bytes 和 251 Bytes 以及 PHY 为 1 Mbps、2 Mbps、Coded: |
**TI CC2640R2F LaunchPad** | **TI CC2640R2F LaunchPad** | ||
行 132: | 行 133: | ||
|251 Bytes|780.800 (kb/ | |251 Bytes|780.800 (kb/ | ||
- | **<a href=" | + | **<a href="http://docs.leconiot.com/doku.php? |
|||||| | |||||| | ||
行 140: | 行 141: | ||
|251 Bytes|780.800 (kb/ | |251 Bytes|780.800 (kb/ | ||
- | 可以看出我们的开发板和TI CC2640R2F LaunchPad在不同模式下速率是一致的。读者可以自行下载例程测试。下图展示了在2 Mbps/ | + | 可以看出我们的开发板和 TI CC2640R2F LaunchPad在不同模式下速率是一致的。读者可以自行下载例程测试。下图展示了在 2 Mbps/ |
![](http:// | ![](http:// | ||
行 148: | 行 149: | ||
## 测试用例下载 ## | ## 测试用例下载 ## | ||
- | [](ble_throughput.zip) | + | [](http:// |
- | < | + | < |
BLE Throughput</ | BLE Throughput</ | ||
- | > 注意: | + | > 注意: |
行 164: | 行 165: | ||
</p> | </p> | ||
</ | </ | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
</ | </ | ||