keil编译出错关于__use_no_semihosting_swi的使用

发布者:Aningmeng最新更新时间:2018-10-08 来源: eefocus关键字:keil。编译出错 手机看文章 扫描二维码
随时随地手机看文章

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


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


  1. #pragma import(__use_no_semihosting_swi)  

  2. #pragma import(_main_redirection)  

  3.   

  4.   

  5. const char __stdin_name[150];  

  6. const char __stdout_name[150];  

  7. const char __stderr_name[150];  

  8. typedef int FILEHANDLE;  

  9.   

  10. //重写标准库函数,这时printf、fopen、fclose等文件操作函数运行时就会调用你的重写函数,这些重写函数只是几个简单的例子,并没有重写所有的文件操作函数  

  11. void _sys_exit(int status)  

  12. {  

  13.     while(1);  

  14. }  

  15. FILEHANDLE _sys_open(const char *name, int openmode)  

  16. {  

  17.     return 0;  

  18. }  

  19.   

  20. int _sys_close(FILEHANDLE fh)  

  21. {  

  22.     return 0;  

  23. }  

  24.   

  25. int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)  

  26. {  

  27.     return 0;  

  28. }  

  29.   

  30. int _sys_read(FILEHANDLE fh, unsigned char*buf, unsigned len, int mode)  

  31. {  

  32.     return 0;  

  33. }  

  34.   

  35. int _sys_istty(FILEHANDLE fh)  

  36. {  

  37.     return 0;  

  38. }  

  39.   

  40. int _sys_seek(FILEHANDLE fh, long pos)  

  41. {  

  42.     return 0;  

  43. }  

  44.   

  45. int _sys_ensure(FILEHANDLE fh)  

  46. {  

  47.     return 0;  

  48. }  

  49.   

  50. long _sys_flen(FILEHANDLE fh)  

  51. {  

  52.     return 0;  

  53. }  

  54.   

  55. int _sys_tmpnam(char *name, int fileno, unsigned maxlength)  

  56. {  

  57.     return 0;  

  58. }  

  59.   

  60. void _ttywrch(int ch)  

  61. {  

  62. }"code" class="cpp">time_t time(time_t *t)  

  63. {  

  64.     return 0;  

  65. }  

  66. int remove(const char *filename)  

  67. {  

  68.     return 0;  

  69. }  

  70.   

  71. char *_sys_command_string(char *cmd, int len)  

  72. {  

  73.     return 0;  

  74. }  

  75.   

  76. clock_t clock(void)  

  77. {  

  78.     return 0;  

  79. }  


 

若出现如下编译错误: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;
}

这样即可。


关键字:keil。编译出错 引用地址:keil编译出错关于__use_no_semihosting_swi的使用

上一篇:STM8Lhalt()低功耗mode
下一篇:STM32F103RCT6的SPI驱动OLED

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved