我是STM32F103世界的新手。我有一个STM32F103的演示代码,我正在使用arm-无eabi编译它。
我试过在谷歌上找到的东西,但到目前为止都没有用。我已经在这个问题上花了三天时间。
任何人都可以给我一个演示代码的printf,哪个工作得好?
我的制作文件的一部分:
CFLAG = -mcpu=$(CPU) -mthumb -Wall -fdump-rtl-expand -specs=nano.specs --specs=rdimon.specs -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group
LDFLAG = -mcpu=$(CPU) -T ./stm32_flash.ld -specs=nano.specs --specs=rdimon.specs -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group发布于 2016-12-19 21:52:55
通过包括下列链接器标志:
LDFLAGS += --specs=rdimon.specs -lc -lrdimon看起来您正在尝试使用所谓的半宿主。您正在告诉链接器包括系统调用库。
半宿主是一种使运行在ARM目标上的代码能够在运行调试器的主机上通信和使用输入/输出设施的机制。 这些工具的示例包括键盘输入、屏幕输出和磁盘I/O。例如,您可以使用这种机制来启用C库中的函数,例如printf()和scanf(),以使用主机的屏幕和键盘而不是目标系统上的屏幕和键盘。
由于您正在使用openSource工具进行STM32开发(Makefile和arm-none-eabi),所以我假设您也在使用openOCD来编程您的微控制器。openOCD还要求您使用以下命令启用半宿主:
arm semihosting enable您可以在openOCD脚本的命令处确保终止配置阶段,并使用'init‘命令进入运行阶段。下面是一个openOCD脚本的示例(适用于STM32F103):
source [find target/stm32f1x.cfg]
init
arm semihosting enable这里提到的将fputc()函数重定向到UART接口的其他解决方案也可以工作。半托管将在所有最近的ARM Cortex-M上工作,但需要一些编译器和调试器配置(见上文)。将fputc()函数重定向到UART接口将适用于任何编译器,但您必须检查每个板的引脚配置。
发布于 2016-09-26 21:52:02
在我看来,编写自己的printf实现是一个选项,可能也是最推荐的选项。从标准库实现中获得一些灵感,并编写自己的版本,只是为了满足您的需求。通常,您需要做的是,首先重定向一个putc函数,通过您的串行接口发送char。然后使用printf自定义实现重写putc方法。也许,一种非常简单的方法是通过递归调用putc函数以字符串的方式发送字符串。
最后但并非最不重要的是,您可以找到一些轻量级printf实现。这些轻量级实现提供的代码大小和功能集介于自定义编写的printf函数和库存标准printf函数(又称野兽函数)之间。我最近试用了这个微型打印机,并且非常满意它在ARM核上的内存占用和所需执行周期的数量方面的性能。
-PS
复制自我自己的著述。
发布于 2016-12-13 08:56:06
尝试像这样劫持_write函数:
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
int _write(int file, char *ptr, int len)
{
switch (file)
{
case STDOUT_FILENO: /*stdout*/
// Send the string somewhere
break;
case STDERR_FILENO: /* stderr */
// Send the string somewhere
break;
default:
return -1;
}
return len;
}最初的printf将通过这个函数(当然取决于您所使用的库)。
https://stackoverflow.com/questions/39664071
复制相似问题