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.

[参考译文] CC2745R10-Q1:CC2745R10-Q1–在 changeCB 中使用调用函数+队列发送时、即使进行单次写入(任何大小)、GATT 也会超时

Guru**** 2694555 points

Other Parts Discussed in Thread: CC2745R10-Q1

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1591644/cc2745r10-q1-cc2745r10-q1-gatt-timeout-even-on-single-write-any-size-when-using-invokefunction-queue-send-in-changecb

器件型号: CC2745R10-Q1

尊敬的 TI 团队:

器件:CC2745R10-Q1

SDK:SimpleLink 低功耗 F3 SDK 9.14.00.xx (BLE5-Stack)

 

问题描述

我们观察到、BLE 连接始终如一 GATT 超时 (原因 0x08 0x13 ) 单路 从中央设备进行 GATT 写入。
出现问题 系统 我们会将写入事件转发到 FreeRTOS 队列。 如果我们避免发送到队列、则连接保持稳定。

有效载荷大小无关紧要(1 字节、40 字节等)、并且不会重复或垃圾处理写入。


事件流程

  1. 手机写入特性

  2. BLE2Service_writeAttrCB()→调用 BLE2Service_callback(paramID)

  3. BLE2Service_callback()执行:

    • ICall_malloc()

    • BleAppUtil_invokeFunction()

  4. BleAppUtil 任务环境运行→BLE2Service_invokeFromFWContext()→派单以注册的变更回调

  5. 在我们的变更回调BLEService2_changeCB () 中、我们目前执行以下操作:

memcpy();
xQueueSendToBack(myQueue, &msg, 0);

xQueueSendToBack()始终返回pdPASS


观察

即使队列发送是立即的、调用的回调内部花费的总时间仍然是几毫秒(由于 malloc、memcpy 和调试日志记录)。

我们现在明白这个回调是在中执行的 时间关键型 BleAppUtil 上下文 、且此处的任何延迟似乎会干扰 BLE 堆栈计时、从而导致对等设备与 GATT 超时断开。

 

问题

当需要进行内存分配/记录/解析时、当前官方建议使用哪种方法 (2025、BLE5-Stack 9.x) 将 GATT 写入事件(或者只是 paramID)从写入回调安全转发到我自己的 FreeRTOS 应用任务?

 

对于生产/Q1 项目、我只需要在 CC2745R10-Q1 上准确检测到 100%安全的几条线路。

 

谢谢!

 

此致、

教区 Jain

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

    您好:

    很抱歉耽误您的时间。

    因此,您正在获得 writeAttribute 的回调,并且您正在通过队列将该数据发送到另一个线程? 我的理解是否正确?

    一种方法是在回调内调用 BLEApp 功能、以便 Util_Invoke 队列有时间运行该事件。 否则、您可以使 memcpy 发生在服务代码中、而不是通过回调。

    不过、我认为看到更多的代码有助于我找到更好的方法。

    此致、

    Nima Behmanesh

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

    嗨、Nima、谢谢您解决了我的问题。