01、背景
客户反馈要在STM32U5A9上使用Zephyr RTOS,在测试sample/basic/threads例程时,系统无法启动,也没有任何log信息。解决此问题最好方法是调试代码,查看系统运行状态以及调用栈,找到卡死的位置进行分析处理。
02、Zephyr调试
Zephyr是一个开源的实时操作系统(RTOS),专为资源受限的设备和物联网(IoT)应用而设计。它由Linux基金会支持,旨在提供一个灵活、可扩展且高效的操作系统解决方案。Zephyr主要特点有:
小巧轻便,内核非常小,适合在内存和存储资源有限的设备上运行。
采用模块化设计,允许开发者根据需求选择和配置功能模块。
支持多种架构,包括ARM、x86、RISC-V等,适用于多种硬件平台。
实时性能,提供低延迟和高响应能力,适合需要实时处理的应用场景。
具备多种安全特性,如安全启动、内存保护等,确保设备的安全性。
丰富的开发工具和API,支持C和C++编程语言,方便开发者进行应用开发。
2.1. west编译工程
1、进入例程目录:zephyr/samples/basic/threads
2、使用west工具编译: west build -p auto -d build -b stm32u5a9j_dk
2.2. 使用CubeIDE调试
打开CubeIDE,创建CMake工程,选择Project with existing CMake sources,点击Next。
Figure 1 创建工程

填写project name,然后选择源码目录(包含CMakeLists.txt与prj.conf文件)
Figure 2 配置源码路径

点击Next,选择芯片型号后,完成工程创建。
Figure 3 设置芯片型号

接下来配置工程属性:
在C/C++ Build页,设置Generator为Ninja,在Other option栏,进行板的配置-DBOARD=stm32u5a9j_dk,保存后进行编译。
Figure 1 配置工程属性

再打开属性配置,切换到C/C++ General页,Preprocessor Include下GNU C 配置,选择CDT User Setting Entries,点击Add,添加autoconf.h头文件,保存配置。
Figure 2 添加头文件

进行调试配置,选择工程名称debug_threads,以及zephyr.elf应用文件,即可开始调试。
Figure 3 配置调试选项

比如要在init.c中打断点,如下图,可以在config_default/zephyr/kernel/CMakeFiles/kenel.dir/init.c.obj文件中展开,找到init.c源文件,进行断点设置,这样调试开始时就会停在断点处。
Figure 4 调试过程

03、问题解决
对samples/basic/threads工程进行调试,运行后出现异常,停下MCU查看调用栈后发现,U5A9J_DK板在运行此工程时,使用了MSIS并且使能了MSI PLL功能,代码执行过程中检查到LSE未使能,导致k_panic死机。
解决办法:
在U5A9J_DK板的设备树文件中,配置LSE使能
zephyr\boards\st\stm32u5a9j_dk\stm32u5a9j_dk.dts
&clk_lse
{
status = "okay";
};这样修改后重新编译,工程运行正常。
04、小结
本文简要介绍了在STM32CubeIDE中调试Zephyr RTOS的方法,并在STM32U5A9J_DK板上结合samples/basic/threads工程进行调试,解决了工程无法启动的问题。在使用Zephyr RTOS过程中遇到其它问题时,也可以用STM32CubeIDE进行调试定位。
来源:STM32
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。