热门标签 | 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

推荐阅读
  • 交互式左右滑动导航菜单设计
    本文介绍了一种使用HTML和JavaScript实现的左右可点击滑动导航菜单的方法,适用于需要展示多个链接或项目的网页布局。 ... [详细]
  • YB02 防水车载GPS追踪器
    YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ... [详细]
  • 本文详细介绍了如何在Android应用中使用GridView组件以网格形式展示数据(如文本和图像)。通过行列布局,实现类似矩阵的数据展示效果。 ... [详细]
  • QNX 微内核(procnto-instr)的监测版本内置了高级跟踪与分析工具,能够实现实时系统监控。该模块适用于单处理器及多处理器系统。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 本文详细介绍了如何在现有的Android Studio项目中集成JNI(Java Native Interface),包括下载必要的NDK和构建工具,配置CMakeLists.txt文件,以及编写和调用JNI函数的具体步骤。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • 闭包函数,即匿名函数,在PHP中通过Closure类表示。本文将探讨如何访问闭包内的static、this及parameter等关键属性。 ... [详细]
  • Chapter11&12:DefocusBlur&FinalScene在Camera.h中修改如下:#pragmaonce#define_USE ... [详细]
  • JavaScript:简洁与复杂之间的平衡
    本文探讨了在编写JavaScript教程时,如何在保持内容简洁的同时,确保初学者能够理解并应用实际开发中的复杂问题。文章通过具体示例分析了不同层次的JavaScript代码实现。 ... [详细]
  • 本文详细介绍了 Python 中的 with 语句及其背后的上下文管理器机制,从基本概念入手,通过具体示例和原理分析,帮助读者深入理解这一重要的资源管理工具。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • 本文介绍了在Android项目中实现时间轴效果的方法,通过自定义ListView的Item布局和适配器逻辑,实现了动态显示和隐藏时间标签的功能。文中详细描述了布局文件、适配器代码以及时间格式化工具类的具体实现。 ... [详细]
  • 本文将指导如何在JFinal框架中快速搭建一个简易的登录系统,包括环境配置、数据库设计、项目结构规划及核心代码实现等环节。 ... [详细]
  • js常用方法(1)startWithJava代码varstartsWithfunction(str,regex){if(regexundefined||strundefined|| ... [详细]
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社区 版权所有