fputc() 接受一个流指针参数,有两个标准输出流 stdin、stdout 和 stderr。在重定向的较低级别,它们分别与文件描述符 0、1 和 2 相关联,您可以使用此信息将 stderr 与设备驱动程序级别的备用 UART 相关联。
然后,您可以使用 stderr 输出调试数据:
fprintf (stderr, "Error reading file" ) ;
例如。
最小重定向(特定于 Keil ARM-MDK/RealView)可能如下所示:
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 输出到关联的流。
微库中还有 fprintf 吗?如果没有,是否有更好的方法来实现这一点?
文档会告诉你,但是是的。Microlib stdio 支持由#pragma import(__use_full_stdio)
指令控制,文档不清楚如果不使用它会排除什么。尝试不使用它,如果缺少任何东西,请使用它。这就是说我会想象 printf() 是作为标准输出流的 fprintf() 实现的,所以如果你有 printf(),你就有 fprintf()。