STM32笔记—避免使用 C 库半主机
转载: https://blog.csdn.net/Aniu127/article/details/39693725
在独立应用程序中,您不太可能支持半主机操作。 因此,必须确保您的应用程序中没有链接 C 库半主机函数。
为确保没有从 C 库链接使用半主机的函数,必须导入符号 __use_no_semihosting。 可在您工程的任何 C 或汇编语言源文件中执行此操作,如下所示:
在 C 模块中,使用 #pragma 指令:
#pragma import(__use_no_semihosting)
在汇编语言模块中,使用 IMPORT 指令:
IMPORT __use_no_semihosting
如果仍然链接了使用半主机的函数,则链接器会报告错误。
若要识别这些函数,请使用 —verbose 选项进行链接。在结果输出中,C 库函数被加上了__I_use_semihosting 标记,例如:
Loading member sys_exit.o from c_a__un.l. definition: _sys_exit reference : __I_use_semihosting
您必须为这些函数提供自己的实现,如此例中的 _sys_exit。
Note
链接器不报告应用程序代码中任何使用半主机的函数。 仅当从 C 库链接了这种类型的函数时才会发生错误。
PS: 贴段程序…
以下代码可有效减小使用printf函数占用的空间
#if defined (__CC_ARM) //KEIL
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
Uart_SendChar(ch);
return ch;
}
#endif
void Uart_SendChar(uint8_t u8Data)
{
#ifdef UART0
M0P_UART0->SCON_f.REN = 0;//发送使能
M0P_UART0->SBUF = u8Data;
while (TRUE != M0P_UART0->ISR_f.TI);
M0P_UART0->ICR_f.TICLR = 0;
#else //UART1
M0P_UART1->SCON_f.REN = 0;//发送使能
M0P_UART1->SBUF = u8Data;
while (TRUE != M0P_UART1->ISR_f.TI);
M0P_UART1->ICR_f.TICLR = 0;
#endif
}