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.

[参考译文] CC2564MODA:CC256XSTBTBLESW v4.0.2.2和 FreeRTOS 关闭堆栈问题

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1032889/cc2564moda-cc256xstbtblesw-v4-0-2-2-with-freertos-close-stack-problems

器件型号:CC2564MODA
主题中讨论的其他器件:CC256XSTBTBLESW

早上好

我将 CC2564Moda 模块与 STM32F4DISCOVERY 板配合使用、以运行 A3DP 灌电流演示固件、并具有 CC256XSTBTBLESW 协议栈和 FreeRTOS。

系统运行良好,但如果我尝试使用 CloseStack ()例程关闭堆栈,然后尝试使用 InitializeApplication ()例程重新打开它,则会出现错误-4。

我认为问题是 CloseStack ()例程无法关闭创建堆栈的两个线程,即 TimerThread ()和 HCIallbackThread ()。

另一方面、RxThread 已正确闭合。

我看不到这两个例程的内容、您能告诉我如何正确关闭它们、或者如何管理堆栈的关闭和重新打开?

提前感谢您的支持

米歇尔

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

    嗨、Michele、

    您在开始演示时是否看到这些命令?

    是否可以尝试运行 CloseSlink()?

    谢谢、
    Jacob

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    早上好、Jacob
    感谢您的回答。
    我正在制造电池供电的音频设备、因此在不需要时需要关闭蓝牙。
    我看不到命令屏幕、因为我更改了固件、但我可以提供这些命令。
    当我打开蓝牙时,我运行 InitializeApplication ()例程,设备工作正常。
    我还尝试运行 CloseSink ()和 OpenSink ()命令,正如您所说,一切都正常。
    但我不想关闭端点、我想关闭器件并关闭堆栈、然后在需要时重新激活它们。
    显然,CloseStack ()例程不能正确关闭所有内容,也不能清除内存以执行重新引导。
    如果 TimerThread ()和 HCCallbackTread ()是线程包装程序例程,则必须有某种方法使它们自然终止。
    还必须重新初始化库中各个隔离专区的变量。
    有什么方法可以做到这一点吗?
    我当前如果启动 CloseStack (),则无法正确重新打开该堆栈。
    如果可以、请尝试将器件分出、关闭堆栈、然后重新激活所有内容。
    再次感谢您的支持。
    米歇尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Michele、

    正如您可能看到的那样,CloseStack()调用 BSC_Shutdown (),关闭蓝牙协议栈。  可以通过 BSC_Initialize()调用重新打开栈。  

    我将查看是否有其他选项、下周再见。  

    谢谢、
    Jacob

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

    早上好、Jacob

    您所写的正是我所做的、问题是 CloseStack ()/BSC_Shutdown ()/BTPS_DeInit ()不能正常工作:

    1_不会关闭堆栈打开的所有任务、例如 TimerThread ()和 HICallbackTread ()

    2_它不会关闭其他打开的 FreeRTOS 对象、例如 KernelMutex

    3_它无法正确地重新初始化库各个部分的存储器、因此即使调用 BSC_Initialize ()堆栈也无法正确重新打开

    我设法通过我的代码关闭任务和其他部分并手动清理内存的调试部分来重新打开堆栈、因为库、我不知道这些调试部分对应的内容、 但这不是运行方式,CloseStack ()必须这样做

    我相信,如果您的固件开发人员尝试执行 CloseStack (),然后尝试执行 BSC_Initialize (),它可以验证这一点。

    我目前正在项目中使用 FreeRTOS 内核 V10.3.1。

    谢谢

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

    嗨、Michele、

    我将在周五之前在这里跟进更多建议。

    谢谢、
    Jacob

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

    早上好、Jacob

    在这几天里、我继续进行蓝牙测试、今天我看到了一些可以帮助我们解决我在前面的消息中给您写的问题的东西。

    我看到了:

    1_如果我在不执行任何操作的情况下打开蓝牙堆栈并将其关闭、则堆栈无法正确关闭、无法重新打开。

    2_如果我打开蓝牙堆栈、将设备与手机配对、然后取消配对并关闭堆栈、堆栈无法正确关闭、无法重新打开。

    3_如果我打开蓝牙堆栈、我将设备与手机配对、然后用配对的设备关闭堆栈、堆栈将正确关闭、可以重新打开。

    堆栈程序似乎需要器件配对才能正确关闭。

    我希望这些信息对您有所帮助

    再见

    米歇尔

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

    嗨、Michele、

    感谢后续行动。 我的测试计划是修改 A3DP 接收器演示、并尝试关闭(CloseStack)并重新打开堆栈(BSC_Initialize)。 我还将了解我是否可以通过设备配对复制上述步骤。 明天我将尝试跟进、但可能是星期五、然后我才回复。

    谢谢、
    Jacob  

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

    嗨、Michele、

    [引用 userid="497398" URL"~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1032889/cc2564moda-cc256xstbtblesw-v4-0-2-2-with-freertos-close-stack-problems/3824845 #3824845"]

    1_如果我在不执行任何操作的情况下打开蓝牙堆栈并将其关闭、则堆栈无法正确关闭、无法重新打开。

    2_如果我打开蓝牙堆栈、将设备与手机配对、然后取消配对并关闭堆栈、堆栈无法正确关闭、无法重新打开。

    3_如果我打开蓝牙堆栈、我将设备与手机配对、然后用配对的设备关闭堆栈、堆栈将正确关闭、可以重新打开。

    [/报价]

    在完成这些步骤时、我会遇到类似的结果。 每次我调用 CloseStack()时,演示程序都不能正确关闭,似乎挂起。 但是、您提到在与手机配对后成功关闭了堆栈。  

    您的 CloseStack()是否同时包括对 BSC_Shutdown 和 BTPS_DeInit 的调用?

    谢谢、
    Jacob

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

    很抱歉、Jacob 或点击了错误的按钮、但不回复。

    是的、在我的 CloseStack ()中、有 BSC_Shutdown ()和 BTPS_DeInit ()、但问题肯定出在 BSC_Shutdown ()中。

     我看不到库代码、但可能有一个控件阻止在特定条件下关闭栈。

    在 BTPS_DeInit ()中、我添加了 KernelMutex 关断功能、如果不是、它就会一直挂起。

    很抱歉、我无法为您提供更多帮助、我看不到 BSC_Shutdown ()代码。

    再见

    米歇尔

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

    嗨、Michele、

    没关系、这很有帮助。 我将尝试将 KernelMutex 关断功能添加到我的代码中。

    谢谢、
    Jacob

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

    你(们)好雅各

    你过得怎么样

    你那对我有新消息吗?

    谢谢

    米歇尔

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

    嗨、Michele、

    现在还没有更新、明天我将继续进行更多更新。

    谢谢、
    Jacob

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

    嗨、Michele、

    您能否尝试使用另 一个 E2E 主题中的代码片段 来查看这是否能解决您的问题? 它显示了一个如何正确关闭和重新初始化蓝牙堆栈的示例。

    if(BluetoothStackID)
    {
    /* Simply close the Stack */
    BSC_Shutdown(BluetoothStackID);
    
    Display(("Stack Shutdown.\r\n"));
    
    /* Flag that the Stack is no longer initialized. */
    BluetoothStackID = 0;
    
    /* Flag success to the caller. */
    ret_val = 0;
    }
    else
    {
    /* A valid Stack ID does not exist, inform to user. */
    ret_val = UNABLE_TO_INITIALIZE_STACK;
    }
    
    And here is our code snippet for Initialize
    
    if((HCI_DriverInformationCopy))
    {
    Display(("\r\n"));
    Result = BSC_Initialize(HCI_DriverInformationCopy, 0);
    Display(("Result: %d\r\n", Result));
    if(Result > 0)
    {
    /* The Stack was initialized successfully, inform the user */
    /* and set the return value of the initialization function */
    /* to the Bluetooth Stack ID. */
    BluetoothStackID = Result;
    Display(("Bluetooth Stack ID: %d\r\n", BluetoothStackID));
    
    }
    else
    {
    /* The Stack was NOT initialized successfully, inform the */
    /* user and set the return value of the initialization */
    /* function to an error. */
    DisplayFunctionError("Stack Init", Result);
    
    BluetoothStackID = 0;
    
    ret_val = UNABLE_TO_INITIALIZE_STACK;
    }
    }

    谢谢、
    Jacob

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    早上好、Jacob
    非常感谢你的帮助。
    很遗憾、您的研究对我没有帮助、我已经完成了该代码中描述的工作。
    我需要查看 BSC_Shutdown ()内部哪些条件下堆栈不能正确关闭。
    您可以看到 BSC_Shutdown ()、TimerThread ()、HCCICallbackTread ()的代码、进入调试并查看哪些代码未正确关闭它们?
    如果您向我发送了库代码、我也可以自行查看这些内容。
    很抱歉、我必须找到问题的解决方案、或者切换到其他设备、让我可以执行我想要的操作。
    谢谢
    米歇尔
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Michele、

    我正在尝试一种新的解决方案、并将在测试后于明天返回给您。

    谢谢、
    Jacob

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

    嗨、Michele、

    我认为 OpenStack 和 CloseStack 调用工作正常。 我认为您看到的-4错误是指音频信宿 初始化中的函数错误、而不是 HCI 初始化错误。 必须在 CloseStack 例程中将 AUDIBLEED 变量指定为 false,以确保在 Initialize_Sink 例程期间重新初始化接收器。  

    使用下面的代码、我可以关闭堆栈、打开堆栈并执行类似查询的 BT 功能。  

    int CloseStackCommand(ParameterList_t *TempParam)
    {
        int ret_val = -1;
        if(BluetoothStackID)
        {
            /* Simply close the Stack */
            BSC_Shutdown(BluetoothStackID);
    
            Display(("Stack Shutdown.\r\n"));
    
            /* Flag that the Stack is no longer initialized. */
            BluetoothStackID = 0;
            AUDInitialized = FALSE;
            /* Flag success to the caller. */
            ret_val = 0;
        }
        else
        {
            /* A valid Stack ID does not exist, inform to user. */
            ret_val = UNABLE_TO_INITIALIZE_STACK;
        }
        return ret_val;
    }
    
     int OpenStackCommand(ParameterList_t *TempParam)
    {
      int ret_val = -1;
        Display(("\r\n"));
        int Result = OpenStack(&HCI_DriverInformation, &BTPS_Initialization);
        Display(("Result: %d\r\n", Result));
        if(Result >= 0)
        {
            /* The Stack was initialized successfully, inform the user */
            /* and set the return value of the initialization function */
            /* to the Bluetooth Stack ID. */
            ret_val = 0;
            //BluetoothStackID = Result;
            Display(("Open Stack Successfully - BT Stack ID: %d\r\n", BluetoothStackID));
        }
        else
        {
            /* The Stack was NOT initialized successfully, inform the */
            /* user and set the return value of the initialization */
            /* function to an error. */
            DisplayFunctionError("Stack Init", Result);
            BluetoothStackID = 0;
            ret_val = UNABLE_TO_INITIALIZE_STACK;
        }
        return ret_val;
    }

    您可以尝试此解决方案吗?

    谢谢、
    Jacob

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

    雅各布晚上好

    一如既往地感谢您的帮助。

    我已经在执行与您在我的固件中建议的类似的操作、但公平地说、我尝试了您的代码、但它不起作用。

    但今天我也有好消息、我知道问题在哪里以及如何解决。

    正如我告诉过的、有必要分析堆栈打开的线程、即 TimerThread ()、HCCallbackTread ()和 RxThread ()。

    如果要关闭堆栈然后重新打开它、程序需要正确关闭它创建的所有任务并清除内存。

    这只有在三个线程自然关闭时才能完成。

    RxThread ()在一个信标处停止、所以只需关闭 HCI 串行、设置 HCITransportOpen = 0、最后提供信号来解锁它。

    代码是可见的,您可以在 HCITR_COMClose ()例程中找到它,它如下所示:

           /*向接收线程发送信号以终止接收线程并等待它达到*/
           /*关闭。 *
          xSemaphoreGive (UartContext.DataReceivedEvent);
          while (UartContext.ReceiveThreadHandle)
            BTPS_DELAY (1);

          /*关闭信标。 *
         vQueueDelete (((xQueueHandle)(UartContext.DataReceivedEvent));

    HICallbackTread ()不可见,正在等待一个应该从库到达的邮箱。 当我关闭堆栈时、我不会立即启动 CloseStack ()、但我执行以下过程:

    整数 CloseApplication (空)

      int ret_val = 0;

      //尝试关闭端点
      RET_val = CloseA3DPEndpoint (NULL);

      如果(!ret_val)
      {
       //尝试设置连接的设备不可配对。
       RET_val = GAP_SET_Pairable_Mode (BluetoothStackID、pmNonPairableMode);

       如果(!ret_val)
       {
        //尝试设置连接的设备不可发现。
        RET_val = GAP_SET_DISCONNICE_Mode (BluetoothStackID、dmNonDiscoverableMode、0);

        如果(!ret_val)
        {
          //尝试将连接的设备设置为不可连接。
          RET_val = GAP_SET_connectable_Mode (BluetoothStackID、cmNonConnectableMode);
         }
       }
      }
      其他
      {
        //尝试关闭端点时出错。
       显示("无法关闭端点。\r\n);
      }

      //现在,尝试关闭堆栈
      RET_val = CloseStack ();

      /*删除所有存储的链接密钥。 *
      BTPS_MemInitialize (&A2DPRemoteBD_ADDR、0、sizeof (A2DPRemoteBD_ADDR));

      DeleteLinkKey (A2DPRemoteBD_ADDR);

      //if (RET_val < 0)
      //{
      // DisplayFunctionError ("CloseStack"、RET_val);
      //}

    return (ret_val);

    可能有些步骤太多、重要的是执行 CloseA3DPEndpoint (NULL)、因为如果蓝牙设备配对或流式传输、我们首先中断连接、然后关闭堆栈。

    与蓝牙器件和库的通信交换会导致邮箱消息被发送到 HCCICallbackTread (),当 RxThread ()关闭时,HCCallbackTread ()解锁并关闭。

    如果蓝牙设备未配对,则会出现问题,因为即使强制调用 CloseA3DPStream (),该库也不会将邮箱消息转发到 HCICallbackTread (),因此仍然被阻止,并且不会关闭。

    为了使其关闭、我更改了 HCITR_COMClose ()下的代码、如下所示:

      /*向接收线程发送信号以终止接收线程并等待它达到*/
      /*关闭。 *
      BTPS_AddMailbox (MailboxHeaderCopy、(void *) a);

      xSemaphoreGive (UartContext.DataReceivedEvent);
      while (UartContext.ReceiveThreadHandle)
        BTPS_DELAY (5);

      /*关闭信标。 *
      vQueueDelete (((xQueueHandle)(UartContext.DataReceivedEvent));

    它在哪里

    MailboxHeaderCopy 是创建时我复制的邮箱标头的副本

    a 是 int a [2]={0、0};

    这会导致 HICallbackTread ()解锁并关闭。 我还稍微增加了等待时间、以确保两个任务都正确关闭。

    TimerThread ()我不知道它是如何完成的,但如果前两个线程关闭了,那么它也关闭了。

    我认为这不是解决问题的正确方法、因为我不应该知道或管理邮箱、无论设备是否配对、都必须由库发送正确的消息。

    不过,我希望这对所有有此问题的人和应该更新图书馆的人都有所帮助。

    我获得了多少积分? 笑话

    再见

    米歇尔

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

    很高兴听到 Michele 的讲话、这是一个很好的回答。 我相信、未来的用户将会感激您分享的可解决 CloseStack 问题的建议。

    对于这个问题、我个人会给您+50分、但 TI 会根据 这个图表处理分数

    感谢您的贡献、

    Jacob