/* 告知连接器不从C库链接使用半主机的函数 */
#pragma import(__use_no_semihosting)/* 定义 _sys_exit() 以避免使用半主机模式 */
void _sys_exit(int x)
{x = x;
}/* 标准库需要的支持类型 */
struct __FILE
{int handle;
};FILE __stdout;
在独立应用程序中,不可能支持半主机操作。 因此,必须确保应用程序中没有链接 C 库半主机函数。
为确保没有从 C 库链接使用半主机的函数, 必须导入符号 __use_no_semihosting 。
可在工程的任何 C 或汇编语言源文件中执行此操作,如下所示:
在 C 模块中,使用 #pragma 指令:
#pragma import(__use_no_semihosting)
在汇编语言模块中,使用 IMPORT 指令:
IMPORT __use_no_semihosting
///< 串口发送重定向
int fputc(int ch, FILE * file)
{Uart_SendDataPoll(M0P_UART0,ch); //调用库函数,通过UART0发送一个字母。return ch;
}
这里需要注意下:本文代码我采用华大HC32L系列的,它这个库函数Uart_SendDataPoll(M0P_UART0,ch)里面是有等待数据发送完毕的

如果你用的是STM32单片机,重定向函数应该这么写
//< 串口发送重定向
int fputc(int ch, FILE * file)
{USART_SendData(USART1,ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束return ch;
}
需要自己在添加一行代码来等待发送完毕,因为ST发送库函数里面没有等待语句

#include "BSP_GPIO.h"
#include "BSP_Uart.h"//#include "UFD.h"
uint8_t u8Rx0Data;/* 告知连接器不从C库链接使用半主机的函数 */
#pragma import(__use_no_semihosting)/* 定义 _sys_exit() 以避免使用半主机模式 */
void _sys_exit(int x)
{x = x;
}/* 标准库需要的支持类型 */
struct __FILE
{int handle;
};FILE __stdout;
///< 串口发送重定向
int fputc(int ch, FILE * file)
{Uart_SendDataPoll(M0P_UART0,ch); //调用库函数,通过UART0发送一个字母。return ch;
}
static void Uart0_PortInit(void)
{stc_gpio_cfg_t stcGpioCfg;///< 打开GPIO外设时钟门控Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);DDL_ZERO_STRUCT(stcGpioCfg);///< 端口方向配置 UART0_TXDstcGpioCfg.enDir = GpioDirOut;Gpio_Init(PORT_DEBUG_TXD,PIN_DEBUG_TXD,&stcGpioCfg);Gpio_SetAfMode(PORT_DEBUG_TXD,PIN_DEBUG_TXD,GpioAf2);//UART0_TXD///< 端口方向配置 UART0_RXDstcGpioCfg.enDir = GpioDirIn;///< 端口上下拉配置->上拉stcGpioCfg.enPu = GpioPuEnable;Gpio_Init(PORT_DEBUG_RXD,PIN_DEBUG_RXD,&stcGpioCfg);Gpio_SetAfMode(PORT_DEBUG_RXD,PIN_DEBUG_RXD,GpioAf2);//UART0_RXDSysctrl_SetFunc(SysctrlSWDUseIOEn, TRUE); /*Set SWD port to GPIO mode*/
}
static void Uart0_Init(void)
{stc_uart_cfg_t stcCfg;stc_uart_baud_t stcBaud;DDL_ZERO_STRUCT(stcCfg);DDL_ZERO_STRUCT(stcBaud);///< 打开UART0外设时钟门控Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);///
//< 串口发送重定向
int fputc(int ch, FILE * file)
{Uart_SendDataPoll(M0P_UART0,ch); //调用库函数,通过UART0发送一个字母。return ch;
}
#include "BSP_GPIO.h"
#include "BSP_Uart.h"//#include "UFD.h"
uint8_t u8Rx0Data;//< 串口发送重定向
int fputc(int ch, FILE * file)
{Uart_SendDataPoll(M0P_UART0,ch); //调用库函数,通过UART0发送一个字母。return ch;
}
static void Uart0_PortInit(void)
{stc_gpio_cfg_t stcGpioCfg;///< 打开GPIO外设时钟门控Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);DDL_ZERO_STRUCT(stcGpioCfg);///< 端口方向配置 UART0_TXDstcGpioCfg.enDir = GpioDirOut;Gpio_Init(PORT_DEBUG_TXD,PIN_DEBUG_TXD,&stcGpioCfg);Gpio_SetAfMode(PORT_DEBUG_TXD,PIN_DEBUG_TXD,GpioAf2);//UART0_TXD///< 端口方向配置 UART0_RXDstcGpioCfg.enDir = GpioDirIn;///< 端口上下拉配置->上拉stcGpioCfg.enPu = GpioPuEnable;Gpio_Init(PORT_DEBUG_RXD,PIN_DEBUG_RXD,&stcGpioCfg);Gpio_SetAfMode(PORT_DEBUG_RXD,PIN_DEBUG_RXD,GpioAf2);//UART0_RXDSysctrl_SetFunc(SysctrlSWDUseIOEn, TRUE); /*Set SWD port to GPIO mode*/
}
static void Uart0_Init(void)
{stc_uart_cfg_t stcCfg;stc_uart_baud_t stcBaud;DDL_ZERO_STRUCT(stcCfg);DDL_ZERO_STRUCT(stcBaud);///< 打开UART0外设时钟门控Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);///要使用第一种还是第二种,看自己选择,大家好像选择第一种比较多。