实战经验 | 使用STM32CubeIDE调试Zephyr RTOS

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 创建工程

1.png

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

Figure 2 配置源码路径

2.png

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

Figure 3 设置芯片型号

3.png

接下来配置工程属性:

在C/C++ Build页,设置Generator为Ninja,在Other option栏,进行板的配置-DBOARD=stm32u5a9j_dk,保存后进行编译。

Figure 1 配置工程属性

4.png

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

Figure 2 添加头文件

5.png

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

Figure 3 配置调试选项

6.png

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

Figure 4 调试过程

7.png

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)。