What controls packets per connection event?

I am working on a project where we are sending data to a remote device as fast as possible.  The sender will call bt_gatt_write() until it blocks the thread.  So it is just keeping the queues loaded up with packets.  Generally, what I see is that the BLE stack will cram as many packets into the connection event as possible; however, sometimes especially with multiple connections it will choose to only send a couple.  This drastically reduces throughput.

In one instance, when we had 5 connections active, the time to send ~330kB varied from 45 seconds to almost 5 minutes.  I captured these images from a power profiler connected to the remote device receiving the data:

The remote peripherals are nRF52840s and have the following parameters:

CONFIG_BT_PERIPHERAL_PREF_LATENCY=0
CONFIG_BT_PERIPHERAL_PREF_MAX_INT=40 //50ms
CONFIG_BT_PERIPHERAL_PREF_MIN_INT=24 //30ms
CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=600
CONFIG_BT_L2CAP_TX_MTU=77
CONFIG_BT_BUF_ACL_TX_SIZE=81
CONFIG_BT_BUF_ACL_RX_SIZE=81
CONFIG_BT_CTLR_DATA_LENGTH_MAX=81

The sending device is an nRF5340 acting as a central and has the following parameter:

CONFIG_BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT=4000

The data on the other remote devices is relatively low consisting mainly of a heartbeat sent every 500ms.

Can you shed any light on why the scheduler would limit the packets per connection event even though it can send 5x as much with the devices connected?

Can you explain how CONFIG_BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT works?  We thought that setting it to 4000 limits the time packets can be sent to 4ms; however, that does not seem to be the case since it is in some scenarios seemingly filling the connection event.

Any tips for optimizing for our setup would be appreciated.

Parents
  • In case it is helpful I went ahead and captured the CONFIG_BT_CTLR* settings from the net core .config file:

    CONFIG_BT_CTLR=y
    CONFIG_BT_CTLR_DATA_LENGTH_MAX=81
    CONFIG_BT_CTLR_SDC_PERIPHERAL_COUNT=2
    # CONFIG_BT_CTLR_SDC_QOS_CHANNEL_SURVEY is not set
    # CONFIG_BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT_OVERRIDE is not set
    CONFIG_BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT=4000
    CONFIG_BT_CTLR_SDC_CONN_EVENT_EXTEND_DEFAULT=y
    CONFIG_BT_CTLR_SDC_CENTRAL_ACL_EVENT_SPACING_DEFAULT=4000
    # CONFIG_BT_CTLR_SDC_PERIODIC_ADV_EVENT_LEN_DEFAULT_OVERRIDE is not set
    CONFIG_BT_CTLR_SDC_PERIODIC_ADV_EVENT_LEN_DEFAULT=7500
    CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT=3
    CONFIG_BT_CTLR_SDC_RX_PACKET_COUNT=2
    CONFIG_BT_CTLR_SDC_SCAN_BUFFER_COUNT=3
    CONFIG_BT_CTLR_SDC_PERIODIC_SYNC_BUFFER_COUNT=3
    CONFIG_BT_CTLR_SDC_RX_PRIO=6
    # CONFIG_BT_CTLR_DF is not set
    CONFIG_BT_CTLR_FAL_SIZE=8
    CONFIG_BT_CTLR_ECDH_LIB_OBERON=y
    # CONFIG_BT_CTLR_ECDH_LIB_TINYCRYPT is not set
    CONFIG_BT_CTLR_ECDH_STACK_SIZE=900
    # CONFIG_BT_CTLR_ECDH_IN_MPSL_WORK is not set
    # CONFIG_BT_CTLR_SDC_EVENT_TRIGGER is not set
    CONFIG_BT_CTLR_SDC_BIG_RESERVED_TIME_US=1600
    CONFIG_BT_CTLR_SDC_CIG_RESERVED_TIME_US=1300
    CONFIG_BT_CTLR_SDC_CIS_SUBEVENT_LENGTH_US=0
    CONFIG_BT_CTLR_LE_ENC_SUPPORT=y
    CONFIG_BT_CTLR_EXT_REJ_IND_SUPPORT=y
    CONFIG_BT_CTLR_DATA_LEN_UPDATE_SUPPORT=y
    CONFIG_BT_CTLR_PRIVACY_SUPPORT=y
    CONFIG_BT_CTLR_EXT_SCAN_FP_SUPPORT=y
    CONFIG_BT_CTLR_PHY_UPDATE_SUPPORT=y
    CONFIG_BT_CTLR_PHY_2M_SUPPORT=y
    CONFIG_BT_CTLR_PHY_CODED_SUPPORT=y
    CONFIG_BT_CTLR_ADV_EXT_SUPPORT=y
    CONFIG_BT_CTLR_ADV_PERIODIC_SUPPORT=y
    CONFIG_BT_CTLR_ADV_PERIODIC_RSP_SUPPORT=y
    CONFIG_BT_CTLR_SYNC_PERIODIC_SUPPORT=y
    CONFIG_BT_CTLR_SYNC_PERIODIC_RSP_SUPPORT=y
    CONFIG_BT_CTLR_SYNC_TRANSFER_SENDER_SUPPORT=y
    CONFIG_BT_CTLR_SYNC_TRANSFER_RECEIVER_SUPPORT=y
    CONFIG_BT_CTLR_ADV_ISO_SUPPORT=y
    CONFIG_BT_CTLR_SYNC_ISO_SUPPORT=y
    CONFIG_BT_CTLR_CENTRAL_ISO_SUPPORT=y
    CONFIG_BT_CTLR_PERIPHERAL_ISO_SUPPORT=y
    CONFIG_BT_CTLR_CHAN_SEL_2_SUPPORT=y
    CONFIG_BT_CTLR_SCA_UPDATE_SUPPORT=y
    CONFIG_BT_CTLR_CONN_RSSI_SUPPORT=y
    CONFIG_BT_CTLR_ECDH_SUPPORT=y
    CONFIG_BT_CTLR_LE_POWER_CONTROL_SUPPORT=y
    CONFIG_BT_CTLR_CRYPTO=y
    CONFIG_BT_CTLR_HCI_VS_BUILD_INFO=""
    # CONFIG_BT_CTLR_TX_PWR_PLUS_3 is not set
    # CONFIG_BT_CTLR_TX_PWR_PLUS_2 is not set
    # CONFIG_BT_CTLR_TX_PWR_PLUS_1 is not set
    CONFIG_BT_CTLR_TX_PWR_0=y
    # CONFIG_BT_CTLR_TX_PWR_MINUS_1 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_2 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_3 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_4 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_5 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_6 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_7 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_8 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_12 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_16 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_20 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_40 is not set
    CONFIG_BT_CTLR_TX_PWR_DBM=0
    CONFIG_BT_CTLR_TX_PWR_ANTENNA=0
    CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y
    CONFIG_BT_CTLR_LE_ENC=y
    CONFIG_BT_CTLR_ECDH=y
    CONFIG_BT_CTLR_EXT_REJ_IND=y
    CONFIG_BT_CTLR_LE_PING=y
    CONFIG_BT_CTLR_DATA_LENGTH=y
    CONFIG_BT_CTLR_PHY=y
    CONFIG_BT_CTLR_CONN_RSSI=y
    # CONFIG_BT_CTLR_LE_POWER_CONTROL is not set
    CONFIG_BT_CTLR_FILTER_ACCEPT_LIST=y
    CONFIG_BT_CTLR_PRIVACY=y
    CONFIG_BT_CTLR_RL_SIZE=8
    CONFIG_BT_CTLR_EXT_SCAN_FP=y
    CONFIG_BT_CTLR_PHY_2M=y
    CONFIG_BT_CTLR_PHY_CODED=y
    CONFIG_BT_CTLR_CHAN_SEL_2=y
    # CONFIG_BT_CTLR_ADV_EXT is not set
    # CONFIG_BT_CTLR_SET_HOST_FEATURE is not set
    # CONFIG_BT_CTLR_CENTRAL_ISO is not set
    # CONFIG_BT_CTLR_PERIPHERAL_ISO is not set
    # CONFIG_BT_CTLR_HCI_CODEC_AND_DELAY_INFO is not set
    CONFIG_BT_CTLR_ASSERT_HANDLER=y 

Reply
  • In case it is helpful I went ahead and captured the CONFIG_BT_CTLR* settings from the net core .config file:

    CONFIG_BT_CTLR=y
    CONFIG_BT_CTLR_DATA_LENGTH_MAX=81
    CONFIG_BT_CTLR_SDC_PERIPHERAL_COUNT=2
    # CONFIG_BT_CTLR_SDC_QOS_CHANNEL_SURVEY is not set
    # CONFIG_BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT_OVERRIDE is not set
    CONFIG_BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT=4000
    CONFIG_BT_CTLR_SDC_CONN_EVENT_EXTEND_DEFAULT=y
    CONFIG_BT_CTLR_SDC_CENTRAL_ACL_EVENT_SPACING_DEFAULT=4000
    # CONFIG_BT_CTLR_SDC_PERIODIC_ADV_EVENT_LEN_DEFAULT_OVERRIDE is not set
    CONFIG_BT_CTLR_SDC_PERIODIC_ADV_EVENT_LEN_DEFAULT=7500
    CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT=3
    CONFIG_BT_CTLR_SDC_RX_PACKET_COUNT=2
    CONFIG_BT_CTLR_SDC_SCAN_BUFFER_COUNT=3
    CONFIG_BT_CTLR_SDC_PERIODIC_SYNC_BUFFER_COUNT=3
    CONFIG_BT_CTLR_SDC_RX_PRIO=6
    # CONFIG_BT_CTLR_DF is not set
    CONFIG_BT_CTLR_FAL_SIZE=8
    CONFIG_BT_CTLR_ECDH_LIB_OBERON=y
    # CONFIG_BT_CTLR_ECDH_LIB_TINYCRYPT is not set
    CONFIG_BT_CTLR_ECDH_STACK_SIZE=900
    # CONFIG_BT_CTLR_ECDH_IN_MPSL_WORK is not set
    # CONFIG_BT_CTLR_SDC_EVENT_TRIGGER is not set
    CONFIG_BT_CTLR_SDC_BIG_RESERVED_TIME_US=1600
    CONFIG_BT_CTLR_SDC_CIG_RESERVED_TIME_US=1300
    CONFIG_BT_CTLR_SDC_CIS_SUBEVENT_LENGTH_US=0
    CONFIG_BT_CTLR_LE_ENC_SUPPORT=y
    CONFIG_BT_CTLR_EXT_REJ_IND_SUPPORT=y
    CONFIG_BT_CTLR_DATA_LEN_UPDATE_SUPPORT=y
    CONFIG_BT_CTLR_PRIVACY_SUPPORT=y
    CONFIG_BT_CTLR_EXT_SCAN_FP_SUPPORT=y
    CONFIG_BT_CTLR_PHY_UPDATE_SUPPORT=y
    CONFIG_BT_CTLR_PHY_2M_SUPPORT=y
    CONFIG_BT_CTLR_PHY_CODED_SUPPORT=y
    CONFIG_BT_CTLR_ADV_EXT_SUPPORT=y
    CONFIG_BT_CTLR_ADV_PERIODIC_SUPPORT=y
    CONFIG_BT_CTLR_ADV_PERIODIC_RSP_SUPPORT=y
    CONFIG_BT_CTLR_SYNC_PERIODIC_SUPPORT=y
    CONFIG_BT_CTLR_SYNC_PERIODIC_RSP_SUPPORT=y
    CONFIG_BT_CTLR_SYNC_TRANSFER_SENDER_SUPPORT=y
    CONFIG_BT_CTLR_SYNC_TRANSFER_RECEIVER_SUPPORT=y
    CONFIG_BT_CTLR_ADV_ISO_SUPPORT=y
    CONFIG_BT_CTLR_SYNC_ISO_SUPPORT=y
    CONFIG_BT_CTLR_CENTRAL_ISO_SUPPORT=y
    CONFIG_BT_CTLR_PERIPHERAL_ISO_SUPPORT=y
    CONFIG_BT_CTLR_CHAN_SEL_2_SUPPORT=y
    CONFIG_BT_CTLR_SCA_UPDATE_SUPPORT=y
    CONFIG_BT_CTLR_CONN_RSSI_SUPPORT=y
    CONFIG_BT_CTLR_ECDH_SUPPORT=y
    CONFIG_BT_CTLR_LE_POWER_CONTROL_SUPPORT=y
    CONFIG_BT_CTLR_CRYPTO=y
    CONFIG_BT_CTLR_HCI_VS_BUILD_INFO=""
    # CONFIG_BT_CTLR_TX_PWR_PLUS_3 is not set
    # CONFIG_BT_CTLR_TX_PWR_PLUS_2 is not set
    # CONFIG_BT_CTLR_TX_PWR_PLUS_1 is not set
    CONFIG_BT_CTLR_TX_PWR_0=y
    # CONFIG_BT_CTLR_TX_PWR_MINUS_1 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_2 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_3 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_4 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_5 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_6 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_7 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_8 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_12 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_16 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_20 is not set
    # CONFIG_BT_CTLR_TX_PWR_MINUS_40 is not set
    CONFIG_BT_CTLR_TX_PWR_DBM=0
    CONFIG_BT_CTLR_TX_PWR_ANTENNA=0
    CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y
    CONFIG_BT_CTLR_LE_ENC=y
    CONFIG_BT_CTLR_ECDH=y
    CONFIG_BT_CTLR_EXT_REJ_IND=y
    CONFIG_BT_CTLR_LE_PING=y
    CONFIG_BT_CTLR_DATA_LENGTH=y
    CONFIG_BT_CTLR_PHY=y
    CONFIG_BT_CTLR_CONN_RSSI=y
    # CONFIG_BT_CTLR_LE_POWER_CONTROL is not set
    CONFIG_BT_CTLR_FILTER_ACCEPT_LIST=y
    CONFIG_BT_CTLR_PRIVACY=y
    CONFIG_BT_CTLR_RL_SIZE=8
    CONFIG_BT_CTLR_EXT_SCAN_FP=y
    CONFIG_BT_CTLR_PHY_2M=y
    CONFIG_BT_CTLR_PHY_CODED=y
    CONFIG_BT_CTLR_CHAN_SEL_2=y
    # CONFIG_BT_CTLR_ADV_EXT is not set
    # CONFIG_BT_CTLR_SET_HOST_FEATURE is not set
    # CONFIG_BT_CTLR_CENTRAL_ISO is not set
    # CONFIG_BT_CTLR_PERIPHERAL_ISO is not set
    # CONFIG_BT_CTLR_HCI_CODEC_AND_DELAY_INFO is not set
    CONFIG_BT_CTLR_ASSERT_HANDLER=y 

Children
No Data
Related