作者:Amy爱爸爸爱妈妈 | 来源:互联网 | 2024-12-18 18:17
本文介绍了如何通过ARM编译器组件重定向标准C运行时库的I/O函数,以适应不同的硬件平台。原文链接:https://www.keil.com/pack/doc/compiler/RetargetIO/html/retarget_overview.html
在应用开发中,标准输入输出库函数(如printf()
、scanf()
或fgetc()
)被频繁使用来执行输入输出操作。这些函数在ARM编译器的标准C运行时库中的结构设计允许开发者针对特定硬件进行重定向。
概述
这些函数分为高级和低级两部分,其中低级函数直接调用系统I/O函数与硬件交互。高级库函数通过调用低级库函数来完成输入输出任务,而这些低级函数又依赖于系统I/O函数,后者是目标依赖性的。
为了实现I/O重定向,可以采取以下几种方法:
- 避免使用 高级库函数。
- 重新定义 低级库函数。
- 重新定义 系统I/O函数。
选择重新定义低级库函数还是系统I/O函数取决于具体的应用场景。例如,对于UART通信,由于其通常一次仅传输一个字符,而默认的fputc()
函数使用了缓冲区,因此可能需要无缓冲地重新定义此函数。如果应用支持缓冲操作,则重新定义系统I/O函数可能是更好的选择。
ARM编译器C运行时库的MicroLib通过低级函数与硬件接口,它实现了一套精简的高级函数,不包含系统I/O函数。因此,当使用MicroLib时,无法重新定义系统I/O函数。此外,ARM编译器组件的任何特性都可以为MicroLib提供断言机制。
关于如何使用ARM编译器组件进行通道和变体的重定向,详情请参阅《重定向通道和变体》章节。
半托管(Semihosting)
半托管是一种机制,使运行在ARM目标设备上的代码能够与运行调试器的主机计算机上的输入输出设施进行通信。然而,µVision不支持半托管功能,因此不能使用半托管SWI操作。如果需要编写自己的重定向代码,确保不会将C库中的半托管函数链接到应用程序中。这可以通过导入符号__use_no_semihosting_swi
来实现。在C模块中,使用#pragma
指令:
#pragma import(__use_no_semihosting_swi)
在汇编模块中,使用IMPORT
指令:
IMPORT __use_no_semihosting_swi