This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2640R2F:GATT_Notification 在收到多个通知时挂起

Guru**** 2534600 points
Other Parts Discussed in Thread: SYSCONFIG, CC2340R5

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1544906/cc2640r2f-gatt_notification-hang-on-multiple-notifications

器件型号:CC2640R2F
主题中讨论的其他器件:SysConfigCC2340R5

工具/软件:

我正在基于 简单外设 OAD 片外示例设计 BLE 数据收集传感器。

我尝试提高 BLE 传感器的数据吞吐量 、遇到了一个问题、似乎其中一个通知特性的 GATT 缓冲器的填充速度比清空要快。 在调用 GATT_Notification() 时、我的固件应用程序挂起在 gattServo App_Send NotiInd() 函数内。

我正在尝试发送一个大小约为 32 KB 的记录缓冲区。 之前、我发送的是单个数据记录和标头、每次通知传输的总有效负载为 18 字节。 理论上、我应该能够在每个有效载荷总计 242 字节的通知中发送 15 条记录和一个标头、因为这小于 MAX_PDU_SIZE (251)。 但是,当我将通知增加到仅包含 4 条记录(共 66 字节)时,应用程序在连续发送 10 条通知后返回值 4 后挂起到 GATT_Notification ()。

似乎一个较老的帖子有类似的问题、但为了分享该项目、论坛已经停止了解决问题的努力。 有人能与我分享解决方案吗?

e2e.ti.com/.../4537051

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、山姆!

    我会问两年前处理这一案件的专家、该决议是什么。 同时、是否可以尝试使用 ROV(用户指南链接)来查看运行 GATT_Notification 之前和之后 RAM 中的可用空间? 这将有助于查看您是否缺少内存、或者您是否有内存泄漏或其他问题。

    此致、
    Maxence

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    令人惊讶的是、在调用 GATT_Notification 后、gapRole_taskFxn 和我们的应用程序任务 Fxn 的 stackPeak 似乎不会达到其 stackStackStackStuck 的水平。 尽管应用程序任务的 stackPeak 确实在攀爬。 这似乎不像我最初假设的那样像内存泄漏、但它没有说明为什么通信似乎在大数据包大小下失败。

    是否有任何更新?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我没有收到任何最新消息 我深入探讨了您的问题、 GATT_Notification 函数的错误代码 4 与 MSG_BUFFER_NOT_AVAIL 关联。 当 不再有 HCI 缓冲区可供 BLE 栈分配空间用于通知时、就会发生此错误。

    您可以通过在此处的 SysConfig 中增加“Max Number of PDU“来增加 BLE 使用的总缓冲区数量:  

    此致、
    Maxence

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Maxence:

    我尝试了 MAX_NUM_PDU 的几个不同的值:5、10 和 15、行为没有变化。 进行这些调整的 GUI 不相同。 您在使用什么工具?

    Sam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我使用的是 SysConfig、它是一个用于轻松配置您所使用电路板的开发工具、但在图片中、我在 CC2340R5 工程中、而不是 CC2640R2 工程中。 CC2640R2 中没有这个工具、这是我的错。

    对于您的初始问题、更改 PDU 的最大数量并不像更改 ble_user_config.h 中 ICallBLE 下的定义那么简单。 您还需要按照文件顶部的说明包括自定义配置、这需要执行其他步骤:

          更改可配置变量的默认值:
           -在应用 main.c 文件中包含以下内容:
            #ifndef USE_DEFAULT_USER_CFG

            #include “ble_user_config.h"</s>“

            // BLE 用户定义配置
            bleUserCfg_t user0Cfg = BLE_USER_CFG;

            #endif // use_default_user_CFG
           -设置预处理器符号 MAX_NUM_BLE_CONns、MAX_NUM_PDU、
            MAX_PDU_SIZE、L2CAP_NUM_PSM 或 L2CAP_NUM_CO_channels
            切换到所需的值。
           -在栈 OSAL_ICallBle.c 中包含“ble_user_config.h"</s>“
            添加到工程。
           -在 stack_main 的开头调用 setBleUserConfig。 实际上、
            可以将 STACK_MAIN 中的任何位置设置为变量
            只要它在 osal_init_system 之前、但最好设置为
            stack_main 的起始函数。

          注意:仅在期间使用用户可配置变量
             控制器和主机的初始化。 不断变化
             之后这些变量的值将没有
             效应。

          注意:要使用默认的用户可配置变量、请定义
             中的预处理器符号 USE_DEFAULT_USER_CFG
             工程。

          例如:
           -在您的应用程序 main.c 中,包括:
            #ifndef USE_DEFAULT_USER_CFG

            #include “bleUserConfig.h"</s>“

            // BLE 用户定义配置
            bleUserCfg_t user0Cfg = BLE_USER_CFG;
            #endif // use_default_user_CFG
           -在应用程序项目中,设置预处理器符号
            将 MAX_NUM_BLE_CONns 更改为 1、以更改 BLE 的最大数量
            从默认值 3 连接到 1。
           -在您的栈 OSAL_ICallBle.c 文件中,调用 setBleUserCfg to
            更新用户配置变量:
            #include “bleUserConfig.h"</s>“
            :
            int stack_main( void *arg )
            {
             setBleUserConfig((bleUserCfg_t *)arg );
             :
            }

    此致、
    Maxence

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是您的问题的有用链接:

    关于 L2CAP 配置的用户指南章节
    运行时低功耗蓝牙协议栈配置