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:我需要有关从BLE-5堆栈解码HCI_BLE_HARDWARE_ERROR_EVENT_CODE错误的帮助

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1093061/cc2642r-i-need-help-decoding-the-hci_ble_hardware_error_event_code-error-from-the-ble-5-stack

部件号:CC2642R

我正在使用带CCS 10.3 .1.0.0003万 的simplelink_cc13x2_26x2_4_20_01_04。

我使用的是传统的TI编译器(而不是iclang)。

我使用的是自定义硬件,无法在LaunchPad上测试代码。

我的项目基于simple_peripheral_oad_offchip示例。

我从 iPhone/iOS应用程序连接到设备时,'AssertHandler()'偶尔会挂起。  故障很少发生,很难重现。 在我尝试连接到设备的次数中,这种情况可能只有1/50次。 (但是,当 我向重要的人演示时,这种情况确实会发生)。

我只看到AssertHandler()在连接时挂起。 连接设备后,我从未见过此断言。

我在AssertHandler()中输入了一个b/p,并且能够跟踪对SimplePeripheral_processStackMsg()函数的调用AssertHandler。

根据代码示例和其他论坛帖子的建议,我在下面添加了硬代码,尝试收集有关错误的其他信息。 我还将对AssertHandler()的调用替换为我的自定义'sm_abort()函数,该函数将记录致命错误(带有时间戳)并刷新,以便我们可以对任何致命错误进行事后分析。 sm_abort()记录要刷新的字符串,然后重新引导设备。 当设备运行时,我们可以将这些错误字符串发送到移动电话以帮助调试。

错误日志中的消息为:   
2022年04月12日 14:19:25-07:00:事件(05)中止:BLE ERR:0x81,(0x91,0x10)  

有人能帮我解码此错误吗?   什么是0x81? 而0x91和0x10又如何呢? 我希望这些错误ID能让我了解一些事情。

请注意,我在下面附加了一些屏幕截图,其中显示了任务堆栈(一切看起来都正常)以及各种memmgr变量的值。 我的堆看起来不是太小。

非常感谢您的任何提示!

谢谢!

卡尔-


        case HCI_BLE_HARDWARE_ERROR_EVENT_CODE:
        {
          char abortBuf[32];
          /*
           * According to this forum page, '81' indicates a memory allocation error.
           * e2e.ti.com/.../cc2640r2f-hal_assert_cause_hardware_error
           */
          hciEvt_HardwareError_t *hardCode = (hciEvt_HardwareError_t *)pMsg;
          System_snprintf(abortBuf, 32, "BLE ERR: 0x%x, (0x%x, 0x%x)", hardCode->hardwareCode, hardCode->hdr.event, hardCode->hdr.status);
          SM_abort(abortBuf);
          break;
        }

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

    您好,

    我已指派一名专家就此采取后续行动。 同时,错误代码在ll_common.h和hci.h文件中定义。 浏览这些文件后,0x81似乎是HW_FAIL_OUT或ORT_MEMORY。 我建议在调试中运行项目,观察内存和堆消耗情况,以查看项目是否内存不足。 我建议您参考  《用户指南》的“调试常见堆问题”部分。 我还建议您研究 调试内存问题。 问题似乎出在内存中,因此我会使用提供的资源来查看内存消耗情况,看看问题是否存在。

    此致,

    一月

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

    感谢您的回复。 我期待着专家提供更多的见解。 我找到了这些文档,这就是我如何启用堆度量的方法。 我在原始帖子的屏幕截图中包含了这些变量的值。 根据我在这些变量中看到的值,我的堆似乎应该足够大。 我还注意到“失败”计数变量是'0',这让我认为我没有任何内存分配错误。

    2个问题:

    [1] 0x91和0x10是什么意思?  我在您建议的任何一个.h文件中都看不到0x91。 我希望这2个值能提供一些关于BLE堆栈中发生的情况的线索。
    [2] 20K堆对于相对简单的BLE应用程序是否足够大? 此应用程序有两个r/w字符以及一个通知频道,我使用它将176字节的通知从设备发送到iPhone。 我的应用程序没有自己进行任何动态内存分配。 所有数据结构都声明为静态变量(不调用Memory_alloc()或XYZ_create())。

    感谢您的帮助!

    卡尔-

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

    你好,Karl,

    由于假期即将到来,我将在2018年4月18日星期一之前无法对此发表评论。 感谢您的耐心等待。

    同时,请查看 硬件配置指南。 如果运行未经修改的simple_peripheral示例,您是否会看到此行为?

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

    你好,Ammar --

    您是否能够跟踪0x91和0x10? 屏幕快照中有关堆变量的任何注释? 我不认为这是堆大小问题,而是其它一些碎片? 我是否有办法检查碎片?

    谢谢!
    卡尔-

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

    你好,Karl,

    感谢您的耐心等待。 0x91映射到事件类型,在本例中为 HCI_Gap_EVENT_EVENT。 0x10映射到状态 HCI_BLE_HARDWARE_ERROR_EVENT_CODE。 遗憾的是,这并没有给调查增加任何价值,简单地说,堆栈在连接期间无法分配内存。

    虽然指标未显示分配失败,但可能堆栈未找到合适的匹配块以供使用,然后无法分配,即使技术上存在空间。 如果没有足够大的块来分配需要分段的PDU (即 >27字节)。 我会尝试增大HEAPMGR_SIZE以查看问题是否仍然存在,我认为默认值为30k。 您可以尝试一下吗?

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

    谢谢Ammar。

    是否确定这是内存分配错误? 我推回的原因是内存调试变量表明我有足够的可用堆空间,并且没有任何分配问题。 请注意,heapmgrMemFail为'0',这表示没有分配失败。 另请注意,heapmgrMemUB为'1.1264万',HEAPMGR_SIZE为'2.3764万'。 在我读取文档和代码的方式中,heapmgrMemUB是已分配堆中的最大偏移。 1.1264万远远小于堆大小,这使我相信堆的2.3764万-11264字节1.1264万字节从未 被分配过。  

    此问题间歇性极高,对我来说很难重现和调试。 它仅发生在连接上。 我将继续尝试寻找方法,使其更容易失败,以便我能够深入了解其底部。 我添加了一些重置/重新启动逻辑,这是暂时的解决方法,但我希望我能找到此问题的根本原因。


    谢谢!
    卡尔-

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

    你好,Karl,

    正确,堆栈仅在内存分配失败时返回此错误事件代码。

    请告诉我增加尺寸是否有帮助。 也许作为临时调试/学习步骤,您可以为某些固定变量分配大量空间,以模拟内存受限的设备,并查看是否可以重现相同的错误代码。

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

    你好,Ammar --

    我不能增加堆大小。 我正在为我的应用程序使用RAM。 RAM大小在链接程序.cmd文件中自动计算,以使用"剩余的任何内容"。

    我尝试了你建议的一个变体。 我声明了一个大的伪数组,它占用RAM并使堆更小。 该阵列足够大,足以将应用程序置于足够大的堆的边缘。 我在该设置中收到分配错误,但应用程序似乎正常工作(我尚未完全确定"正在工作",但它仍然有效,可以与移动应用程序通信)。 代码必须正确检查malloc()返回值并执行一些合理的操作。 应用程序不会崩溃或最终进入AbortHandler()函数。 正如预期的那样,每当出现分配问题时,'heapmgrMemFail '计数器都会增加。 从我的原始屏幕截图中可以回忆起,在我的原始应用程序中,此值仍为'0'。  在更新的应用程序中,我还看到'heapmgrMemub'变量非常接近'HEAPMGR_SIZE '。 这是有道理的,因为我调校了堆大小以强制这些分配错误。 在我的原始应用程序中,'ub'变量是 距离HEAPMGR_SIZE有1.25万 字节,所以我相信有1.25万 字节的堆从未被接触过。

    这里还有其他堆在使用吗? 或者其他内存池分配失败?  还是堆栈中的其他代码路径使其看起来像分配问题?

    再次感谢您的帮助!


    卡尔-

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

    你好,Karl,

    我对拖延表示歉意。

    您是否可以在HEAPMGR_malloc()内放置一个断点来查看失败的分配发生在何处?  https://software-dl.ti.com/simplelink/esd/simplelink_cc13xx_cc26xx_sdk/6.10 .00.29 stack/exports.docs/bl5stack/ble_user_guide/html/ble-stack-5.x-guide/debuging_index.html#debuging_memory-problems

    您还可以查看  用户指南中的优化蓝牙低能耗堆内存使用部分,以删除应释放堆的未使用组件。

    同样,此错误代码仅在内存分配失败时返回。

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

    我查看了HEAPMGR代码,但我不知道它如何在不增加heapmgrMemFail变量的情况下返回NULL。

    我必须暂时搁置这一点。 我有一个解决方法。 我更新了AssertHandler(),以清除一些 关键状态,以刷新并重新启动设备。 我丢失了一些数据,但短期内没有问题。

    当我有时间 时,我计划更新到最新的SDK,希望此问题得到解决。 如果没有,我将再次进行跑步,如果我再次陷入困境,我将 打开一条新的线程,其中包含新的详细信息和问题。

    谢谢!
    卡尔-