已解决
arm-none-eabi-gcc下实现printf的两种方式
来自网友在路上 149849提问 提问时间:2023-11-02 18:06:22阅读次数: 49
最佳答案 问答题库498位专家为你答疑解惑
方式1,移植第三方printf库:
1. 下载地址:https://github.com/mpaland/printf
2. 拷贝其中的printf.c和printf.h到本地;
3. 重新实现 void _putchar(char character) 接口,使用具体串口发送ch数据,如在 uart_hal.c中重新实现该接口:
void _putchar(char character)
{UART_TypeDef *base = g_uart_bases[UART_CONSOLE_INSTANCE];uint32_t tmp_d = character;tmp_d &= 0xff;uart_drv_fput_char(base, tmp_d);
}
使用时可通过在printf.c开头部分或printf.h中增加或注释如下宏定义来关闭或开启特定打印模式:
#define PRINTF_DISABLE_SUPPORT_FLOAT // 是否支持 %f 类的打印
#define PRINTF_DISABLE_SUPPORT_EXPONENTIAL // 是否支持 %e 类的打印
#define PRINTF_DISABLE_SUPPORT_LONG_LONG // 是否支持 %lld 类的打印
#define PRINTF_DISABLE_SUPPORT_PTRDIFF_T // 是否支持 %ld 类的打印
方式2,重新实现系统调用:
1. 新增syscall.c文件,在其中添加如下代码:
extern int __io_putchar(int ch);int _write(int file, char *ptr, int len)
{int DataIdx;for (DataIdx = 0; DataIdx < len; DataIdx++){__io_putchar( *ptr++ );}return len;
}
2. 重新实现 int __io_putchar(int ch) 接口,使用具体串口发送ch数据,如在 uart_hal.c中重新实现该接口:
int __io_putchar(int ch)
{UART_TypeDef *base = g_uart_bases[UART_CONSOLE_INSTANCE];uart_drv_fput_char(base, ch);return ch;
}
两种printf实现方式的比较:
移植第三方printf库的优缺点:
优点:
-
除几个标准库外不依赖其他实现;
-
可单独控制 %f,%e,%lld,%ld格式的打印实现,可根据需要精确控制;
-
可更进一步对代码进行裁剪,如不使用sprintf类接口可对相关代码进行裁剪;
缺点:
-
相同优化等级下比实现系统调用方式代码体积大一些(只支持%d %s打印时在opt=O2时比前者大1.7kb);
重新实现系统调用方式的优缺点:
优点:
-
相同优化等级下比移植第三方库代码体积小一些;
缺点:
-
不支持%f,%e,%lld类的打印;
-
代码不可裁剪;
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"arm-none-eabi-gcc下实现printf的两种方式":http://eshow365.cn/6-30394-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!