Skip to main content
Visitor II
April 24, 2024
Solved

Help understanding why my UART printf actually works - linker query

  • April 24, 2024
  • 2 replies
  • 1575 views

NUCLEO-C031C6 board.

My printf over the UART works fine - would anyone be able to explain the 'bold' comment below.

How does such a simple bit of code overload the whole printf function.

What is 'small printf' ?

Regards, John.

 

#if defined(__GNUC__)

/* With GCC, small printf (option LD Linker->Libraries->Small printf

set to 'Yes') calls __io_putchar() */

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#endif

.

.

PUTCHAR_PROTOTYPE

{

/* Place your implementation of fputc here */

/* e.g. write a character to the USART2 and Loop until the end of transmission */

HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);

 

return ch;

}

    This topic has been closed for replies.
    Best answer by STea

    Hello @John123 ,

    the printf implementation in the standard library is using low-level output function like __write which uses the __io_putchar() function to put characters in the std output so by surcharging this function to call the uart_transmit() function we will get printf printing over UART with the Virtual Com Port (VCP).

    so, by redefining the __io_putchar() function declared as weak in the syscalls.c into your main you simply are redirecting the function that output characters in the standard output to output to UART.

    BR

    2 replies

    STeaAnswer
    ST Employee
    April 24, 2024

    Hello @John123 ,

    the printf implementation in the standard library is using low-level output function like __write which uses the __io_putchar() function to put characters in the std output so by surcharging this function to call the uart_transmit() function we will get printf printing over UART with the Virtual Com Port (VCP).

    so, by redefining the __io_putchar() function declared as weak in the syscalls.c into your main you simply are redirecting the function that output characters in the standard output to output to UART.

    BR

    John123Author
    Visitor II
    April 25, 2024

    Many thanks