热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

I/O重定向技术详解

本文介绍了如何通过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

推荐阅读
author-avatar
Amy爱爸爸爱妈妈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有