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.

[参考译文] LP-EM-CC2745R10-Q1:采用 TI CC2745R10-Q1芯片组的 BLE 应用设计。

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1470163/lp-em-cc2745r10-q1-ble-application-design-with-ti-cc2745r10-q1-chipset

器件型号:LP-EM-CC2745R10-Q1
主题中讨论的其他器件:CC2745R10-Q1

工具与软件:

您好!

我正在使用 TI CC2745R10-Q1芯片组设计一个 BLE 应用。  

下面是我的问题:

1.我想从 BLEApp_util 任务以外的不同任务调用 TI API。 是不是可以调用

示例: BLEAppUtil_advStart() API 我要从 UART 任务中调用

2.如果无法从不同的任务调用 TI API、那么我需要排队进入询问 TI 回调的同一队列  

API : BLEAppUtil_enqueueMsg ();--> BLEAppUtil_theardEntity.queueHandle。

要从不同的任务调用 BLEAppUtil、 将使用 BLEAppUtil_invokeFunction() API、以使实习生添加到具有不同 EVT -BLEAPPUTIL_EVT_call_in_BLEAPPUTIL_context 的同一队列中。

如果我执行此设计、我将会陷入竞态条件、即当我们有多个数据发送到 TI 时、同时如果我们收到 TI 的回叫。  

建议如何处理这种情况。

我在上面提到的问题的 PFA。

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

    您好!

    如果您处于不同的上下文中并希望调用 BLEAppUtil API、则必须使用 BLEAppUtil_invokeFunction 调用函数调用。

    您可以在中找到头文件 /common/BLEAppUtil/inc/bleapputil_api.h.  

    我建议使用此 API、因为这样比尝试使消息在 BLE 应用队列中排队更容易(但我想注意这仍然是可能的)。

    此致!

    Nima Behmanesh

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

    您好!

    感谢您的快速响应。 请查看下面的比赛条件代码片段。 UART 数据和 TI 回叫使用相同的队列将数据发送到任务、直到它们成为竞争条件的机会。 我不能在队列中接受互斥量/信标锁,因为同一队列被回调函数使用,而且我不能控制堆栈回调。 我可以控制的 UART 数据、因为它用于我们的应用

     

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

    尊敬的 Nima:

    您能帮助我如何处理与上述机制同步吗?

    我们将一次处理5个连接。还有一个缺点

    缺点: 1. 假设我们在一条 BLE 链路上接收到数据、因为触发了回调、因此我们必须请求数据

              2.同时,我从 UART 收到一些数据,其中我调用一些 API 到 TI 堆栈示例. 断开不同链路的连接  

              3.如果我锁定队列并尝试添加数据,则可能会丢失栈回调数据

    因为我们被阻止了开始实现。

    此致、

    Ramya Gumaste.

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

    您好!

    我对这个问题有点困惑。 UART 和堆栈操作不应相互干扰。  

    缺点: 1. 假设我们在一条 BLE 链路上接收到数据、因为触发了回调、我们必须查询数据[/报价]

    使 UART 数据进入队列? 哪些数据正在排队? 该堆栈具有最高优先级。

    2.同时我从 UART 收到了一些数据、其中我调用了一些 API 到 TI 堆栈示例。 断开不同链路的连接 [/报价]

    为了确保我理解正确、是否通过 UART 发送一条消息来断开 BLE 连接? 这是可能的、并在示例中完成。 显示器使用 UART、您可以通过显示器启动断开连接。  

    3.如果我锁定队列并尝试添加数据、则可能会丢失栈回调数据
    [/quote]

    为什么要锁定队列? 堆栈将始终具有优先级、因为它的线程具有最高优先级、所以实际上无法解决这一问题。 如果降低优先级、将会错过消息、但代价是获得 UART 数据。

    我不确定我是否正确理解了问题、但 BLE 堆栈的优先级最高、不建议更改此任务或具有相同优先级的任务、协议中有许多时序要求。  

    此外、BLE 线程是使用 FreeRTOS 创建的、因此您可以完全创建单独的线程。 为什么不创建一个处理 UART 任务的新线程?

    此致!

    Nima Behmanesh

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

    感谢 Nima 的更新。

    我们对申请的要求:  

    1. BLE 应用程序根据用户输入,通过 UART 接收来自 HMI 的一些请求(如连接、断开)。

    基于接收到的 BLE 应用调用 TI API 的请求。 该函数必须 通过在 BLEAppUtil_theardEntity.queueHandle 中通过 BLEUtil_invokeFunction()查询 BLEAppUtil_theardEntity.queueHandle 来完成 BLE util 任务。  

    2.收到的 TI 回电必须发送至 HMI。 在给定的示例中、接收到的数据也在同一队列 BLEAppUtil_theardEntity.queueHandle 中进行查询、该队列将在 BLE Util Task 中进行处理。

    查询:我的查询是如何处理两个同时的数据。  


    此致、

    Ramya  

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

    尊敬的 Nima:

    请帮助我查询此问题。

    此致、

    Ramya Gumaste.

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

    Ramya,

    我认为我们需要后退一步。  

    1.您可以有一个单独的 UART 线程来订阅 iCall 消息。  

    2.您可以在 BLEAppUtil 队列中创建自定义事件、这样、当发生回调时、您可以将 UART 数据存储在任何所需的数据结构中、以及用于处理这些数据的 POST 事件中。  

    示例:用户发送断开连接消息、线程收到这条触发回调的消息。 此回调将使断开事件进入队列、其中调用断开 API。

    这些是单核器件、因此不会同时发送/接收。 所以你需要找到一种方法来同步你所创建的线程。

    此致!

    Nima Behmanesh

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

    尊敬的 Nima:

    以下是我的理解、如果有误、请确认

    1.必须使用 BLE Util 任务来调用 TI API

    2. TI 回调数据应 根据 TI 定义的标准事件或自定义事件进入 BLEAppUtil_enqueueMsg ()的队列  

    3.如果 由于资源被 TI 回调占用而必须添加到 BLEAppUtil_enqueueMsg ()中的自定义事件失败、则应使用适当的同步方法  

    PFA 随附图像注释。  

    如果 BLEAppUtil_queue()繁忙、则在 TI 回调中、而不是使数据 BLEAppUtil_enqueueMsg ()排队以等待资源变为空闲状态。

    示例:

    void BLEAppUtil_advCB (uint32_t event、GapAdv_data_t * pBuf、uint32_t * arg)

    if (BLEAppUtil_enqueueMsg (BLEAPPUTIL_EVT_ADV_CB_EVENT、pData)!= SUCCESS)

    //自由数据

      队列被另一任务占用的 else //else 情况

    方法1:等待队列资源可自由使用、然后使数据进入队列

    方法2:本地将数据排队并释放回叫 pData

    }

    建议哪种方法更好。  

    如果我的理解有误、请更正我  

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

    您好!

    1. 必须使用 BLE Util 任务来调用 TI API

    简化视图。 TI  BLE  API 必须在   BLE Util 任务的上下文中调用。 但是、您可以使用解决这个问题  BLEAppUtil_invokeFunction  结构。 调用 BLEAppUtil_invokeFunction 将为您切换上下文并调用 API、并且您可以在 BLE Util 任务之外调用 BLEAppUtil_invokeFunction。

    2. TI 回调数据应 根据 TI 定义的标准事件或自定义事件 [/报价]在 BLEAppUtil_enqueueMsg ()上进入队列

    哪种回调数据? 如果是 UART、那么答案是 否定的 UART、SPI 和其他驱动程序 不 需要在 BLE App Util 任务中调用、而只需要在 Util 任务中调用 BLE API。 因此、建议您创建自己的任务。 您始终可以在 BLE App util 任务中获取的数据、将其移动到可以由其他任务处理的其他位置(例如缓冲区)。

    [报价 userid="639294" url="~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1470163/lp-em-cc2745r10-q1-ble-application-design-with-ti-cc2745r10-q1-chipset/5651826 #5651826"]

    PFA 随附图像注释。  

    如果 BLEAppUtil_queue()繁忙、则在 TI 回调中、而不是使数据 BLEAppUtil_enqueueMsg ()排队以等待资源变为空闲状态。

    示例:

    [报价]

    我从未在实践中看到过这种问题。 在大多数情况下、开发人员会创建自己的队列、而不使用 BLE 应用程序队列。 否则、您将需要使用同步方法。

    希望这对您有所帮助。

    此致!

    Nima Behmanesh

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


    谢谢 Nima,它提供帮助。

    另一个澄清:在上面提到的图片。 TI Stack 回调是指进入 BLEAppUtil_enqueueMsg ()队列的 TI 事件(例如 BLEAppUtil_pairStateCB  ()))。  

    当我调用  BLEAppUtil_invokeFunction () 在内部调用同一队列的其他任务中发挥作用。  

    if (BLEAppUtil_enqueueMsg (BLEAPPUTIL_EVT_CALL_IN_BLEAPPUTIL_CONTEXT、pDataMsg)!= SUCCESS)

    如何处理此队列的同步?  

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

    尊敬的 Ramya:

    我不相信你需要。 BLEAppUtil_enqueueMsg 最终调用 MQ_send、并根据上下文(是否在 ISR 中)使用正确的 FreeRTOS 队列函数。 我建议查看 MQ 发送的实现以查看错误代码。 例如、如果队列已满、则返回 EAGAIN、如何处理这一问题由开发人员决定。 另外、  如果队列繁忙、MQ_SEND 也会超时。

    不过、在大多数情况下、您不应该担心这个问题。 您是否运行过任何表明会出现竞态条件的测试? 我对此持怀疑态度、因为我们的应用程序最多可以同时使用32个连接、而且数据很少丢失。

    此致!

    Nima Behmanesh