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

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

你可能感兴趣的:(嵌入式开发)