简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式),
标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数.
例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar()*/
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define
PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART1, (uint8_t) ch);
/* Loop until the end of transmission */
return ch;
}
因printf()之类的函数,使用了半主机模式。使用标准库会导致程序无法运行,以下是解决方法:
方法1.使用微库,因为使用微库的话,不会使用半主机模式.
方法2.仍然使用标准库,在主程序添加下面代码:
#pragma import(__use_no_semihosting)
_sys_exit(int x)
{
x = x;
}
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
如果使用的是MDK,请在工程属性的“Target“-》”Co de Generation“中勾选”Use MicroLIB;今天参考了一下论坛,使用微库可以很好的解决这个问题。
2.另一种方法:(其实大同小异)
需要添加以下代码
(论坛里应该有完整介绍这个的帖子,但是我没搜到,也许是沉了。)
#pragma
import(__use_no_semihosting)
/******************************************************************************
*标准库需要的支持函数
******************************************************************************/
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
/// /// 定义_sys_exit()以避免使用半主机模式 ///
/// name="x">
///
_sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
//USART_SendData(USART1, (u8) ch);
USART1->DR = (u8) ch;
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{
}
return ch;
}
semihosting的作用,介绍如下
Semihosting is a mechanism for ARM targets to communicate input/output requests
from application co de to a host computer running a debugger. This mechanism could be
used, for example, to allow functions in the C library, such as printf() and scanf(), to use the screen and keyboard of the host rather than having a screen and keyboard on the target system.
This is useful because development hardware often does not have all the input and
output facilities of the final system. Semihosting allows the host computer to provide these facilities.
Semihosting is implemented by a set of defined software interrupt (SWI) operations.
The application invokes the appropriate SWI and the debug agent then handles the SWI
exception. The debug agent provides the required communication with the host.
In many cases, the semihosting SWI will be invoked by co de within library functions. The application can also invoke the semihosting SWI directly. Refer to the C library descriptions in the ADS Compilers and Libraries Guide for more information on support for semihosting in the ARM C library.
按我的理解,这个模式是用来调试的,通过仿真器,使用主机的输入输出代替单片机自己的,也就是说即便单片机没有输出口也能printf到电脑上。反过来,由于这个模式更改了printf()等的实现方式,输入输出就不走单片机的外设了,所以只重定义fputc不起作用。
用代码关闭此模式后,需要同时更新一下__stdout 和__stdin 的定义,所以有后面的语句。
以上仅为个人理解,如有错误请指正。
另外,勾选microlib之后,也许编译的时候就不把开启semihosting的文件包进去了,所以没事。
C库函数重定向:
用户能定义自己的C语言库函数,连接器在连接时自动使用这些新的功能函数。这个过程叫做重定向C语言库函数,如下图所示。
举例来说,用户有一个I/O设备(如UART)。本来库函数fputc()是把字符输出到调试器控制窗口中去的,但用户把输出设备改成了UART端口,这样一来,所有基于fputc()函数的printf()系列函数输出都被重定向到UART端口上去了。
下面是实现fputc()重定向的一个例子:
externvoidsendchar(char*ch);
intfputc(intch,FILE*f)
{/*e.g.writeacharactertoanUART*/
chartempch=ch;
sendchar(&tempch);
return ch;
}
这个例子简单地将输入字符重新定向到另一个函数sendchar(),sendchar()假定是个另外定义的串口输出函数。在这里,fputc()就似乎目标硬件和标准C库函数之间的一个抽象层。
上一篇:STM32 USB 大容量存储器Mass Storage工程的讲解
下一篇:STM32 USB数据接收与数据发送程序流程分析
推荐阅读
史海拾趣
机顶盒,全称为数字视频变换盒(Set Top Box,简称STB),是现代家庭娱乐系统中不可或缺的关键设备。它作为连接电视机与外部信号源的桥梁,能够将接收到的数字电视信号转换成适合电视播放的格式,极大地丰富了用户的视听体验。
机顶盒的起源可追溯至20世纪90年代初,最初是为了解决有线电视收视费问题而设计的解扰设备。随着数字电视技术的发展,机顶盒的功能不断扩展,现已成为集数字信号接收、解码、显示以及多种增值服务于一体的智能终端。
从技术层面看,机顶盒支持多种信号源,包括有线电缆、卫星天线、宽带网络及地面广播等。它不仅能够接收高清、超高清电视节目,还能提供电子节目指南(EPG)、因特网网页浏览、视频点播、游戏等多元化服务。此外,一些先进的机顶盒还集成了智能语音助手、云计算和边缘计算技术,实现了更为便捷、智能的用户交互和内容分发。
在内容创新方面,机顶盒通过与各大内容提供商合作,不断引入优质资源,如电影、电视剧、综艺节目等,并根据用户偏好提供个性化推荐服务。同时,其跨平台整合能力也使得用户可以在不同设备间无缝切换,享受高质量的视频内容。
综上所述,机顶盒作为数字电视技术的核心组成部分,以其强大的功能、丰富的内容和便捷的操作体验,成为了现代家庭娱乐的重要选择。随着技术的不断进步和市场的持续扩大,机顶盒将继续发展,为用户带来更加优质、便捷、智能的观影体验。
尽管康普在通信行业取得了显著的成就,但它也面临着诸多挑战。其中最大的挑战之一来自网络安全和数据保护。近年来,随着网络安全事件的频发,康普也遭受了数据泄露等网络安全事件的冲击。然而,康普积极应对挑战,加强了网络安全和数据保护的投入,提升了公司的网络安全防护能力。同时,康普也积极寻找新的增长点,拓展5G、物联网等新兴市场及成长型市场的渠道,为公司的未来发展奠定了坚实的基础。
以上五个故事仅是CommScope Inc公司电子行业发展的部分缩影,实际上,公司的发展历程远比这些故事更为丰富和复杂。但通过这些故事,我们可以看到CommScope Inc公司在技术创新、市场开拓、产品升级以及应对挑战等方面所做出的努力和取得的成就。
尽管康普在通信行业取得了显著的成就,但它也面临着诸多挑战。其中最大的挑战之一来自网络安全和数据保护。近年来,随着网络安全事件的频发,康普也遭受了数据泄露等网络安全事件的冲击。然而,康普积极应对挑战,加强了网络安全和数据保护的投入,提升了公司的网络安全防护能力。同时,康普也积极寻找新的增长点,拓展5G、物联网等新兴市场及成长型市场的渠道,为公司的未来发展奠定了坚实的基础。
以上五个故事仅是CommScope Inc公司电子行业发展的部分缩影,实际上,公司的发展历程远比这些故事更为丰富和复杂。但通过这些故事,我们可以看到CommScope Inc公司在技术创新、市场开拓、产品升级以及应对挑战等方面所做出的努力和取得的成就。
随着通信行业的快速发展,康普公司意识到光纤光缆在有线电视行业的重要性。因此,在1977年,康普公司合并了Valtec公司,一个独立的光纤技术领导者。这次合并不仅增强了康普在光纤技术方面的实力,也为其日后的全球化布局打下了坚实的基础。随后,康普通过一系列的战略合作和收购,逐渐在全球范围内建立了供应链和生产基地,为全球客户提供高效、可靠的通讯网络解决方案。
随着电子行业的不断发展,Curtis Industries公司意识到技术创新的重要性。公司投入大量资源进行技术研发,成功推出了一系列具有行业领先水平的产品。其中,公司在某一关键领域的突破性技术,不仅解决了行业内的技术难题,还为公司赢得了广泛的赞誉。Curtis Industries因此成为了电子行业的技术创新引领者,推动了整个行业的发展。
作为一个有社会责任感的企业,Bel Fuse始终关注环境保护和可持续发展。公司致力于减少生产过程中的能源消耗和环境污染,积极采用环保材料和工艺。同时,Bel Fuse还参与了多项公益活动,为社会做出贡献。这种对社会责任的承担不仅提升了公司的形象,也增强了员工的凝聚力和归属感。
这些故事虽然基于虚构,但它们是根据Bel Fuse公司可能经历的发展历程和挑战来构建的。真实的故事可能会因时间、市场环境等因素而有所不同。要了解Bel Fuse公司的真实发展历程,建议查阅相关文献资料或访问公司官方网站。
摘要:介绍一种新型的高压双向触发器件SIDAC的工作原理、性能特点及典型应用。在电子镇流器中广泛采用的双向触发器件是DB3,其触发开通电压在30V左右,触发电流较小(mA级),导通后的残余电压在20V左右,这些特点决定了只能用于小电流的触发电路中 ...… 查看全部问答∨ |
运算放大器通过简单的外围元件,在模拟电路和数字电路中得到非常广泛的应用。运算放大器有好些个型号,在详细的性能参数上有几个差别,但原理和应用办法一样。 运算放大器通常有两个输入端,即正向输入端和反向输入端,有且只有一个输出端。部 ...… 查看全部问答∨ |
最近我常用的一个函数出了点异样,大虾米现身了!!!HOHO 函数如下: unsigned int SysTim; unsigned int PreTim1; unsigned int PreTim2; unsigned int LenTim(unsigned int preTim, unsigned int sysTim) { if (preTim > sysTim) { return (0 ...… 查看全部问答∨ |
|
有谁了解深圳"研祥智能科技"公司吗?那边的待遇怎么样,我是08年的应届毕业生,我很想知道,本科生在那边的待遇和发展怎么样呢? 望各位知情的大虾帮帮忙啊 ~谢过~… 查看全部问答∨ |
fatal error C1083: Cannot open include file: 'zlib.h': No such file or directory fatal error C1083: Cannot open include file: \'zlib.h\': No such file or directory 为什么会出这种错误,… 查看全部问答∨ |
以下见解纯属一家之言,本来是写给自己的,但是看到本 BBS 中不少兄弟热心助人,受到感染,故将其贴出。希望能起到抛砖引玉的作用。 谬误及其它不妥之处,还望兄弟们提出指正。 用单片机开发产品的几点体会 1、用户需求 必须明确认识到作产品开 ...… 查看全部问答∨ |