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:添加 CPP 文件后 CC2640R2F 服务发现失败

Guru**** 2614265 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1004838/cc2640r2f-cc2640r2f-service-discovery-fails-after-i-added-cpp-files

器件型号:CC2640R2F

TL;DR;
在 SimplePeripheral off chip OAD 示例中、如果我们向 BLE 配置文件添加引用、即使我们未注册它、服务发现也会失败。

我们的 CPP 项目的唯一调用是622。 但不执行此调用、因为 addMyProfile 变量为0。 因此、与原始 SimplePeripheral 项目的唯一区别是正在链接 CPP 文件。 他们从未被称为。

我们尝试了 SimpleLink 4.30.0.08和5.10.0.02版的 SimplePeripheral。

更长版本:

我们一直在使用 CPP 开发中级库、以简化我们的开发流程。 我们隐藏了几乎所有的函数、TI 公开的所有头文件都使代码更具便携性。  我们成功地将库用于不同的项目、并希望移植使用 TI 框架的旧项目之一。 在使用新的中级类之前、我们将.c 文件转换为.cpp 文件并编译了代码。 但是、当我们将配置文件添加到 BLE 器件时、服务发现失败。 我们添加的内容如下所示:

blePeripheralDevice()->addLegacyProfile(MyProfile_AddService());

然后、我们没有添加配置文件、而是尝试了以下操作:

LegacyBlePeripheralProfile myProfile(MyProfile_AddService);
//blePeripheralDevice()->addProfile(&myProfile);

注意:我出于 NDA 的目的使用了 MyProfile。  

我们调用 LegacyBlePeripheralProfile,因为在我们的 CPP 库中,我们自动生成低级内容,例如用于服务的 ATT 表以简化开发,并且在移植旧代码时,我们创建了一个调用寄存器函数的中级类,而不是生成 ATT 表等。 LegacyBlePeripheralProfile 只是保存指向 给定函数的指针的类。

此代码也失败。 它不会调用任何移植的模块、只保留参考。 然后我们决定尝试 SimplePeripheral 示例中移植的模块、以查看我们是否处理了任何与 BLE 相关的功能。 我们复制了源代码、并添加了一个受保护的调用、如 TL;DR;部分所示。 结果是相同的。。。 即使不调用 CPP 模块中的任何函数、只需将 CPP 模块链接到 SimplePeripheral 案例服务发现就会失败。

我们错过了什么? 谢谢。。。

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

    您好!

    我已指派一位专家到此主题进行评论。  

    此致、

    1月

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

    谢谢。。。 何时可以从专家处获得任何回复? 由于我们正在迁移我们的代码库、这个问题变得受阻。

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

    今天、我们看到只有 iPhone 出现问题。 Android 可以连接。 差异如下所示。

    当我们不链接 CPP 文件时、如果我们尝试使用 iPhone 进行连接、则会运行代码的以下部分:

      else if (pMsg->method == ATT_MTU_UPDATED_EVENT)
      {
        OAD_setBlockSize(pMsg->msg.mtuEvt.MTU);
        Display_print1(dispHandle, SBP_ROW_STATUS2, 0, "MTU Size: %d", pMsg->msg.mtuEvt.MTU);
      }
    

    但是、无论我们是否链接 CPP 文件、Android 都不 会生成 MTU 更新。 该部分未执行。

    当我们链接 CPP 时、iPhone 的 ATT_MTU_updated_event 看起来不会被处理、手机会等待回复。

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

    您好、Deniz、

    请参阅我同事的以下回复: https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/446343/cc26xx-ble-v2-1-and-c 

    我将尽力帮助解决此问题、但请尝试参考 e2e 帖子中的建议。

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

    你好 Ammar。。。

    您提供的链接只是关于编译代码。 我们已成功编译 CPP 文件超过6个月。 唯一缺少的器件是"将 c/c++项目编译设置更改为"基于扩展"。 那是什么?

    我们已经完成了这些工作,并且做了更多的工作:清理 了 simple_peripheral_oad_offchip 以查找 LED、按钮、菜单等不相关的内容,并将其简化为 BLE 外设。 我们创建了 BLE 类,它无法通过 PeripherblealDevice()-> open()等进行打开和关闭。 将所有基于结构和切换的事件替换为回调,例如 onDeviceConnected()->connect( function);等等。 等等

    对于不同的项目、我们的封装效果非常好。 我们在 C++中使用了 SPI、I2C、ADC 模块。 当我们想要移植 3 年历史的项目时、问题就会出现。 我们首先将.c 转换为.cpp。 我们没有对这些.cpp 进行任何调用、只是将它们链接起来会导致项目停止运行、正如我所描述的那样。

    不是很奇怪? 唯一的区别是闪存布局、因为有额外的功能。

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

    我将所有文件转换回.c 删除了我们的所有框架、创建 了一个干净的 SimplePeripheral 副本、并将所有文件复制到新创建的项目中。 然后、我更新了 simple_peripheral_oad_offchip.c、如下所示:  

      SimpleProfile_AddService(GATT_ALL_SERVICES); // Simple GATT Profile
    
      volatile int canAdd = 0;
      if (canAdd)
          MyProfile_AddService();

    服务发现失败。 如果我注释掉第4行和第5行、SimplePeripheral 将按预期工作。 此问题与是否使用 C++无关。  

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

    我努力剥离我们的代码。 它看起来像任何对 PWM_init、PWM_open 的引用都会导致问题。 我取代了"参考"。 因为这些函数未被调用..

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

    问题与此类似。 很遗憾、开发人员停止了项目工作。

    https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/741698/cc2640-i-can-not-discover-the-services-characteristics-of-my-cc2640-when-adding-pwm-driver-using-multiple-different-hosts

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

    您好、Deniz、

    感谢您的更新。

    [引用 userid="144578" URL"~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1004838/cc2640r2f-cc2640r2f-service-discovery-fails-after-i-added-cpp-files/3715016 #3715016"]似乎任何对 PWM_init、PWM_OPEN 的引用都会导致问题。 我取代了"参考"。 因为这些函数未被调用。

    这很有意思。 我想在我的最后尝试并复制这一内容 您能否提供您为解决问题而执行的任何步骤? 我将并行工作、尝试将 PWN 驱动程序添加到示例中、以查看我是否遇到问题。

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

    尊敬的 Ammar:

    我将代码剥离到发现恢复的程度。 问题是内存、堆。 起初我没有怀疑、因为我们的代码使用的字节小于900字节、而对于2021年、应用的1KB RAM 不会太多。

    我观看 了 HEAPMGR_SIZE、 heapmgrMemFail、 heapmgrMemFreeTotal 变量。 我在 没有使用代码的情况下尝试将 SBP_TASK_STACK_SIZE 设置为2048 (清理简单外设示例)。 结果如下:

    裸片 使用我们的规范 堆栈大小
    设置为2048
    HEAPMGR_SIZE 5652 4764 4604.
    HeapmgrMemFreeTotal 2760在 运行
    1500  
    1824跑步
    564
    1712运行
    452 AT Connect
    HeapmgrMemFail 0 1 2.
    结果 成功 失败 失败

    一个裸片简单外设使用大约14KB 的20KB、为堆留下5648字节。 使用此数量、发现将按预期工作。  当我们引入代码分配时、某些时候会失败。 看起来堆栈尝试分配的字节超过~550字节、但失败了。 堆栈大小增加示例也是如此。

    我尝试使用 cache_as RAM 宏将超速缓存用作 ram.. 链接器不会将 任何内容放入缓存中、但是堆大小会减少4个字节! 使用 cache_as RAM 时、系统使用更多 RAM。  

    我尝试 处理.cfg 文件。  编译将 HEAPMGR_SIZE 设置为4192、但结果 HEAPMGR_SIZE 为几百、但为4192。 在链接时、将其增加到5600以上将失败、这与"自动"内联。

    我还记得、3年前、我们通过弃用 SDK、驱动程序和板级配置文件来减少 SDK 的内存使用。 我们保存了几个 KB、以便我们的项目能够运行。 我不想再使用新 SDK 执行此操作。 因为这样做会使移植非常痛苦。  

    是否有办法降低堆栈内存消耗? 给用户留下小于1KB 的空间是一种很糟糕的做法。 或者是否有方法将缓存用作堆或将缓存添加到堆的分配列表中?

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

    您好、Deniz、

    很抱歉、您遇到了此存储器限制。 我们使用较新的器件(CC26x2)解决了这个问题。 为了减小内存占用空间、您可以尝试一些操作。 高速缓存、因为 RAM 是其中之一。 您是否执行了此处概述的步骤(http://software-dl.ti.com/simplelink/esd/simplelink_cc2640r2_sdk/3.40.00.10_new/exports/docs/ble5stack/ble_user_guide/html/ble-stack-common/cache-as-ram.html )? 很抱歉、我们指南的当前版本没有此部分出错。

    您还可以进一步优化某些内容、如下所述: https://software-dl.ti.com/simplelink/esd/simplelink_cc2640r2_sdk/5.10.00.02/exports/docs/blestack/ble_user_guide/html/ble-stack-3.x/creating-a-custom-bluetooth-low-energy-application.html#optimizing-bluetooth-low-energy-flash-and-ram-memory-usage 

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

    我解决了以下问题:
    CC2640R2F:未执行启用 cache_as RAM main()-蓝牙论坛- BluetoothRegistered︎- TI E2E 支持论坛

    您必须使用 CASHE_AS_RAM、因为框架留给用户几百个。 因此、我希望将来 TI 能够增加 RAM、或者更好地减少框架的 RAM 用量。