打印
[CC2640]

CC2640R2F BLE5.0 BLE吞吐量测试

[复制链接]
1121|49
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
coshi|  楼主 | 2020-2-2 11:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
介绍
本章分别测试了TI CC2640R2F LuanchPad和LECONIOT CC2640R2F Evaluation Board开发板吞吐量。我们提供了两个例程供大家参考测试,分别是ble5_throughput_peripheral和ble5_throughput_central。本文最后提供了测试程序下载链接。

该工程中进行了一些修改以方便进行吞吐量测试:

改变项目MTU大小
通过消息计数器发送通知
增加Throughput配置文件
增加按键菜单
硬件环境
使用USB连接CC2640R2F Evaluation Board。确保跳线帽正确连接,如下图所示




使用特权

评论回复

相关帖子

沙发
coshi|  楼主 | 2020-2-2 11:29 | 只看该作者
参数修改
基本思想是不断发送GATT通知,尽可能减少开销,尽可能减少停机时间。以下参数在增加吞吐量时必须加以考虑。

ATT_MTU大小
有关最大传输单元(ATT_MTU)的说明,请参见LE Data Length Extension和 Logical Link Control and Adaptation Layer Protocol (L2CAP)。

这里定义6个Tx缓冲区,每个缓冲区251字节。用户应用程序应该根据自身堆栈情况进行分配。如果没有足够的堆栈,可以通过减少MAX_NUM_PDU,这样可能导致吞吐量的损失。实际使用中的最坏情况是MAX_NUM_PDU和MAX_PDU_SIZE的乘积。设计人员应该根据设备的可用内存来平衡这些参数。

#define MAX_NUM_PDU                   6
#define MAX_PDU_SIZE                  251


LE 2M PHY
这里使用2M PHY,使每个连接事件期间从PHY发送的数据增加一倍(需要连接之后通过按键菜单自行选择)。

LE数据长度拓展
在蓝牙4.2规范中允许控制器发送最多251个字节的单个数据包。这与以前的27个字节相比大大增加了吞吐量。此功能称为数据长度拓展。有关这方面详细介绍请参考LE Data Length Extension以及 BLE一次能传多少数据(ATT_MTU设置/LE Data扩展)。
下面的PDU更新过程的代码片段可以在throughput_peripheral.c文件中找到

//examples\rtos\CC2640R2_LAUNCHXL\ble5apps\throughput_peripheral\src\app\throughput_peripheral.c SimpleBLEPeripheral_doSetDLEPDU line 1213
bool SimpleBLEPeripheral_doSetDLEPDU(uint8 index)
{
  switch (index)
  {
  case 0:
    txOctets = DEFAULT_PDU_SIZE;
    txTime = DEFAULT_TX_TIME;
    break;
  case 1:
    txOctets = DLE_MAX_PDU_SIZE;
    txTime = DLE_MAX_TX_TIME;
    break;
  }
HCI_LE_SetDataLenCmd(connectionHandle, txOctets, txTime);
}


使用特权

评论回复
板凳
coshi|  楼主 | 2020-2-2 11:29 | 只看该作者
连接间隔
根据前后处理数量,控制器需要2-3ms来准备下一个连接事件。因此更长的连接间隔可以提高吞吐量。由于使用notify方式传输,更高的连接间隔意味着连接事件减少。此示例将使用100ms的连接间隔,请注意,在实际情况下更高的连接间隔有着明显的缺点:由于射频干扰导致的连接事件将大大降低吞吐量。因此用户需要根据所需吞吐量进行权衡。当连接间隔大于100ms后,吞吐量将不会增加。

通知排队
这段代码设计能保证队列中始终有需要发送的数据,以便在通知开始时不会处于饥饿状态。

//examples\rtos\CC2640R2_LAUNCHXL\ble5apps\throughput_peripheral\src\app\throughput_peripheral.c SimpleBLEPeripheral_blastData line 1329
static void blastData()
{
  uint16 len = MAX_PDU_SIZE-7;
  attHandleValueNoti_t noti;
  bStatus_t status;
  noti.handle = 0x1E;
  noti.len = len;

  while(1)
  {
    //attempt to allocate payload
    noti.pValue = (uint8 *)GATT_bm_alloc( 0, ATT_HANDLE_VALUE_NOTI, GATT_MAX_MTU, &len );

    if ( noti.pValue != NULL ) //if allocated
    {
      //place index
      noti.pValue[0] = (msg_counter >> 24) & 0xFF;
      noti.pValue[1] = (msg_counter >> 16) & 0xFF;
      noti.pValue[2] = (msg_counter >> 8) & 0xFF;
      noti.pValue[3] = msg_counter & 0xFF;
      status = GATT_Notification( 0, &noti, 0 );    //attempt to send
      if ( status != SUCCESS ) //if noti not sent
      {
        GATT_bm_free( (gattMsg_t *)&noti, ATT_HANDLE_VALUE_NOTI );
      }
      else //noti sent, increment counter
      {
        msg_counter++;
      }
    }
    else
    {
      //bleNoResources
      asm("NOP");
    }
  }
}
本代码仅为最大吞吐量测试,在实际应用中,由于其他处理需求,应用程序可能无法维持此吞吐量(例如必须通过串口传输有效数据负载)。此外blastData函数最大限度的增加了数据的排队,因此GATT_Notification会返回非SUCCESS状态,例如队列已满时的blePending。Tx队列的深度由上面定义的MAX_NUM_PDU决定。


使用特权

评论回复
地板
coshi|  楼主 | 2020-2-2 11:30 | 只看该作者
分组开销
主机和从机的有效数据载荷已经被优化为251字节。这是吞吐量的最大值。然后,由于ATT和L2CAP级别的开销,并不是所有251个字节都可以用作应用程序数据。这是蓝牙规范说必须的,对此的简要说明如下:

ATT通知头
所有ATT通知包具有标识
发送通知的属性的操作码和句柄所需的3字节头。
发送ATT通知有3字节开销。

L2CAP头
在L2CAP层,需要类似的开销来设置分组的长度
和适当的信道标识符(CID)。
这些字段中的每一个都是16位(2字节),导致4个字节的L2CAP 开销。
结合L2CAP和ATT数据包开销产生:

TOTAL_PACKET_OVERHEAD = 7 bytes


使用特权

评论回复
5
coshi|  楼主 | 2020-2-2 11:31 | 只看该作者
测试结果
分别对PDU为27 Bytes和251 Bytes以及PHY为1 Mbps、2 Mbps、Coded:S2、Coded:S8.模式进行测试。下面给出表格方便查阅。

TI CC2640R2F LaunchPad

                                    

CC2640R2F Evaluation Board

可以看出我们的开发板和TI CC2640R2F LaunchPad在不同模式下速率是一致的。读者可以自行下载例程测试。下图展示了在2 Mbps/251bytes模式下的传输速率。



测试用例下载

下载 BLE Throughput 测试例程.

注意:需要配合CC2640RF SDK使用,笔者目前使用的是simplelink_cc2640r2_sdk_1_35_00_33。文件解压后放在该SDK同级目录,即C:\ti。



使用特权

评论回复
6
qcliu| | 2020-3-1 11:21 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
7
wiba| | 2020-3-1 11:25 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
zljiu| | 2020-3-1 11:29 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
9
drer| | 2020-3-1 11:34 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
10
gwsan| | 2020-3-1 11:37 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
11
usysm| | 2020-3-9 20:56 | 只看该作者
有支持蓝牙5.0的BLE蓝牙模块吗?

使用特权

评论回复
12
jkl21| | 2020-3-9 20:56 | 只看该作者
理论速度是多少      

使用特权

评论回复
13
wwppd| | 2020-3-9 20:56 | 只看该作者
CC2541与CC2640有什么实际区别?

使用特权

评论回复
14
maqianqu| | 2020-3-9 20:57 | 只看该作者
CC2640 端口捕获怎么设置

使用特权

评论回复
15
dspmana| | 2020-3-9 20:57 | 只看该作者
最大理论有效载荷吞吐量是多少?  

使用特权

评论回复
16
eefas| | 2020-3-9 20:57 | 只看该作者
是否支持BLE5.0  

使用特权

评论回复
17
typeof| | 2020-3-9 20:57 | 只看该作者
蓝牙4.0的模块可以升级为蓝牙5.0模块吗?

使用特权

评论回复
18
yujielun| | 2020-3-9 20:58 | 只看该作者
CC2640定向广播需要怎么配置

使用特权

评论回复
19
htmlme| | 2020-3-9 20:58 | 只看该作者
      

使用特权

评论回复
20
pklong| | 2020-3-9 20:58 | 只看该作者
CC2640R2F-Q1 发布了吗?  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

3301

帖子

4

粉丝