一,printf重定向原理
1,自己重写C的库函数
链接器检查到用户编写了与C库函数相同名字的函数时,优先调用用户编写函数,这样就可实现重定向
2,重定向printf()函数
需重写fputc()这个c标准库函数(printf()在c标准库函数实质是一个宏,实际是调用fputc()函数)
说明
fputc()默认是把字符输出到调试器控制窗口,要把数据通过USART输出到串口助手,需对基于fputc()的printf()系列函数
的输出都重定向到USART端口上去,要想使用USART功能,需重定向fputc()函数
二,操作步骤
1,在工程文件中实现fputc
///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口 */
USART_SendData(USART3, (uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
return (ch);
}
///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
/* 等待串口输入数据 */
while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(USART3);
}
2,勾选micro库
在使用串口printf的时候发现的这个疑问,勾与不勾什么区别呢?google一下
作用:
1:使用printf的时候重映像使用。
2:以下的解释貌似很官方:
(1) microlib中是用C写的时候相比,包括ARM编译器工具链的标准C库的基于ARM的嵌入式应用提供了高度优化的库,
(2) microlib中提供所需的许多嵌入式系统显著代码大小的优点。
(3) microlib中和标准C库之间的主要区别是:
(4) microlib中是专为深度嵌入式应用。
(5) microlib中被优化使用比使用ARM标准库更少的代码和数据存储器。
(6) microlib中已经设计没有操作系统的工作,但是这并不妨碍它被与任何操作系统或RTOS如Keil RTX一起使用。
(7) microlib中不包含任何文件I/ O或宽字符支持。
(8) 由于microlib中进行了优化,以尽量减少代码大小,一些功能将会比ARM编译工具提供了标准C库函数更慢执行。
(9) microlib中双方和ARM标准库都包含在Keil MDK-ARM。
从默认的C库之间的差异更详细的信息
在嵌入式应用程序中使用microlib中,选择的μVisionmicrolib中的复选框,然后编译应用程序。
的μVision链接你的程序与microlib中,并迅速和容易降低你的程序的大小。
我是在printf重映射的时候用到的。