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.

[参考译文] CC2340R5:第二个 UART2_Open 将在用户睡眠(200000)后失败

Guru**** 2587365 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1403656/cc2340r5-the-second-uart2_open-will-fail-after-usleep-200000

器件型号:CC2340R5

工具与软件:

SDK 版本:7.40.00.64

CCS 版本:12.7.0

在我首次使用 UART_WRITE 发送消息后、如果关闭 UART 200ms、然后打开、UART2_OPEN 将失败。 我发现输入 Hwip_disable ()后进程失败。 它是否与 ISR 上下文调用相关? 如果是、我应该如何解决?

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

    您好!

    我已尝试过此功能、但看不出同样的问题。 (这是在我假设 UART_WRITE_FLAG!= 0且 OUTPUT[0]!= 0的情况下实现的)。

    在您的情况下、UART_WRITE_FLAG 是否可能为0?
    如果是、则代码序列可能如下所示:

    1. UART2_OPEN
    2. usleep(200000);
    3. UART2_OPEN

    在这种情况下、预计第二个 UART2_OPEN 会失败。

    在这个确切的代码中、我建议将第一个 UART2_open 函数放在"if (UART_WRITE_FLAG)"块中。

    谢谢!
    Toby

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

    您好、Toby

    我可以正常使用 uart2callback 运行该项目、但只要我使用 basic_ble 项目、就会发生本文中所述的情况。 测试后、我发现这种情况会在调用"appMain"时发生。

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

    我想情况是、UART2_open 可能连续调用两次、中间没有 UART2_close。

    是否仅在单线程中使用/管理 UART2? 或者是否有多个线程正在尝试访问它?

    由于正在运行多个任务(BLE 应用、BLE 堆栈等)、因此在 BLE 项目中可能会发生这种情况。

    您可以尝试以下操作吗:

    在这个确切的代码中、我建议将第一个 UART2_open 放在"if (uart_WRITE_FLAG)"块中。

    或任何其他方法、以确保:

    1. UART2_OPEN / UART2_CLOSE 为一对应
    2. UART2_open 未连续调用两次

    例如、一个互斥量/信标会有所帮助。

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

    尊敬的 Toby:

    我确认仅在单线程中使用 UART2。  
    我尝试将第一个 UART2_open 放在"if (UART_WRITE_FLAG)"块中。 但仍然会发生。

    我推测尽管使用了 usleep (200000)、执行线程可能会运行以执行蓝牙、或者实际无法执行 UART2_close、所以发生这种情况?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我推测尽管使用了 usleep (200000)、执行线程可运行以执行蓝牙

    是的、这是很有可能的。 当前任务将在您调用 usleep 后产生、以便可以运行其他任务。 然后、可以运行蓝牙堆栈任务。 或者蓝牙堆栈任务可能会挤占应用任务(我认为在默认情况下、堆栈任务的优先级高于应用任务)。

    但在堆栈任务生效后、应用任务应恢复关闭 UART。

    如果进入第一个"if (UART_WRITE_FLAG)"块、则进入第二个"if (output..." 预计会进入块、然后在该 UART 线程调用 usleep 时、UART_Close 将完成执行。

    您可以在 UART_open 的末尾和 UART_Close 的末尾放置一些计数器进行确认吗?

    您可以将 UART 文件直接复制到项目中并单步执行。 具体为: \source\ti\drivers\uart2