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.

[参考译文] PROCESSOR-SDK-AM62X:M4 UART 在许多消息后似乎错过了 Semaphore_post

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1254574/processor-sdk-am62x-m4-uart-seems-to-miss-a-semaphore_post-after-many-messages

器件型号:PROCESSOR-SDK-AM62X
主题中讨论的其他器件:SysConfig

我略微修改了 M4的 ex02_MessageQ_echo 示例、因此它在 UART 中打印大量消息。 收到许多消息后、程序挂起。 我尝试跟踪挂起的地方,似乎 UART_WRITE 函数正在执行一个 semaphoreP_PEND ()调用,等待 ISR 执行 semaphoreP_POST ()调用,这似乎已经完成,但 SemaphoreP_PEND ()函数从未返回。

消息是使用 DebugP_LOG 打印的、DebugP_log 似乎使用了互斥量、因此看起来不会出现多个线程相互步进的问题。 然而、它会挂起。

附加了修改后的程序。 ipc_rpmsg_echo.c 中有一个新函数、如下所示:

void print_messages (const char *文件、int 行、int id、const char *消息、int num_msgs)
{
  for (int ii = 0;ii < num_msgs;++ii)
  {
    DebugP_log ("%s":%d:%5d:ID:%d msg:%s\r\n、文件、行、ii、id、 信息);
  }

这是在5000条消息的 ipc_rpmsg_echo_main ()的开头调用的。 在有另外5000条消息的 while ()循环之前,它在 ipc_recv_task_main()中再次被调用。 (有2个 recv 任务、因此这将是每个任务的5000)前5000条消息似乎是可以的。 第二批5000人似乎总是挂在不同的地方。

有什么想法、为什么无法打印消息?  

通过尝试从 Linux 运行回显演示可以发现此问题、M4上为接收到的每条消息添加了一条消息、Linux 中的计数为10000。 在这种情况下,消息将失败。 对 print_message 的调用似乎也会挂起,但不需要 Linux 程序。

e2e.ti.com/.../am62x_5F00_ex02_5F00_messageq_5F00_echo_5F00_uart_5F00_test.tar.gz

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

    您好、John:

    感谢您的提问。

    似乎只是 API DebugP_log()有问题。

    请允许我花一点时间来了解这一点。 最好是6小时左右。

    此致、

    瓦伊布哈夫

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

    您好、John:

    我认为默认情况下 DebugP_LOG() API 在 ISR 中使用时不会按预期运行。

    我已附加了一个代码片段、您可以在以下目录中找到该代码片段:  MCU_PLUS_SDK_INSTALL_PATH\source\kernel\freertos\DPL\common\DebugP_freertos.c


    您能否尝试改用 printf、并检查它是否同时起作用。

    此致、

    瓦伊布哈夫

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

    Vaibhav,

    感谢您的答复。

    我曾尝试用 printf 替换 DebugP_log、并且没有看到 M4 UART 控制台上打印的任何消息。   是否需要进行额外设置以使 printf 出现在 UART 控制台上?

    我没有尝试从 ISR 中使用 DebugP_LOG。 您提供的代码片段包含 DebugP_log、它会忽略在 ISR 中调用时提出的请求。 该代码尝试在循环中打印5000条消息。 许多人出去,但他们一段时间后失败,程序挂起。 如果是从 ISR 内部打印输出的、则不会显示任何消息、也不会挂起任何内容。 看到一些消息后、不会从 ISR 中调用 DebugP_LOG。

    我在程序挂起时尝试查看内核对象、它们表明正在信标上等待正在尝试打印的任务。 我已经在代码中添加了"跟踪器"以在执行行号时记录行号。 挂起前捕获的最后一行编号是 UART_WRITE ()中调用 SemaphoreP_pend ()的位置。 信号量在 UART_WRITE 内部使用。 内部信标应由 UART 中断处理程序发布。 UART_WRITE 内的正常序列似乎为:

    * uart_WRITE:设置打印单个字符。 启用写入中断。 当 UART 能够发送时、此命令应该会触发。 调用 SemaphoreP_pend ()

    * UART ISR:获取下一个字符并传输。 如果没有更多字符,则调用 SemaphoreP_POST ()

    * uart_WRITE:返回给调用方

    我已经尝试在 UART_WRITE 和 UART ISR 中放置计数器、似乎每个挂起调用都需要布置、但仍然挂起调用。 我想中断可能会在 pend ()调用之前发生、但在这种情况下、挂起似乎应该立即返回。 由于计数器显示相同的调用次数、PEND 似乎不知何故错过了 POST。 但这或许可以跳到结论中。 基本 FreeRTOS 信标似乎没有这样一个基本问题。

    您是否尝试过运行该程序? 还有其他建议吗?

    谢谢

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

    您好、John:

    感谢您的简要描述。

    我将尝试运行您提供的代码。

    你还能解释几件事吗?

    您的操作系统和开发设置一般是什么?

    您使用的 MCU 和 SDK/处理器 SDK 是什么版本?

    使用的初始化过程是什么? SBL、SPL 或 CCS GEL 脚本?

    我之所以提出这个问题、是为了在开始运行这些示例之前、确保我与您具有相同的理由。

    此致、

    瓦伊布哈夫

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

    我正在开发一个 Linux VM、该 VM 具有连接到目标的以太网和 Blackhawk USB200 JTAG 仿真器。 来自目标器件(ARM 和 M4)的串行端口通过 TeraTerm 连接到运行 VM 的 PC。  

    Processor SDK 版本  08.06.00.42。MCU_PLUS_SDK 的版本为08_06_00_18。

    我的测试顺序如下:

    *在 Code Composer 中构建程序。

    *使用 scp 将程序(Debug/am62-mcu-m4f0_0-FW)复制到目标/home/root 中的目标文件。 /lib/firmware/am62-mcu-m4f0_0-fw 文件通过符号方式链接到目标文件。

    *然后重新启动、M4程序在系统启动时启动。 我已经尝试使用 Remoteproc 来解除绑定/绑定,但通常 rpmsg 资源没有完全释放,程序不能完全启动。 如果系统刚刚重新引导,结果会更容易预测。

    *程序挂起后、我已经使用 Code Composer 启动调试会话、连接到 M4、加载符号、然后 查看全局变量或查看运行时对象查看器。  

    在任务启动时、发布的程序仅打印一组消息。 这些不是有用的消息。 提供这些消息只是为了轻松证明无法打印所有这些消息。 发现此问题的真实测试案例涉及使用 ARM 侧回显 rpmsg 消息、每个消息由 M4打印。 这些消息最终也会挂起。 但是出于测试目的、该场景更为复杂、因为它涉及 ARM。

    希望这能解答您的问题。 我不确定"SBL、SPL 或 CCS GEL 脚本"的含义。

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

    您好、John:

    希望此答案可以解答您的问题。 我不确定"SBL、SPL 或 CCS GEL 脚本"的含义是什么。[/引号]

    这里我想说的是,您是通过哪种方法完成 SOC 初始化?

    此致、

    瓦伊布哈夫

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

    我正在使用 uboot。 使用 SD 卡

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

    您好、John:

    感谢您的答复。

    我将执行 SOC 初始化并尝试重新创建您所面临的问题。

    BR Vaibhav

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

    您好、John:

    我正在使用 uboot。 使用 SD 卡

    我满足了您的查询、我正在尝试设置。

    此外、我假设您将电路板设置为 SD 卡引导模式并继续进行。

    因此、我将这一点牢记并开始。

    请 在当天结束前收到回复。

    此致、

    瓦伊布哈夫

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

    您好、John:

    谢谢你等了。

    因此、我已经遵循了您刚才提到的步骤。  

    根据您的观察、消息未完全打印/跳过、是正确的。

    在测试设置中、我可以看到所有来自 MCU_UART0的消息。

    在我看来、我看不到任何消息被跳过或没有打印。

    请评论您对我的上述意见的看法。

    你是否还可以阐述 以下两点?

    *使用 scp 将程序(Debug/am62-mcu-m4f0_0-FW)复制到目标/home/root 中的目标文件。 /lib/firmware/am62-mcu-m4f0_0-fw 文件通过符号方式链接到目标文件。

    *然后重新启动、M4程序在系统启动时启动。 我已经尝试使用 Remoteproc 来解除绑定/绑定,但通常 rpmsg 资源没有完全释放,程序不能完全启动。 如果系统刚刚重新引导,结果会更容易预测。

    [/报价]

    我在构建应用后、将文件"am62-mcu-m4f0_0-fw"复制到 SD 卡的根分区。

    在 SD 卡的根分区中、我将其复制到 home/root 中。

    然后、我以 SD 卡引导模式启动电路板、之后我连接到 M4内核并启动应用。

    期待您的回复。

    此致、

    瓦伊布哈夫

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

    Vaibhav,

    我连接的是其他测试程序。 这更类似于 TI 在 SDK 中包含的真实 IPC_rpmsg_echo。

    如果 运行示例后改为使用我的源文件、那么您应该能够重现问题。

    原始 M4代码位于~/ti/mcu_plus_sdk_am62x_08_06_00_18/examples/drivers/ipc/ipc_rpmsg_echo_linux 中

    Linux 代码位于 Git 存储库中: https://git.ti.com/cgit/rpmsg/ti-rpmsg-char。 Linux 可执行文件应该已经位于/usr/bin/rpmsg_char_simple 上的目标上

    M4代码和原始代码的主要区别在于,我的代码在收到消息后和将消息的回显发送回发件人之前打印一条消息。 您可以使用 tarball 并将 ipc_rpmsg_echo_linux_am62x-sk_m4fs0-0_freertos_ti-arm-clang 项目作为 CCS 项目导入。  

    然后您可以运行 Linux 程序:rpmsg_char_simple -r 9 -n 10000

    我已经看到这个失败,只有10个消息。 我也看到它对大约2000条消息起作用。

    您应该在 ARM 和 M4控制台上都能看到消息。  e2e.ti.com/.../am62x_5F00_ex02_5F00_messageq_5F00_echo_5F00_c.tar.gz

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

    您好、John:

    感谢您对我之前提出的问题提供简要反馈。

    我将按照您提到的步骤进行操作。

    如果我需要进一步澄清,我可能会就你刚才提到的其中一点提出跟进问题。

    请允许我 在几个工作日内回复您。

    此致、

    瓦伊布哈夫

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

    您好、John:

    我已经能够在我的设置中重现您的问题。

    我已将所附加的定制 M4_FreeRTOS 示例的.appimage 放在 default_sbl_ospi_linux.cfg

    然后、我刷入了 appimage 并将电路板设置为 OSPI 引导模式。 发布此步骤,日志显示,然后我运行命令" rpmsg_char_simple -r 9 -n 20000 "

    运行测试大约5次后,在第6次尝试时,它停止打印在2769。 请参阅以下内容:

    M4F_MCU_UART0日志

    您能告诉我您的测试步骤/程序是什么吗? 您是否通过 CCS 加载 M4程序? 或者你已经像我所做的那样通过 SBL 刷写了程序?

    期待您的答复。

    此致、

    瓦伊布哈夫

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

    Vaibhav,

    我没有从 CCS 加载程序。 我已将程序复制到 SD 卡上的/lib/firmware 目录中并重新引导系统。 然后、当系统启动时、我从控制台登录并运行 Linux 程序。

    我使用 CCS 的唯一一次是在目标挂起后连接到目标、尝试查看其正在做什么。

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

    您好、John:

    感谢您的答复。

    因此、我需要将文件放置到  am62-mcu-m4f0_0-FW /lib/firmware 目录并重新引导。 我假设在重启后、M4代码也会运行、然后我们执行以下命令:  rpmsg_char_simple -r 9 -n 10000

    请告诉我,如果我的解释正确。

    此致、

    瓦伊布哈夫

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

    Vaibhav,

    是的、您的解读正确无误。 我将文件放在/lib/firmware 中、进行重新引导、M4会在引导过程中启动、然后按照您描述的方式运行 Linux 程序。

    我通常会很快看到挂起、但它可能取决于时间、在其他情况下需要更长的时间。

    谢谢。

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

    您好、John:

    在您放置  am62-mcu-m4f0_0-FW  在  /lib/firmware  目录、我已经能够重现此问题。

    请允许我花一点时间来了解这一点。

    此致、

    瓦伊布哈夫

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

    您好、John:

    我想根本原因已经找到。

    修复了:在 SysConfig (example.sysconfig)中、以轮询模式而非中断模式使用 UART

    注意:此修复已在 SDK 版本9.0中完成、

    我运行了10万次消息交换。

    它运行正常、并打印所有日志。

    John、请尝试在轮询模式下配置 UART、然后在您的设置中是否显示了所有日志。

    请告诉我、这是否解决了您的问题。

    此致、

    瓦伊布哈夫

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

    Vaibhav,

    我上个星期就离开了办公室。 我还没有尝试轮询模式、但我会。

    使用轮询模式代替中断模式是一种解决方法、不是修复方法。

    您是否认为9.0版中的中断模式已修复?

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

    我已经验证通过轮询模式、它不再挂起。 因此、轮询模式是一种可行的解决方法。

    这就留下了一个问题、即版本9.0中是否确实修复了中断模式?

    谢谢。

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

    您好、John:

    在 SDK 版本9.0中、此解决方法已实施。 因此、默认情况下、SysConfig 将轮询操作模式作为 UART 的默认状态。

    我们到目前为止已经选择退出中断模式。

    此致、

    瓦伊布哈夫