【问题标题】:Redirect printf to Console I/O on IAR Embedded Workbench将 printf 重定向到 IAR Embedded Workbench 上的控制台 I/O
【发布时间】:2014-04-30 12:53:46
【问题描述】:

我在软件IAR Embedded Workbench IDE 中的Windows 机器上用C 编写了我的一个项目。该项目编译并运行良好。我的代码中有几个printf 函数。但问题是该项目适用于微控制器 AT91SAM7X256。我已经成功构建了我的应用程序以在微控制器的 sram 上运行,并且成功加载了应用程序。但是 printf 函数被定向到控制器的 USART 端口(我只能假设),所以我想重定向 printf 以在我的终端 I/O 上显示文本。有谁知道我该怎么做?

【问题讨论】:

  • 意识到你的程序运行在不同的系统上,将它的串口输出连接到你的开发系统上的串口或USB串口适配器是传统的获取方式这样的输出。然而,一些(但绝不是全部)调试器/编程器连接也可用于隧道输出通道。您必须检查您的特定开发接口(您忽略了提及)是否支持该功能或可以对其进行扩展。

标签: c windows embedded printf microcontroller


【解决方案1】:

我使用 IAR 工具链的 ARM、AVR32 和 MSP430 处理器版本。在每一个中,您都必须实现自己的低级功能来处理标准输入和标准输出流。 ARM 编译器手册有一个关于“输入和输出的标准流”的部分,它说您需要编写自己的 __write() 函数版本,它提供了一个示例版本,其中数据被写入内存映射的 LED 显示屏.

了解 IAR,我希望他们会为您的处理器/工具链组合提供类似的示例。

【讨论】:

  • AT91SAM7X256 和ARM设备。
  • 你知道如何为 AT91SAM7X256 编写__write() 函数吗?我已经搜索过,真的不知道如何。我只想让printf() 函数在控制台 I/O(即我的机器)上打印。
  • @JohnSmith - 您将不得不更具体地了解您认为数据如何从嵌入式板返回到您的机器。您的设置中有哪些可用路径?你的设置包括什么?
  • @ChrisStratton printf 函数正在工作,因为我可以看到它正在通过内存执行(我什至在它之前尝试了 scanf 并且它也有效)。但是,例如,由于我的嵌入式板的 UART 端口上没有任何东西,所以程序只知道它执行了该功能,不知道我是否真的看到了什么。我只是想重定向输出,以便在控制台 I/O 上看到它。
  • @JohnSmith - 只是重复这个问题不会给你一个解决方案(事实上,它会让你的问题被否决)。现在在 cmets 中按要求填写两次缺失的信息。输出数据不会神奇地从您的嵌入式处理器传到您的 PC - 您需要评估可用的通信通道并采取具体步骤来使用其中一个,例如,给自己买一个 10 美元的 USB 串行或研究如果您的调试pod 可以通过输出 - 并告诉我们您已经在使用哪一个
【解决方案2】:

我不知道为什么你的 printf 会被重定向,但为了做你想做的事,我做了以下事情: 首先显示控制台窗口。 (运行调试时转到菜单 View-> Terminal I/O 然后停止应用程序,转到 Project->Options 并在 Linker->Library 中检查 Include C-SPY 调试支持

请注意,这会使程序的运行速度大大低于应有的速度。稍后在完成调试时将所有 printfs 注释掉

【讨论】:

    【解决方案3】:

    标准答案是在库选项 1 下选择“Semihosted”和“Via semihosting”(或通过 SWO——但我一直在使用另一个。)和“缓冲终端输出”以提高速度。

    但是,我在这里讨论是因为我有一个来自 ST 的演示程序,它不会 printf 到控制台,我不知道为什么 - 有很多应用程序可以工作。因此,如果有人能记住标准信息中遗漏的一些细节,请随意说...

    【讨论】:

      【解决方案4】:

      您所要做的就是#include 并在您的代码中使用 printf()。要使用调试器控制台,您必须转到项目选项 -> 链接器 -> 输出(选项卡)并在“格式”部分中选择“C-SPY 的调试信息”,您需要“使用I/O 仿真模块”选中(这需要“带有运行时控制模块”)。这将使链接器使用其特殊的低级 I/O 例程(putchar() 、 getchar() )将其路由到调试终端 I/O 控制台。

      进入调试模式时,您会通过从顶部菜单中选择查看 -> 终端 I/O 来显示调试控制台窗口。您可能会注意到,如果您尝试 printf 过多的文本,它会使输出有点滞后。但无论如何,它肯定是调试应用程序的便捷工具。

      (出于好奇,您可以在反汇编程序中看到使用 I/O 仿真时链接到代码中的 putchar() / getchar() 函数只是 NOP 指令虚拟函数。C-SPY 调试器将设置硬件此函数中的断点,并且每当到达此断点时,它将读取寄存器以读取/写入字符。通信开销导致每个字符的延迟很小。使用 I/O 仿真的副作用是调试器将为这两个函数中的每一个保留一个硬件断点(如果您正在使用它们),这样您将获得更少的硬件断点可用于您的其他应用程序调试。)

      您可以在 IAR 用户手册中找到有关“I/O 仿真模块”的更多信息:Help -> 8051 Embedded Workbench User Guide。

      【讨论】:

        猜你喜欢
        • 2015-09-29
        • 1970-01-01
        • 2021-12-18
        • 2013-06-21
        • 1970-01-01
        • 2013-10-20
        • 1970-01-01
        • 2021-01-10
        • 1970-01-01
        相关资源
        最近更新 更多