假设我正在使用带有STM32L476RG处理器的Nucleo板。 我正在使用Uvision5编译一个基本代码,它正在执行以下操作:
int main( void )
{
printf( "Started\n" );
return 0;
}
似乎printf
实际上是将UART上的"Started\n"
字符串发送到Nucleo的ST-link,然后将数据封装在USB上。然后,我可以在任何类型的串口嗅探器工具上接收数据。
为了正确地做到这一点,我必须定义以下功能(以及暂时不在主题范围内的其他GPIO和设备设置,但这使得以下工作):
int fputc( int ch, FILE *f )
{
HAL_UART_Transmit( &UartHandle, ( uint8_t * )&ch, 1, 0xFFFF );
return ch;
}
到目前为止一切顺利。我很好。但是,我无法找到printf
发生的任何地方,以便在某个时刻fputc
被调用。我确实使用调试器启动了这样的程序,它表明printf
实际上被称为__0printf$5
,它可能是一个调用_printf_core
的编译函数。最后一个函数调用新定义的fputc
。
在哪里定义了所有这个调用堆栈?请注意,我不打算修改它,我只是很好奇,因为我使用了很多这个功能,但我仍然不清楚为什么它正在工作......