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.

[参考译文] CC2340R5:BLE 堆栈 malloc

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1414244/cc2340r5-ble-stack-malloc

器件型号:CC2340R5

工具与软件:

大家好、我们正在开发一种应用、其中 CC2340r5 (作为中央设备)使用每30秒连接到器件并写入数据

GATT_WriteNoRsp

并接收中的通知  

ATT_Handle_Value_Noti
问题:堆内存已满。
行为:在观察时发现分配>在 RTOS 对象视图中释放(附带屏幕截图)。 更重要的是、对于我们收到的每一个完整通知、每次完成通知后、我都可以看到分配将递增20、但释放仅将递增16
注意:它包括。  
对于   ATT_WRITE_REQ、配置为 GATT_BM_alloc、长度= 8个字节
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能否分享您如何处理写入和通知接收的代码? 可能缺少一个自由声明。

    此致、

    1月

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

    您好!

    收到通知后,我认为你需要使用     GATT_BM_FREE()来释放收到的通知数据。

    此致、

    1月

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

    您好!

    明白了。 我看了看,就知道了。 我认为我们需要缩小有问题的拨款的范围、以找出我们可能遗漏的东西。 我建议在已知分配点周围添加断点、看看我们是否能找到永久增加堆的断点。

    此致、

    1月

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

    你(们)好
    该问题在基本 ble 示例中可重现。
    由于该示例没有用于向外设 器件写入数据的代码、因此我必须从以下源 https://github.com/TexasInstruments/ble_examples/tree/simplelink_low_power_f3_sdk-7.40.01/examples/rtos/LP_EM_CC2340R5/ble5stack/basic_ble_GATT_client/app 复制 app_menu.c

    我已经更改了以下函数的代码、以便从我的器件接收数据

    menu_doGattWriteCB (uint8索引)
      bStatus_t 状态;

      uint8_t charVals[8]= {0xEA0xD10x010x04、0xff0x040xff0xF5};
      attWriteREQ_t req
      REQ.pValue = GATT_BM_ALLOCH (menuCurrentConnHandle、ATT_WRITE_REQ、8NULL);
      req.len = 8
      req.handle=0xd
      // charVal = charVals[index];
      memcpy (req.pValue、charVals、8);
      REQsig = 0
      req.cmd = 1

      STATUS =GATT_WriteNoRsp (menuCurrentConnHandle、&req);
      if (状态!=成功)
      {
        GATT_BM_FREE ((gattMsg_t *)&req、ATT_WRITE_REQ);
      }


      //打印 GATT_WriteCharValue 调用的状态
      MenuModule_printf (APP_MENU_GENERAL_STATUS_LINE、0"Call Status:GATTWrite ="
               menu_module_color_Bold menu_module_color_red "%d" menu_module_color_reset、
               状态);


      if (状态!=成功)
        {
          GATT_BM_FREE ((gattMsg_t *)&req、ATT_WRITE_REQ);
        }
      /返回上一个菜单
      MenuModule_GoBack ();
    }

    在发送数据请求之前,我注意到刷新分配的读数,并释放为9094, 9007
    收到数据后,我 注意到刷新分配的读数,并释放为 9,116,9025
    我们可以清楚地看到、正如我之前的帖子中所看到的、4个自由。
    我已经尝试找到分配、但不确定查找位置、因为该代码属于 simplink SDK。
    此外、我使用的 SDK 版本是:8.10.1.02
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您进行进一步测试! 为了确保我能够正确理解、当使用来自您共享链接的 app_menu.c 文件时、basic_ble 示例能够表现出此行为? 否则、不会发生该行为、对吗(因为原始代码不作为 GATT 客户端运行)?

    此致、

    1月

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

    你(们)好

    使用来自您共享链接的 app_menu.c 文件时、basic_ble 示例能够表现出此行为?

    如果您理解 app_menu.c 中的代码必须处理我的问题、则根据我的观察、此代码不正确。

    否则、不会出现此行为、正确(因为原件不作为 GATT 客户端运行)?

    我尚未查看其他情景、因为我的重点主要是通知。 我仅使用示例来表明、在接收通知时、可能由于 BLE 堆栈 或 bleapp 实用程序内存处理不当而缺少4个释放。 .


    注意:我的单个通知分为4个 TI 通信堆栈事件。 我还验证了以下代码在 GATT 事件处理程序返回时释放内存:

    [报价 userid="623416" url="~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1414244/cc2340r5-ble-stack-malloc/5420078 #5420078"]
    if (pMsgData && freeMsg)
          {
            //使用 freeMsg
            BLEAppUtil_freMsg (pMsgData);
          }
    [报价]

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

    您好!

    我猜应用程序代码中缺少一些内容。 可能在 app_menu.c.中 我的想法是,有一个案例或回调,要求我们使用 BLEAppUtil_freeMsg ()释放一个接收的块,但我们没有这样做。 在代码中、您是否正在验证 GATT 操作返回成功、如果没有成功、则释放分配的有效负载?

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要发送数据、我将使用以下函数。
    注:我知道出错时必须释放内存。 但在我们的用例中、确保返回代码始终是成功的 [报价]

    是的、我们就是这么做的。
    我认为我们不应将用户代码中的块作为 API 进行释放   BLEAppUtil_freMsg() 都在 bleapputil_中定义 internal.h

    我相信 BLEAppUtil( 英语:BLEAppUtil)缺少 Free。
    您是否有关于为接收通知而进行的分配的信息。 这样我们就可以跟踪特定的块是否被释放。

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

    你(们)好

     我们通过实验发现的、我们需要使用这些引脚  

      中的 GATT_BM_FREE (&gattMsg->msg、gattMsg->method)  
     案例 ATT_Handle_Value_Noti:

    现在、我们能够很好地接收通知。
    我认为应该有一个适当的例子或指南,这是我尚未找到的。
    请分享您是否有开发资源参考。
    谢谢。