我一直在使用嵌入式 printf 来尝试跟踪几个令人困扰的问题、但我怀疑 printf 可能会导致他们自己的某些问题! 我遇到的问题是 UART 溢出、仅 当 printf 处于活动状态时才会出现溢出。
UART 使用接收 ISR 来捕获和缓冲任何传入的流量(它的位非确定性)。 当用户请求数据时、该数据将从该缓冲区中被处理、或在数据可用之前被挂起(比这更复杂一点、但这是通用的 gist)。 由于我已经开始插入一些 printf (全部处于用户模式),我看到接收 ISR 有一些偶发的超支。
我通过将用户数据请求分为两部分来设计这些故障-第一部分请求消息的一部分、并且一旦将此数据控制返回到用户模式、就会向控制台执行 printf。 同时、在后台、接收 ISR 仍将(或应该)接收到数据消息的其余部分、但它将立即失败并出现溢出错误。 如果我移除 printf、一切都正常。
我可以看到唯一能够解释这一点的机制是、如果 printf 本身抑制了 EUSCI (或通用)中断、以至于 UART 正在丢失数据。 这听起来是否合理、或者我是否应该调查其他一些方向? 我相信我已经阅读过一些先前的评论、这些评论指出 printf 实现使用一些 UART 功能通过 JTAG 管理流量、这可能会让人有一定的可信度、但这对我来说都是一个黑盒。
衷心地收到任何建议、想法或评论。 控制台打印功能很好、但在 UART 处于活动状态时可能不可用?
Andrew
BTW、我使用的是 GCC 工具链 CCS V11。