printf()是如何与UART外设驱动函数“勾搭”起来的?

嵌入式ARM 2022-09-30 12:00

今天给大家分享的是IAR下调试信息输出机制之硬件UART外设

在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地定位和分析程序问题。在嵌入式应用设计里实现打印信息输出的方式有很多,本系列将以 IAR 环境为例逐一介绍 ARM Cortex-M 内核 MCU 下打印信息输出方法。

本篇是第一篇,我们先介绍最常见的输出打印信息方式,即利用 MCU 芯片内的硬件 UART 外设。本篇其实并不是要具体介绍 UART 外设模块使用方法,而是重点分析 IAR 下是如何联系 C 标准头文件 stdio.h 定义的 printf() 函数与 UART 外设底层驱动函数的。

  • Note:本文使用的 IAR EWARM 软件版本是 v9.10.2。

一、打印输出整体框图

首先,介绍一下打印输出方法整体软硬件框图,硬件上主要是 PC 主机、MCU 目标板、一根连接线(连接线有两种方案:一种是 RS232 串口线、另一种是 TTL 串口转 USB 模块板)。

软件上 PC 这边需要安装一个串口调试助手软件,然后目标板 MCU 应用程序需要包含打印输出相关代码,当 MCU 程序运行起来后,驱动片内 UART 外设实现打印字符数据 (hello world.) 物理传输,在 PC 上串口调试助手软件里可以看到打印信息。

上图里的 MCU 应用程序是在 IAR 环境下编译链接的,因此我们的重点就是 stdio.h 头文件里的 printf() 在 IAR 下到底是如何与 UART 外设驱动函数“勾搭”起来的。

二、C 标准头文件 stdio.h

熟悉嵌入式工程的朋友应该都知道 stdio.h 头文件并不在用户工程文件夹里,无需我们手动添加该文件进工程目录,该文件是 C 标准定义的头文件,由工具链自动提供。

stdio.h 是 C 语言为输入输出提供的标准库头文件,其前身是迈克·莱斯克 20 世纪 70 年代编写的“可移植输入输出程序库”。C 语言中的所有输入和输出都由抽象的字节流来完成,对文件的访问也通过关联的输入或输出流进行。

  • stdio.h 原型:https://cplusplus.com/reference/cstdio/

大部分人学 C 语言一般都是在 Visual Studio / C++ 环境下,在这个环境里 stdio.h 定义的那些函数底层实现都由 Visual Studio 软件直接搞定,我们通常无需关心其实现细节。

在嵌入式 IAR 环境下,这些标准 C 定义的头文件大部分也都是可以被支持的,我们可以在如下 IAR 软件目录找到它们,当我们在工程代码里加入 #include 等语句时,实际上就是添加 IAR 软件目录里的文件进工程编译。

\IAR Systems\Embedded Workbench 9.10.2\arm\inc\c\stdio.h

但是 IAR 目录下 stdio.h 文件里定义的诸如 printf() 函数具体实现我们是需要关注的,毕竟是要编译链接生成具体机器码下载进 MCU 运行的,但是 printf() 函数原型在哪呢?我们先留个悬念。

三、UART 外设驱动函数

说到 UART 外设驱动函数,这个大家应该再熟悉不过了。我们以恩智浦 i.MXRT1060 型号(ARM Cortex-M7 内核)为例来具体介绍,在其官方 SDK 包里有相应的 LPUART 驱动文件:

\SDK_2.11.0_EVK-MIMXRT1060\devices\MIMXRT1062\drivers\fsl_lpuart.h
\SDK_2.11.0_EVK-MIMXRT1060\devices\MIMXRT1062\drivers\fsl_lpuart.c

这个 LPUART 驱动库里的 LPUART_WriteBlocking() 和 LPUART_ReadBlocking() 函数可以完成用户数据包的发送和接收,其实单纯利用 LPUART_WriteBlocking() 函数也可以实现打印信息输出,只是没有 printf() 函数那样包含格式化输出的强大功能。

status_t LPUART_Init(LPUART_Type *base, const lpuart_config_t *config, uint32_t srcClock_Hz)
status_t LPUART_WriteBlocking(LPUART_Type *base, const uint8_t *data, size_t length)
status_t LPUART_ReadBlocking(LPUART_Type *base, uint8_t *data, size_t length)

四、IAR 对 C 标准 I/O 库的支持

IAR 显然是对 C 标准 I/O 库有支持的,不然我们不可能在工程里能使用 printf() 函数,只是这个支持我们如何去轻松发现呢?痞子衡今天教大家一个方法,就是看工程编译链接后生成的 .map 文件,这个 map 文件里会列出工程里所有函数的来源。

4.1 引出底层接口 __write()

我们以 \SDK_2.11.0_EVK-MIMXRT1060\boards\evkmimxrt1060\demo_apps\hello_world\iar 工程为例来介绍,需要简单改造一下工程里 hello_world.c 文件里的 main() 函数,将原来代码全部删掉(原来的打印输出涉及恩智浦 SDK 封装,本文没必要关心其实现),只要如下一句打印即可:

#include 
int main(void)
{
    printf("hello world.\r\n");
    while (1);
}

然后注意工程选项里跟 Library 实现相关的如下三处设置。其中 Library 选项配置的是 runtime lib 的功能,有 Normal 和 Full 两个选项(可按需选择);Printf formatter 选项决定格式化输出功能细节,分 Full、Large、Small、Tiny 四个选项(可按需选择)。

Library low-level interface implementation 选项决定低层 I/O 实现,这里我们选 None,即由用户来实现。

配置好 Library 后编译工程会发现有如下报错,根据这个报错我们可以猜到 dl7M_tln.a 是 IAR 编译好的 C/C++ 库,库里面实现了 printf() 函数及其所依赖的 putchar() 函数,而 puchar() 函数对外提供了底层 I/O 接口函数,这个 I/O 函数名字叫 __write(),它就是需要用户结合芯片 UART 外设去实现的发送函数。

 Error[Li005]: no definition for "__write" [referenced from putchar.o(dl7M_tln.a)]

在 IAR 目录下我们可以找到 dl7M_tln.a 文件路径,经过测试,工程 Library 设置里 Normal 和 Full 选项其实就是选 dl7M_tln.a 还是 dl7M_tlf.a 进用户工程去链接。

4.2 DLIB底层 I/O 接口设计

找到了 __write() 函数,但是它的原型到底是什么?我们该如何实现它?这时候需要去查万能的 \IAR Systems\Embedded Workbench 9.10.2\arm\doc\EWARM_DevelopmentGuide.ENU 手册,在里面搜索 __write 字样可以找到如下设计,原来我们在代码里调用的 C 标准 I/O 接口均是由 IAR 底层预编译好的 DLIB 去具体实现的,这个 DLIB 库也留下了给用户实现的最底层与硬件相关的接口函数。

IAR 为 DLIB 里那些最底层的 I/O 接口函数都创建了模板源文件,在这些模板文件里我们可以找到它们的原型,所以我们在 write.c 文件里找到了 __write() 原型及其示例实现。

size_t __write(int handle, const unsigned char * buffer, size_t size)

4.3 DLIB库 I/O 相关源码实现

有了 __write() 原型及示例代码,我们很容易便能用 LPUART_WriteBlocking() 函数去实现它,将这个代码添加进 hello_world 工程编译,这时候就不会报错了(当然要想真正在板子上测试打印功能,main 函数里还得加入 LPUART 初始化代码)。

#include "fsl_lpuart.h"
size_t __write(int handle, const unsigned char *buf, size_t size)
{
    // 假设使用 LPUART1 去做输出
    (void)LPUART_WriteBlocking(LPUART1, buf, size);

    return 0;
}

工程编译完成后,查看生成的 hello_world.map 文件,找到 dl7M_tln.a 部分的信息,可以看到其由很多个 .o 文件组成(功能比较丰富),这些 .o 文件都是可以在 IAR 安装目录下找到其源码的。

*******************************************************************************
*** MODULE SUMMARY
***

Module ro code ro data rw data
------ ------- ------- -------
dl7M_tln.a: [10]
abort.o 6
exit.o 4
low_level_init.o 4
printf.o 40
putchar.o 32
xfail_s.o 64 4
xprintfsmall_nomb.o 1'281
xprout.o 22
-----------------------------------------------
Total: 1'453 4

DLIB 库中关于 I/O 相关的源码放在了如下目录里,感兴趣的可以去查看其具体实现,这里特别提一下 formatter 文件夹下 xprintf 有很多种不同的源文件实现,其实就对应了工程选项 Printf formatter  里的不同配置。

\IAR Systems\Embedded Workbench 9.10.2\arm\src\lib\dlib\file
\IAR Systems\Embedded Workbench 9.10.2\arm\src\lib\dlib\formatters

至此,IAR下调试信息输出机制之硬件UART外设痞子衡便介绍完毕了。

END

来源:痞子衡嵌入式

版权归原作者所有,如有侵权,请联系删除。

推荐阅读
可怕!CPU暗藏了这些未公开的指令!
I2C接口通讯实现方式,你掌握了几种?
从方法到逻辑,超详细的嵌入式学习路线图!

→点关注,不迷路←
嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论 (0)
  • ‌磁光克尔效应(Magneto-Optic Kerr Effect, MOKE)‌ 是指当线偏振光入射到磁性材料表面并反射后,其偏振状态(偏振面旋转角度和椭偏率)因材料的磁化强度或方向发生改变的现象。具体表现为:1、‌偏振面旋转‌:反射光的偏振方向相对于入射光发生偏转(克尔旋转角 θK)。2、‌椭偏率变化‌:反射光由线偏振变为椭圆偏振(克尔椭偏率 εK)。这一效应直接关联材料的磁化状态,是表征磁性材料(如铁磁体、反铁磁体)磁学性质的重要非接触式光学探测手段,广泛用于
    锦正茂科技 2025-05-12 11:02 297浏览
  •   电磁数据展示系统平台解析   北京华盛恒辉电磁数据展示系统平台是实现电磁数据高效展示、分析与管理的综合性软件体系,以下从核心功能、技术特性、应用场景及发展趋势展开解读:   应用案例   目前,已有多个电磁数据展示系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据展示系统。这些成功案例为电磁数据展示系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与预处理   智能分析处理   集成频谱分析、时频变换等信号处理算法,自动提取时域频域特征;
    华盛恒辉l58ll334744 2025-05-13 10:20 358浏览
  •   电磁数据管理系统深度解析   北京华盛恒辉电磁数据管理系统作为专业的数据处理平台,旨在提升电磁数据的处理效率、安全性与可靠性。以下从功能架构、核心特性、应用场景及技术实现展开分析:   应用案例   目前,已有多个电磁数据管理系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据管理系统。这些成功案例为电磁数据管理系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与接入:实时接收天线、频谱仪等设备数据,兼容多协议接口,确保数据采集的全面性与实时性
    华盛恒辉l58ll334744 2025-05-13 10:59 270浏览
  • 在 AI 浪潮席卷下,厨电行业正经历着深刻变革。AWE 2025期间,万得厨对外首次发布了wan AiOS 1.0组织体超智能系统——通过AI技术能够帮助全球家庭实现从健康检测、膳食推荐,到食材即时配送,再到一步烹饪、营养总结的个性化健康膳食管理。这一创新之举并非偶然的个案,而是整个厨电行业大步迈向智能化、数字化转型浪潮的一个关键注脚,折射出全行业对 AI 赋能的热切渴求。前有标兵后有追兵,万得厨面临着高昂的研发成本与技术迭代压力,稍有懈怠便可能被后来者赶
    用户1742991715177 2025-05-11 22:44 177浏览
  • 【拆解】+CamFi卡菲单反无线传输器拆解 对于单反爱好者,想要通过远程控制自拍怎么办呢。一个远程连接,远程控制相机拍摄的工具再合适不过了。今天给大伙介绍的是CamFi卡菲单反无线传输器。 CamFi 是专为数码单反相机打造的无线传输控制器,自带的 WiFi 功能(无需手机流量),不但可通过手机、平板、电脑等设备远程连接操作单反相机进行拍摄,而且还可实时传输相机拍摄的照片到 iPad 和电视等大屏设备进行查看和分享。 CamFi 支持大部分佳能和尼康单反相机,内置可充电锂离子电池,无需相机供电。
    zhusx123 2025-05-11 14:14 401浏览
  • 感谢面包板论坛组织的本次测评活动,本次测评的对象是STM32WL Nucleo-64板 (NUCLEO-WL55JC) ,该测试板专为LoRa™应用原型构建,基于STM32WL系列sub-GHz无线微控制器。其性能、功耗及特性组合经过精心挑选,支持通过Arduino® Uno V3连接,并利用ST morpho接头扩展STM32WL Nucleo功能,便于访问多种专用屏蔽。STM32WL Nucleo-64板集成STLINK-V3E调试器与编程器,无需额外探测器。该板配备全面的STM
    无言的朝圣 2025-05-13 09:47 142浏览
  • 在当下竞争激烈的 AI 赛道,企业高层的变动往往牵一发而动全身,零一万物近来就深陷这样的动荡漩涡。近日,零一万物联合创始人、技术副总裁戴宗宏离职创业的消息不胫而走。这位在大模型基础设施领域造诣颇深的专家,此前在华为云、阿里达摩院积累了深厚经验,在零一万物时更是带领团队短期内完成了千卡 GPU 集群等关键设施搭建,其离去无疑是重大损失。而这并非个例,自 2024 年下半年以来,李先刚、黄文灏、潘欣、曹大鹏等一众联创和早期核心成员纷纷出走。
    用户1742991715177 2025-05-13 21:24 99浏览
  •   基于 2025 年行业权威性与时效性,以下梳理国内知名软件定制开发企业,涵盖综合型、垂直领域及特色技术服务商:   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,系统二次开发,CRM等领域有很多成功案例。   五木恒润科技有限公司:是一家专业的部队信
    华盛恒辉l58ll334744 2025-05-12 16:13 250浏览
  • 在印度与巴基斯坦的军事对峙情境下,歼10C的出色表现如同一颗投入平静湖面的巨石,激起层层涟漪,深刻印证了“质量大于数量”这一铁律。军事领域,技术优势就是决定胜负的关键钥匙。歼10C凭借先进的航电系统、强大的武器挂载能力以及卓越的机动性能,在战场上大放异彩。它能够精准捕捉目标,迅速发动攻击,以一敌多却毫不逊色。与之形成鲜明对比的是,单纯依靠数量堆砌的军事力量,在面对先进技术装备时,往往显得力不从心。这一现象绝非局限于军事范畴,在当今社会的各个领域,“质量大于数量”都已成为不可逆转的趋势。在科技行业
    curton 2025-05-11 19:09 255浏览
  •   舰艇电磁兼容分析与整改系统平台解析   北京华盛恒辉舰艇电磁兼容分析与整改系统平台是保障海军装备作战效能的关键技术,旨在确保舰艇电子设备在复杂电磁环境中协同运行。本文从架构、技术、流程、价值及趋势五个维度展开解析。   应用案例   目前,已有多个舰艇电磁兼容分析与整改系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润舰艇电磁兼容分析与整改系统。这些成功案例为舰艇电磁兼容分析与整改系统的推广和应用提供了有力支持。   一、系统架构:模块化智能体系   电磁环境建模:基
    华盛恒辉l58ll334744 2025-05-14 11:22 45浏览
  • 文/Leon编辑/cc孙聪颖‍2025年1月至今,AI领域最出圈的除了DeepSeek,就是号称首个“通用AI Agent”(智能体)的Manus了,其邀请码一度被炒到8万元。很快,通用Agent就成为互联网大厂、AI独角兽们的新方向,迅速地“卷”了起来。国外市场,Open AI、Claude、微软等迅速推出Agent产品或构建平台,国内企业也在4月迅速跟进。4月,字节跳动、阿里巴巴、百度纷纷入局通用Agent市场,主打复杂的多任务、工作流功能,并对个人用户免费。腾讯则迅速更新腾讯元器的API接
    华尔街科技眼 2025-05-12 22:29 145浏览
  •   定制软件开发公司推荐清单   在企业数字化转型加速的2025年,定制软件开发需求愈发多元复杂。不同行业、技术偏好与服务模式的企业,对开发公司的要求大相径庭。以下从技术赛道、服务模式及行业场景出发,为您提供适配的定制软件开发公司推荐及选择建议。   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转
    华盛恒辉l58ll334744 2025-05-12 15:55 329浏览
  • 在全球供应链紧张和国产替代需求推动下,国产存储芯片产业快速发展,形成设计到封测一体化的完整生态。北京君正、兆易创新、紫光国芯、东芯股份、普冉股份和佰维存储等六大上市公司在NOR/NAND Flash、DRAM、嵌入式存储等领域布局各具特色,推动国产替代提速。贞光科技代理的品牌紫光国芯,专注DRAM技术,覆盖嵌入式存储与模组解决方案,为多领域客户提供高可靠性产品。随着AI、5G等新兴应用兴起,国产存储厂商有望迎来新一轮增长。存储芯片分类与应用易失性与非易失性存储芯片易失性存储芯片(Volatile
    贞光科技 2025-05-12 16:05 196浏览
我要评论
0
44
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦