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.

[参考译文] RTOS/TM4C123GH6PM:在 UART 回调中使用 fprintf 会导致断言

Guru**** 2446730 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/621054/rtos-tm4c123gh6pm-usage-of-fprintf-within-uart-callback-leads-to-assertion

器件型号:TM4C123GH6PM

工具/软件:TI-RTOS

您好!

我正在使用 SysCallback 实现方案、在我的实现方案中使用 System_printf。 此外、我使用的调试实现具有 fprintf 功能、该功能将输出引导至映射到 UART 接口的 stderr:

freopen ("UART:0"、"w"、stderr);
setvbuf (stderr、NULL、_IOLBF、128); 

如果我在单个线程中使用调试机制、它将按预期工作。 但是、在另一个 UART 回调中使用会导致断言:

$ ti.sysbios.gates.gateMutex:第99行:断言失败:a_badContext:调用上下文错误。 有关详细信息、请参阅 GateMutex API 文档。
xdc.runtime.Error.raise:终止执行 

文档将讨论以下内容:

原因:当 xdc.runtime.SysStd 是您的 System.SupportProxy 时,从 Swi 或 Hwi 调用 System_printf()或 printf()。 

据我所知、UART 回调既不是 HWI 也不是 SWI。 此外、使用 SysMin 也是不可替代的。 我出了什么问题?

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

    UART 回调在 Hwi 上下文中进行。

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

    感谢 Todd 的快速响应。 我再次将文档中实施的"矢量编号"和"中断编号"这两个术语混淆在一起:

    而 ROV 谈到中断编号、但表示向量编号:

    除此之外:为什么 System_printf 起作用、而 fprintf 会导致断言?

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

    [引用用户="Volker Weber"]

    除此之外:为什么 System_printf 起作用、而 fprintf 会导致断言?

    [/报价]

    我将此添加到我的问题中:寻找一种使用 XDC/runtime /System.h 实现的方法我找到了几个打印函数、但其中缺少 fprintf 功能。 如何使用这些机制显式打印到 stderr 输出?

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

    我明天会回答这个问题。

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

    您似乎已将 fprintf 绑定到 UART。 您不能在 Hwi 的上下文中调用 UART_write()。 不过,您可以调用 UART_writePolling()。

    我不确定您将 System. SupportProxy 设置为什么、那么让我们看看三个最常见的选项:
    SysMin:调用 System_printf 时、ASCII 字符串存储在内部缓冲区中。 这可以通过 System_flush()或者如果程序退出/中止,刷新到 CCS 控制台。
    SysStd:调用 System_printf 时、使用 printf。 默认情况下、它会写入 CCS 控制台。 注意:这会实时中断。
    SysCallback:默认情况下、除非插入函数、否则 System_printf 不会发生任何情况。

    因此、在所有这三种情况下、可以从 Hwi 调用 System_printf。

    Todd