前面几期中,我们着重给大家介绍了如何搭建Zephyr开发环境,以及如何添加自己的应用代码。今天让我们开始一个新的篇章:Zephyr调试技巧以及介绍Ozone进行Zephyr的调试分享。
Zephyr调试技巧
printk调试法:通过使用prink来打印一些辅助调试信息,操作简单,适合于基础的profiling,但是可能会导致时序问题,尤其是针对在中断上下文的处理中。还有针对于logging系统,zephyr提供了不同的配置选项,用户可以根据需要进行配置。
https://docs.zephyrproject.org/latest/services/logging/index.html
“IO” Toggle: 通过调用Zephyr的GPIO API,通过观察引脚的翻转情况进行调试
源码级Debug:尽管Zephyr本身没有调试IDE的支持,但由于Zephyr构建系统最终会生成elf格式的文件,我们就可以现有调试工具进行调试
运行虚拟环境:由于Zephyr对POSIX API的支持,使得Zephyr源码其实可以运行在例如PC端,那么就可以让我们直接在PC端进行应用的开发,无需下载到目标板上。
尝试关闭优化:由于编译器优化,往往源代码顺序会被重新排序,导致单步调试的困难,我们可以通过关闭优化来解决:
CONFIG_NO_OPTIMIZATIONS=y
不过,有时我们会发现关闭优化后,某些能够运行的程序会突然出现hardfault。最大问题可能是由于关闭了优化选项,导致某些代码的栈使用量增加触发栈溢出异常。一般来说,我们可以通过增加系统栈或是中断栈的大小来解决:
CONFIG_MAIN_STACK_SIZE=8192 CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=8192 CONFIG_ISR_STACK_SIZE=2048
通过打印ram或是rom占用情况对代码进行分析:
west build -t ram_report west build -t rom_report
源码调试工具推荐:
a) 原生支持:
b) MCUXPresso VS Code插件:
https://github.com/nxp-mcuxpresso/vscode-for-mcux/wiki/Debug
c) Cortex-Debug插件:
https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug
d) 其他,例如Segger Ozone等
使用Ozone进行Zephyr调试
Ozone是个啥?先来个简短的自我介绍吧:
Ozone是一款由SEGGER公司开发的专业嵌入式应用程序调试和性能分析工具,Ozone是一个独立的图形调试器,支持多种单片机架构,包括Arm Cortex-M、Renesas RX、NXP LPC等。Ozone可以与任何为其输出生成Elf/Dwarf调试信息的工具链一起使用,例如GCC、Clang、ARM、IAR等编译器。
Ozone提供了丰富的调试功能,如程序下载、单步执行、变量更新窗口、汇编指令调试、芯片寄存器查看、断点设置等。
1. 源码级调试:Ozone支持C/C++源码级的调试和汇编指令的调试,用户可以在调试过程中直接查看和编辑源代码。
2. 多文件格式支持:Ozone支持ELF或兼容文件(*.elf, .out, .axf)、Motorola S-record文件(.srec, .mot)、Intel hex文件(.hex)以及二进制数据文件(.bin)。
3. 实时终端和Flash Breakpoints:Ozone可以直接使用J-Link内置的实时终端和无限Flash断点功能。
4. 脚本化项目文件:Ozone提供脚本化的项目文件,允许用户通过脚本自动配置和执行调试任务。
5. 自定义界面:Ozone的用户界面完全可定制,用户可以根据需要调整布局和功能。
6. 系统变量编辑器:Ozone提供了一个系统变量编辑器,方便用户修改和调试系统级别的变量。
7. 高级内存窗口:Ozone的内存窗口支持保存、加载和填充操作,用户可以方便地查看和修改内存内容。
开发环境:
Ozone适用于多种开发环境,可以在Windows、Linux、macOS等平台上运行。
集成工具:Ozone通常与J-Link调试器配合使用,但也可以与其他支持SWD和JTAG调试的硬件调试器一起使用。
总的来说,Ozone是一款功能强大且灵活的嵌入式应用程序调试和性能分析工具,适用于各种复杂的调试场景。尽管在某些方面存在一些不足,但其丰富的功能和高度的可定制性使其成为嵌入式开发者的重要工具之一。
接下来让我们看看怎么新建一个Ozone调试工程,并添加我们的Zephyr.elf,详见下面小视频:
为了能够更好的支持Zephyr OS的调试,我们还需要在工程配置文件中添加Zephyr调试插件,打开.jdebug尾缀的Ozone工程文件,添加如下内容到OnProjectLoad函数中:Project.SetOSPlugin("ZephyrPlugin");
至此,我们就完成了Ozone的全部配置工作,相信大家有了Ozone之后,都能得心应手!
NXP
恩智浦致力于打造安全的连接和基础设施解决方案,为智慧生活保驾护航。
全部0条评论
快来发表一下你的评论吧 !