STM32
直播中

大彭

10年用户 1061经验值
擅长:电源/新能源 嵌入式技术
私信 关注
[问答]

怎样去解决ARM-GCC编译器无法使用printf() 输出字符的问题呢

为什么printf函数重定向后完全没有任何字符输出呢?

怎样去解决ARM-GCC编译器无法使用printf() 输出字符的问题呢?

回帖(1)

张琪

2021-11-30 09:58:25
背景

  由于版权问题放弃了使用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() 函数可以正常输出。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分