编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

嵌入式老司机这样打log(嵌入式logo)

wxchong 2024-10-20 15:10:47 开源技术 16 ℃ 0 评论

嵌入式开发过程中,经常需要用到标准打印函数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分析。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表