Cortex-M 开发中实现stdout(printf, puts, putc)

2019-04-15 13:58发布

Cortex-M 开发中实现stdout(printf, puts, putc)

开发嵌入式程序时,由于没有标准输出设备,通常要把标准库的stdout定向到串口或usb等,用于调试;也就是说,在使用printf,puts,putc
等函数时,要先提供stdout基本功能的实现,标准的printf等会调用用户定义的实现函数作为stdout.

使用armcc和Microlib

  • 实现fputc函数
  • armcc armlink armasm参数中添加--library_type=microlib,或者使用IDE指定
注意:Microlib不支持p记数法和宽字符,也就是%lc,%ls, %a .
示例(基于stm32,定向到USART,需要提前配置好外设): #ifdef __CC_ARM int fputc(int ch, FILE *f) { USART_SendData(USART1,(uint8_t)ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return ch; } #endif

使用gcc和Newlib-Nano

  • 实现_write函数
  • arm-none-eabi-gcc 参数中添加 --specs=nano.specs,或者使用IDE指定
如果要输出浮点数,需要使用-u _printf_float
示例(基于stm32,定向到USART,需要提前配置好外设): #ifdef __GNUC__ int _write (int fd, char *pBuffer, int size) { for (int i = 0; i < size; i++) { USART_SendData(USART1,pBuffer[i]); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } return size; } #endif

参考资料

  1. Tailoring the microlib input/output functions
  2. Redefining target-dependent system I/O functions in the C library
  3. Redefining low-level library functions to enable direct use of high-level library functions in the C library
  4. printf() with newlib-nano vs. newlib / retargeting to UART
  5. GNU Tools for ARM Embedded Processors
  6. Building ARM Projects with Newlib-Nano