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.

[参考译文] RTOS/BLE-STACK:MSP432 SimpleLink 蓝牙插件内存泄漏和错误处理

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/669565/rtos-ble-stack-msp432-simplelink-bluetooth-plugin-memory-leaks-and-error-handling

器件型号:BLE-STACK

工具/软件:TI-RTOS

您好!

我将一些代码从 MSP432P401R 移植到 MSP432P401M、因此 SRAM 已从64KB 减少到32KB。 我避免了代码中的动态内存分配、但它在您的驱动程序和蓝牙堆栈中得到了广泛使用、之前我为堆分配了16KB、但不再有空间进行这种分配、因此必须将其减少到7KB。 这并不是非常相关的、但重点是 simplelink_msp432_sdk_bluetooth_plugin_1_25_00_42的错误处理不足、如果初始化失败、将会泄漏内存。  

相关配置:我使用的是 sapParams.port.remote.STACKSIZE = 2048的 UART 传输。

我将要介绍几种不同的情况、但从代码调用的相关函数始终为  SAP_OPEN

在代码中、它最初执行默认参数、回调配置。 如果失败、则不需要进行清理、因此没关系。 然后调用 SNP_OPEN、后者不分配存储器、但要求调用 SNP_CLOSE 以销毁其信标。 因此、如果在 portType 中传递的无效、我们将返回一个错误而不调用  SNP_Close。 这不会泄漏内存或无限循环、但仍然不理想。 最后、我们进入  NPIITASK_OPEN、 这是大多数问题发生的地方(NPI_TASK_POSIX.c)。

我们有同样的 SEM_init  调用、但主要问题是  npiTxQueue、 npiRxQueue、 npiSyncRxQueue、 npiSyncTxQueue 和  npiPacketQueue 全部打开(这会进行分配)、而不检查结果。 因此、其中一些可能已经分配、而另一些可能没有分配。 再往下一点、如果分配 npiTaskStack  失败、那么我们刚刚泄露了几 KB 的 RAM、我们永远不会回来。 即使  SAP_OPEN 失败、我们也可能调用 SAP_CLOSE、但这很容易出错、因为它假定 SAP_OPEN 成功、并且如果其中一个队列未能分配、则我们将尝试在-1上调用 MQ_FREE、然后尝试在其中调用  Memory_free、 这将导致各种问题。 因此、基本而言 、NPITEK_OPEN  迫切需要错误处理、并在发生故障时释放任何分配的资源。 此外、 npiTaskStack 似乎 是完全冗余的、甚至从未使用过?  pthread_attr_setstacksize  仍会导致  pthread_create 分配栈、因此我们刚刚浪费了更多的 RAM、完全没有理由。

转到  NPIL_openTL 、我们会发现内存泄漏(npirxBuf、 npiTxBuf)、如果其中一个缓冲区未能分配、可能会导致内存损坏(实际上、它将尝试覆盖0x00000000 、因为它是闪存、但仍然不是好的做法)以及 TransportOpen 内的无限循环。  transportOpen 为 我的 NPILLUART_openTransport 别名、因此我转到这里。

还有两个可能泄漏的队列(uartQueueRec、 uartQueueSend)、但更令人烦恼的是、pthread 调用的"错误处理"是无限循环。 我正在为电池供电设备编写固件、蓝牙主要便于配置。 如果失败了、这是一种耻辱、我想如果最糟糕的事情发生得更糟、我可以复位。 但是、如果初始化从未真正返回并阻止低功耗模式、我将很快耗尽电池、这会使整个器件无用。  

很抱歉这个冗长的帖子、但我们能否在这个所谓的发布质量代码中得到一些错误处理? 我没有列出所有泄漏等、但我觉得我已经说明了我的观点。 我已经在自己编译、所以我将仔细研究并修复影响我的问题、但我不能成为唯一受此困扰的人。 我们至少可以得到:

  1.  NPILLUART_openTransport 的返回值、指示错误(清理任何分配的资源后)。 可能 SPI 也存在同样的问题。
  2.  NPITEK_OPEN 和  SAP_OPEN 中的资源清理
  3. SAP_OPEN 未返回  SNP_SUCCESS 时、保证我们至少未泄露任何资源。
  4. 能够配置队列深度、以便我们可以调整更多资源受限设备的内存要求。 我想知道、只在  NPI_TASK_POSIX.c 中的队列上放置_npix_t 而不是指针是否有意义、以保存4x16x4 = 256字节。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    坎贝尔
    感谢您的出色、详细的帖子、提醒我们这些需要改进的地方。 我将向我们的软件开发团队提出申请、以解决这些问题。

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

    感谢您提请我们注意这些问题。 我现在正在努力解决这些问题。 请预计下个月(4月)初发布。

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

    感谢快速的响应,我期待下一个版本:)

    当您查看此代码时、是否还可以确保在下一个版本中修复以下问题?

    e2e.ti.com/.../660592

    我认为线程的闭合方式也存在一些问题、例如 NPILLUART_closeTransport 会执行 pthread_join 以等待 UART 线程、但如果线程尚未连接(例如 SAP_OPEN、 然后立即执行 SAP_CLOSE调用线程中生成执行、然后 uartThread 仍会被调度运行、并将解除已发布的结构的引用)。 在正确打开/关闭 SAP 并注意问题之前、您需要在我的上述链接中找到修复程序。

    如果能测试一下、因为可能还有更多的问题我还没有遇到过、但我很感谢快速响应和持续的工作、因此感谢您!