keil编译出错关于__use_no_semihosting_swi的使用

__use_no_semihosting_swi,即不使用半主机模式,防止程序进入软件中断。


1.在嵌入式程序编译时如果出现printf、fopen、fclose等文件操作,因程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断BAEB处,这时就需要__use_no_semihosting_swi这 个声明,使程序遇到这些文件操作函数时不停在此中断处,具体操作如下,将下列程序加入你的工程中:


#pragma import(__use_no_semihosting_swi)
#pragma import(_main_redirection)


const char __stdin_name[150];
const char __stdout_name[150];
const char __stderr_name[150];
typedef int FILEHANDLE;

//重写标准库函数,这时printf、fopen、fclose等文件操作函数运行时就会调用你的重写函数,这些重写函数只是几个简单的例子,并没有重写所有的文件操作函数
void _sys_exit(int status)
{
    while(1);
}
FILEHANDLE _sys_open(const char *name, int openmode)
{
    return 0;
}

int _sys_close(FILEHANDLE fh)
{
    return 0;
}

int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
{
    return 0;
}

int _sys_read(FILEHANDLE fh, unsigned char*buf, unsigned len, int mode)
{
    return 0;
}

int _sys_istty(FILEHANDLE fh)
{
    return 0;
}

int _sys_seek(FILEHANDLE fh, long pos)
{
    return 0;
}

int _sys_ensure(FILEHANDLE fh)
{
    return 0;
}

long _sys_flen(FILEHANDLE fh)
{
    return 0;
}

int _sys_tmpnam(char *name, int fileno, unsigned maxlength)
{
    return 0;
}

void _ttywrch(int ch)
{
}<pre name="code" class="cpp">time_t time(time_t *t)
{
    return 0;
}
int remove(const char *filename)
{
    return 0;
}

char *_sys_command_string(char *cmd, int len)
{
    return 0;
}

clock_t clock(void)
{
    return 0;
}
 

若出现如下编译错误:Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _ttywrch was referenced,此时你只需重写_ttywrch 函数即可

void _ttywrch(int ch){}。

2.__use_no_semihosting_swi也常用于对printf的重定向,通常是重定向到串口输出,这时只需在1中的重写函数中加入:

int fputc(int ch, FILE *f)
{
uart_send_char(ch);//你的串口发送字符函数  
return ch;
}

这样即可。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值