网站首页 > 开源技术 正文
嵌入式开发过程中,经常需要用到标准打印函数printf(),帮助记录或者展示代码的执行情况。虽然调用的接口都是printf,但是底层的实现却差异很大,需要根据项目及系统资源权衡到底如何实现。本文将介绍在keil工程实现时log打印相关的内容。
- 数据流输出的方式
在工程实践中,输出打印信息往往需要考虑在PCB板上添加物理打印口是否方便,MCU外设资源是否够用等因素,根据实际情况选定一种信息打印方式,在keil+Jlink相结合的开发环境中,我们可以通过物理串口,keil打印终端,Jlink RTT终端三种方式实现信息打印。
- 物理串口
当我们需要使用串口作为标准输出接口时,我们需要对输出函数fputc进行重定向,例子为stm32使用USART1,在USART1收发正常时,工程参考代码如下:
int fputc(int ch, FILE *f) { USART_SendData(USART1, (u8) ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return (ch); }
添加完以上代码,在USART1中实现标准输出,即可以使用printf打印log。log显示可以在电脑用sscom,若需要实时保存log到电脑中,可以用putty这个软件。
- keil ITM打印
keil自带了一个debug(printf)viewer,在不使用物理串口的情况下使用printf实现log打印。接下来以ITM Stimulus Port 0为例,简单介绍一下实现过程。
1.打开RTE->Compiler->I/O
2.勾选STDERR,STDIN,STDOUT,如下图所示:
3.在Option for target下选择debug->settings.
4.勾选ITM port0
这时候,工程中将可以使用标准输入输出函数进行协助调试。
若调试过程中需要将log保存到文本文件,则可以创建一个slog.ini文件,文件内容如下:
LOG>>.\User\log\dslog_TIME_.txt /* Create a new log file */ SLOG>> .\User\log\dslog_TIME_.txt /* Interrogate log file status */ /*SLOG OFF Close the log file */
配置如下如,则log除了在keil调试窗口显示,还能保存到工程目录的User\log\dslog_TIME_.txt中
- Jlink RTT打印
在使用Jlink作为调试工具时,可以在keil工程中添加SEGGER_RTT相关文件,并将fputc函数重定向到SEGGER_RTT_PutChar即可。
int fputc(int ch, FILE *f) { SEGGER_RTT_PutChar(0,ch); return (ch); }
此时工程中的printf将通过Jlink打印log,log可以通过Jlink工具安装目录下的Jlink RTT Client工具查看。
- log打印等级划分与log框架
在大型系统开发过程中,往往会添加大量的log信息辅助开发调试。当log信息多到一定程度的时候,大量的冗余log会将有用信息淹没掉。甚至有时过多的log会达到打印输出口的输出极限,导致有些log缓存被刷掉。为了解决这个问题,我们需要对printf函数进行封装,当log等级大于一定值时才打印信息,达到log过滤的目的。log信息按等级进行管理打印输出的逻辑,可以自己实现,也可以移植现成的log管理框架,如log4c和dlt等。其中,dlt一般多用在汽车电子产品开发中,此框架实现了log等级管理,精炼打印信息内容,同时提供工具实现log id与文本映射,log分析。
猜你喜欢
- 2024-10-20 今日头条在消息服务平台和容灾体系建设方面的实践与思考
- 2024-10-20 教你如何解决最常见的58种网络故障排除方法
- 2024-10-20 Linux 问题故障定位,看这一篇就够了,九招搞定所有问题
- 2024-10-20 iOS大解密:玄之又玄的KVO(解密电视剧全集在线观看免费完整版)
- 2024-10-20 在C语言中,如何优雅地实现全局错误日志记录?
- 2024-10-20 嵌入式大杂烩周记 第 7 期:zlog(嵌入式实战)
- 2024-10-20 纯C日志函数库 zlog(c语言日志模块)
- 2024-10-20 log4c ,一个轻量级的C++日志库(log4j日志)
- 2024-10-20 iOS利用VideoToolbox实现视频硬解码
- 2024-10-20 iOS封装C语言P Thread(c语言程序封装)
你 发表评论:
欢迎- 03-19基于layui+springcloud的企业级微服务框架
- 03-19开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- 03-19SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- 03-19SpringBoot+LayUI后台管理系统开发脚手架
- 03-19layui下拉菜单form.render局部刷新方法亲测有效
- 03-19Layui 遇到的坑(记录贴)(layui chm)
- 03-19基于ASP.NET MVC + Layui的通用后台开发框架
- 03-19LayUi自定义模块的定义与使用(layui自定义表格)
- 最近发表
-
- 基于layui+springcloud的企业级微服务框架
- 开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- SpringBoot+LayUI后台管理系统开发脚手架
- layui下拉菜单form.render局部刷新方法亲测有效
- Layui 遇到的坑(记录贴)(layui chm)
- 基于ASP.NET MVC + Layui的通用后台开发框架
- LayUi自定义模块的定义与使用(layui自定义表格)
- Layui 2.9.11正式发布(layui2.6)
- Layui 2.9.13正式发布(layui2.6)
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)