4. 使用日志记录仿真输出
任务说明
本案例目标是在Renode中启用并配置日志系统,将仿真运行时的调试信息(如UART输出、外设访问、CPU执行事件)记录到日志文件与控制台,便于后续分析。我们将以STM32F4 Discovery开发板为平台,通过一条简单的UART回显程序演示日志的配置与输出。
实现方案
Renode使用基于NLog的日志框架,支持通过命令行参数或配置文件动态调整日志级别与输出目标。本案例采用以下方式:
- 创建日志配置文件
logger.nlog,定义控制台与文件两个输出目标; - 启动Renode时加载该配置,并设置日志级别为
DEBUG; - 运行固件后,观察UART数据收发日志与系统级调试信息。
日志配置与启动
首先创建日志配置文件logger.nlog:
<?xml version="1.0" encoding="utf-8"?>
<nlog>
<targets>
<target name="console" xsi:type="Console"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />
<target name="file" xsi:type="File"
fileName="renode_${shortdate}.log"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="console,file" />
</rules>
</nlog>
该配置将所有命名空间下级别不低于Debug的日志同时输出到控制台与日期命名的文件中。
启动Renode并加载日志配置:
renode --nlog-config logger.nlog -e "include @platforms/cpus/stm32f4-discovery.repl; machine LoadPlatform @platforms/boards/stm32f4-discovery.repl;"
其中--nlog-config指定日志配置文件路径。启动后,Renode控制台会实时显示日志信息,同时当前目录生成renode_YYYY-MM-DD.log文件。
固件与仿真脚本
准备一个简单的UART回显固件echo.elf(由STM32CubeIDE编译生成,功能为:收到一个字节后原样发送回UART)。创建仿真脚本test_logs.resc:
:name=LogTest
:description=Test logging output
include @platforms/cpus/stm32f4-discovery.repl
machine LoadPlatform @platforms/boards/stm32f4-discovery.repl
showAnalyzer UART1
machine Uart1 CreateFileBackend @uart_output.txt
sysbus LoadELF @echo.elf
start
脚本加载平台与固件,启动UART1分析器,并将UART1输出同时重定向到终端与uart_output.txt文件。
验证方法
在Renode的Mono控制台中执行以下命令发送测试数据:
uart1 WriteChar 0x41
预期结果:
- 控制台日志中出现类似
2025-01-01 12:00:00.1234|DEBUG|UARTPort|WriteChar: 0x41的记录; uart_output.txt文件中包含字符A(0x41);renode_*.log文件中记录了UART外设访问与CPU执行事件。
判定标准:日志文件与控制台均出现UART写入记录,且uart_output.txt内容与发送数据一致,即日志系统配置成功。
日志级别动态调整
若需减少日志量,可在启动后通过Mono控制台动态调整:
logLevel SetLevel Warning
该命令将全局日志级别提升至Warning,仅输出警告与错误信息,便于过滤调试噪声。
关键点说明
- 日志配置通过
--nlog-config参数在启动时加载,无需修改Renode源码; minlevel="Debug"会输出大量外设访问日志,生产环境建议设为Info或Warning;- UART数据流与系统日志分离:前者通过
CreateFileBackend独立记录,后者由NLog统一管理。