STM32笔记---小空间的调用printf函数

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	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值