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.

[参考译文] CC2541:堆栈 1.5.2 潜在的内存泄漏

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1590549/cc2541-stack-1-5-2-potential-memory-leak

器件型号: CC2541

如果在 GATT 消息接收并通过处理发送后连接断开、如何处理存储器释放?

代码在该函数最后一行的 GATT_BM_FREE 之前达到`return;`。  

这是潜在的泄漏吗?  

以下代码来自 1.5.2 栈工程文件夹中的 simpleBLECentral.c。  

static void simpleBLECentralProcessGATTMsg( gattMsgEvent_t *pMsg )
{
  if ( simpleBLEState != BLE_STATE_CONNECTED )
  {
    // In case a GATT message came after a connection has dropped,
    // ignore the message
    return;
  }
  
  if ( ( pMsg->method == ATT_READ_RSP ) ||
       ( ( pMsg->method == ATT_ERROR_RSP ) &&
         ( pMsg->msg.errorRsp.reqOpcode == ATT_READ_REQ ) ) )
  {
    if ( pMsg->method == ATT_ERROR_RSP )
    {
      uint8 status = pMsg->msg.errorRsp.errCode;
      
      LCD_WRITE_STRING_VALUE( "Read Error", status, 10, HAL_LCD_LINE_1 );
    }
    else
    {
      // After a successful read, display the read value
      uint8 valueRead = pMsg->msg.readRsp.pValue[0];

      LCD_WRITE_STRING_VALUE( "Read rsp:", valueRead, 10, HAL_LCD_LINE_1 );
    }
    
    simpleBLEProcedureInProgress = FALSE;
  }
  else if ( ( pMsg->method == ATT_WRITE_RSP ) ||
       ( ( pMsg->method == ATT_ERROR_RSP ) &&
         ( pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ ) ) )
  {
    
    if ( pMsg->method == ATT_ERROR_RSP == ATT_ERROR_RSP )
    {
      uint8 status = pMsg->msg.errorRsp.errCode;
      
      LCD_WRITE_STRING_VALUE( "Write Error", status, 10, HAL_LCD_LINE_1 );
    }
    else
    {
      // After a succesful write, display the value that was written and increment value
      LCD_WRITE_STRING_VALUE( "Write sent:", simpleBLECharVal++, 10, HAL_LCD_LINE_1 );      
    }
    
    simpleBLEProcedureInProgress = FALSE;    

  }
  else if ( simpleBLEDiscState != BLE_DISC_STATE_IDLE )
  {
    simpleBLEGATTDiscoveryEvent( pMsg );
  }
  
  GATT_bm_free( &pMsg->msg, pMsg->method );
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    感谢您的联系。 它确实看起来可能会导致问题。 但是、为了验证这种情况、系统不会释放其他位置的内存。 我建议监视堆。  要监视堆、可导航至 SDK_INSTALL_DIR - documents 中的“Software Developer's Guide “(软件开发人员指南) TI_BLE_Guide.pdf Software_Developer。 特别是、导航至第 3.4 节“堆管理器“并设置预处理器符号并重新刷写工程以启用此功能。

    BR、

    David。

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

    您好、David:

    感谢您对此进行研究。  

    这是示例工程中的代码(属于 1.5.2 SDK 的一部分)、因此 TI 可以验证这是否存在问题并提出建议?  

    谢谢、

    LIN

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

    您好、林

    我会重新检视您的建议。 您能否说明您当前执行的计划是否有问题?可能是什么问题? 您是否发现了内存泄漏?

    BR、

    David。

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

    您好、David:

    在我的实现中、我没有 基于连接状态的条件返回。 我想知道我是否应该遵循此示例代码并将其添加到我的代码中。  

    因此、我想先确认这不是问题、然后再将其添加到我的代码中。  

    您是否对此有任何进一步的见解?  

    谢谢、

    LIN

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

    您好、David:

    我认为需要检查 我的代码中是否连接了 BLE、如示例代码中所示。  

    `if ( simpleBLEState != BLE_STATE_CONNECTED ) { // In case a GATT message came after a connection has dropped, // ignore the message return; }`μ s

    您能否确认其在示例代码中的写入方式是否会导致内存泄漏?  

    谢谢、

    LIN

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

    您好、林

    在这里,我已经离开办公室了,我发送的消息显然没有张贴在这里。 我对代码进行了更深入的研究。 答案更多地提到了谁拥有 pMsg 并负责内存分配的事实。  在堆栈中、GATT 消息由堆栈分配和拥有、而不是由应用程序分配和拥有、因此将被堆栈任务释放。  只有当应用程序实际消耗消息内容(使用 GATT_BM_FREE ()) 时、才可以释放存储器。 一旦连接中断、堆栈就知道消息未被使用(解析我的应用程序)、并应在清除事件时释放有效负载本身。

    希望这有所帮助。

    David。

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

    您好、David:  

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

    您好、David:  
    这种解释是有意义的,不是同时有意义的。 创建存储器的相同过程应该释放分配给它的存储器、这是有意义的。  
    想知道栈如何知道消息是否已被使用?  

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

    您好 Lin、

    在许多情况下、对象上附加了一个变量(例如 SafeToFree)。

    谢谢、

    Marie H