Using printf with two UARTs
我已经在retarget.c中实现了
但是,我想要第二个uart通道来获取其他调试信息。如何使用printf尽可能好地集成UART0?
例如,使用fprintf到自定义目标并在
例如。正常输出
但是我看不出是否为标准输出调用了fopen,因此我在努力查看如何手动实现这一点。 (如果我只是打电话给
我猜想,一旦我将它定向到一个不同的" FILE",那么这只是检查在fputc中指向哪个对象的问题,但这是我正在努力的FILE指针的初始设置。
也许可以使用某种方式来区分stdout和stderr,但是从两个独立的通道获取输入时,我仍然遇到相同的问题。
也是microlib中的fprintf吗?如果没有,是否有更好的方法来实现呢?
谢谢!
fputc()使用流指针参数,有两个标准输出流stdin,stdout和stderr。在重定向的较低级别,这些分别与文件描述符0、1和2关联,您可以使用此信息在设备驱动程序级别将stderr与备用UART关联。
然后,您可以使用stderr输出调试数据,因此:
1 |
例如。
最小的重定向(特定于Keil ARM-MDK / RealView)可能如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | struct __FILE { int handle; }; enum { STDIN_HANDLE, STDOUT_HANDLE, STDERR_HANDLE } ; FILE __stdin = {STDIN_HANDLE} ; FILE __stdout = {STDOUT_HANDLE} ; FILE __stderr = {STDERR_HANDLE} ; int fputc(int ch, FILE *f) { int ret = EOF ; switch( f->handle ) { case STDOUT_HANDLE : // Write character to UART0 ... ret = ch ; break ; case STDERR_HANDLE : // Write character to UART1 ... ret = ch ; break ; default : break ; return ret ; } |
显然,如果需要,也可以在此挂接文件系统,在这种情况下,您的__FILE结构无疑将具有其他成员。
如果您不想为此目的使用stderr,则必须重新定位fopen()以将设备名称(例如" dbg:")转换为所需端口的文件描述符,然后使用stdio输出到相关流。
Also is fprintf in the microlib? If not, is there a better way to implement this?
文档会告诉您,但是可以。 Microlib stdio支持由