背景
由于版权问题放弃了使用MDK5编写单片机程序(主要还是代码提示功能不好用),转入了VS Code + ARM-GCC阵营,开始了踩坑的故事。
问题的发现
在使用串口打印输出时候,为了方便会使用重定向后的printf函数,由于是从 mdk5 转到 arm-gcc 阵营,第一反应就是使用mdk的那套。
即重定向 fputc() 函数
int fputc(int ch,FILE *f)
{
uint8_t temp[1]={ch};
HAL_UART_Transmit(&UartHandle,temp,1,0xffff); //UartHandle是串口的句柄
}
但是编译下载后,发现 printf 函数完全没有任何字符输出。
问题的原因
经过一番资料查找,发现不同的编译器对于C库的底层实现机制是不同的。所以MDK中的重定向方法,在使用arm-gcc编译器的时候是不可行的。
在 gcc 中没有 mdk 的 MicroLib 库,是调用标准库实现的printf函数。
标准库的底层是使用 _write() 函数实现输出的。
问题的解决
所以我们像重定向 fputc() 函数一样重定向 _write() 函数,就可以解决ARM-GCC编译器无法使用 printf() 输出字符的问题了。
#include
#ifdef __GNUC__
int _write(int fd, char *ptr, int len)
{
HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, 0xFFFF);
return len;
}
#endif
经过尝试print() 函数可以正常输出。
背景
由于版权问题放弃了使用MDK5编写单片机程序(主要还是代码提示功能不好用),转入了VS Code + ARM-GCC阵营,开始了踩坑的故事。
问题的发现
在使用串口打印输出时候,为了方便会使用重定向后的printf函数,由于是从 mdk5 转到 arm-gcc 阵营,第一反应就是使用mdk的那套。
即重定向 fputc() 函数
int fputc(int ch,FILE *f)
{
uint8_t temp[1]={ch};
HAL_UART_Transmit(&UartHandle,temp,1,0xffff); //UartHandle是串口的句柄
}
但是编译下载后,发现 printf 函数完全没有任何字符输出。
问题的原因
经过一番资料查找,发现不同的编译器对于C库的底层实现机制是不同的。所以MDK中的重定向方法,在使用arm-gcc编译器的时候是不可行的。
在 gcc 中没有 mdk 的 MicroLib 库,是调用标准库实现的printf函数。
标准库的底层是使用 _write() 函数实现输出的。
问题的解决
所以我们像重定向 fputc() 函数一样重定向 _write() 函数,就可以解决ARM-GCC编译器无法使用 printf() 输出字符的问题了。
#include
#ifdef __GNUC__
int _write(int fd, char *ptr, int len)
{
HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, 0xFFFF);
return len;
}
#endif
经过尝试print() 函数可以正常输出。
举报