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.

[参考译文] CC2642R:CC2642R:基于 CC2642R 平台上的 FreeRTOS 进行 BLE 开发

Guru**** 2837190 points

Other Parts Discussed in Thread: CC2642R

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1631689/cc2642r-cc2642r-ble-development-based-on-freertos-on-the-cc2642r-platform

器件型号: CC2642R

尊敬的 TI 工程师:

希望这封电子邮件对您有帮助。

我们在 simple_central 示例中以核心角色使用 CC2642R 器件。 我们注意到、当我们在 SimpleCentral_scanCb函数中注释掉以下行时:

if (SimpleCentral_enqueueMsg (event、success、pMsg)!= success) 

程序的内存使用量显著减少。 您能否帮助我们了解这种情况的原因、或者提供一些有关如何解决此问题的指导?

非常感谢您的时间和支持。

此致、
【登君杰】

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

    您好、

    感谢您联系我们。 这是预期行为、enqueueMsg 分配一条包含扫描结果数据的消息、并将其置于要处理的应用程序事件循环中以进行进一步处理。 此事件将占用 RAM、在处理数据的事件循环中将释放 RAM。

    此致、

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Jane。
    我们在使用它时遵循了以下步骤。 我已经释放了空间、为什么内存仍然大幅下降?
    void SimpleCentral_scanCb(uint32_t evt, void *pMsg, uintptr_t arg)
    {
        uint8_t event;
    
        if (evt & GAP_EVT_ADV_REPORT) {
            event = SC_EVT_ADV_REPORT;
        } else if (evt & GAP_EVT_SCAN_ENABLED) {
            event = SC_EVT_SCAN_ENABLED;
        } else if (evt & GAP_EVT_SCAN_DISABLED) {
            event = SC_EVT_SCAN_DISABLED;
        } else if (evt & GAP_EVT_INSUFFICIENT_MEMORY) {
            event = SC_EVT_INSUFFICIENT_MEM;
        } else {
            return;
        }
            //if (SimpleCentral_enqueueMsg(event, SUCCESS, pMsg) != SUCCESS)
        {
            if (pMsg != NULL) {
                ICall_free(pMsg);
            }
        }
    }


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

    您好、


    注释掉队列时内存使用量会减少。 为了更好地了解发生这种情况的原因、了解每个 GAP_EVT_ADV_REPORT 事件发生的两个单独的堆分配会有所帮助:

    分配 1—扫描报告结构(来自 BLE 栈):Scan_Evt_Adv 栈在 iCall 堆上分配一个 Gap BLE.Rpt_t 结构和一个单独的有效载荷缓冲区 (pAdvRpt->pData)。 这将以 pMsg 的形式传递到 SimpleCentral_canCb ()。

    分配 2—事件包装器(来自 enqueueMsg):SimpleCentral_enqueueMsg () 调用 iCall_malloc (sizeof (scEvt_t)) 以创建一个保存事件类型和指向扫描报告的指针的小型包装器结构、然后将其发布到应用程序事件队列。

    // simple_central.c — enqueueMsg allocates a wrapper every call:
    scEvt_t *pMsg = ICall_malloc(sizeof(scEvt_t)); // <-- allocation #2
    pMsg->pData = pData; // points to allocation #1
    Util_enqueueMsg(appMsgQueue, syncEvent, (uint8_t *)pMsg);


    在主动扫描期间、GAP_EVT_ADV_REPORT 可能会对所有信道上收到的每个广播数据包触发。 如果应用程序任务繁忙(例如处理连接)且事件队列备份、则大量的 scEvt_t 包装程序分配会同时累积在堆上。 注释掉 enqueueMsg 完全消除了这些包装,这就是为什么你看到显著的减少。

    我们在使用它时遵循了以下步骤。 我已经释放了空间、所以为什么内存仍然大幅下降?

    内存仍然丢失的原因是修改代码中的内存泄漏:Gap Scan_Evt_Adv Rpt_t 包含第二个堆分配—pData—这是一个单独分配的缓冲区、保存原始广播有效载荷。 您修改后的代码将释放结构、但不会释放这个内部缓冲区。

    在 BLE 栈头中(source/ti/ble5stack/inc/gap_sscanner.h、~第 588 行):

    typedef struct {
    // ... address, PHY, RSSI, etc. ...
    uint16_t dataLen;
    uint8_t *pData; // <-- SEPARATELY allocated advertising payload buffer
    } GapScan_Evt_AdvRpt_t;


    您当前的回叫:

    // MODIFIED (customer code) — LEAKS pAdvRpt->pData on every ADV_REPORT
    {
    if (pMsg != NULL) {
    ICall_free(pMsg); // Frees the GapScan_Evt_AdvRpt_t struct — OK
    // BUG: pMsg->pData (advertising payload) is NEVER freed!
    }
    }

    此致、

    1 月

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

    我懂了。 这解决了我的问题。 谢谢你