使用环境:
MDK版本号: MDK-ARM professional Version:5.30.0.0
编译错误:
linking…
…\OBJ\TEST.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced
Not enough information to list load addresses in the image map.
解决流程:
__use_no_semihosting was requested, but _ttywrch was referenced:
__use_no_semihosting已请求,但已引用_ttywrch;没有足够的信息来列出图像映射中的加载地址。
__use_no_semihosting明显是一个宏定义,在工程中搜索,出现在usart.c中的printf()函数重定向设置的相关代码中,查阅网上资料,__use_no_semihosting是不使用半主机模式的宏定义,__use_no_semihosting was requested, but _ttywrch was referenced读下来的感觉是_ttywrch跟不使用半主机模式是相互矛盾的。再次仔细阅读半主机的来源和用法,发现得去keil官网上寻找答案。。。
找了好久,方向逐渐明确,最终找到_ttywrch()的来源和用法,在keil官网上主页的库和浮点数用法支持指南的The C and C++ Library Functions reference这一章节里。解释如下:
可以看出,该函数本身就是半主机模式下使用的函数,禁止半主机模式下,需要对 _ttywrch 函数重写覆盖。
即在printf重定向(不使用微库重定向)代码中加上以下几行:
_ttywrch(int ch)
{
ch = ch;
}
涉及知识点
- 半主机
- printf重定向
- ARM支持库
参考链接:
keil关于use MicroLIB 和半主机模式的总结
STM32半主机模式
semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机
半主机(百度百科)
keil编译出错关于__use_no_semihosting_swi的使用
ARM库使用指南
求索之路无止境,若有不当之处请指出,感激不尽.