You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32上Zephyr RTOS MCUmgr SMP调试:蓝牙线程栈溢出与非法指令

问题描述

基于smp_svr样例,在ESP32-WROVER-IE和ESP32-S3-WROOM-1上使用Zephyr RTOS v4.1.0实现基于蓝牙(SMP传输)的MCUmgr,编译成功但烧录后出现以下错误:

初始报错:

[00:00:14.935,000] os: ** FATAL EXCEPTION
[00:00:14.936,000] os: ** CPU 0 EXCCAUSE 0 (illegal instruction)
[00:00:14.936,000] os: ** VADDR 0 Invalid SP 0x3fcae368
[00:00:14.936,000] os: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0
[00:00:14.936,000] os: Current thread: 0x3fcc6bb0 (mcumgr smp)

切换到ESP32-S3后问题依旧,开启CONFIG_STACK_SENTINEL=y重新编译烧录后,定位到真实问题:

[00:00:00.281,000] os: >>> ZEPHYR FATAL ERROR 2: Stack overflow on CPU 0
[00:00:00.281,000] os: Current thread: 0x3fcc8a20 (BT LW WQ)

蓝牙初始化代码(bluetooth.c):

#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/mgmt/mcumgr/transport/smp_bt.h>

static struct k_work advertise_work;

static const struct bt_data ad[] = {
    BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
    BT_DATA_BYTES(BT_DATA_UUID128_ALL, SMP_BT_SVC_UUID_VAL),
};

static void advertise(struct k_work *work) {
    int rc = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, ARRAY_SIZE(ad), NULL, 0);
    if (rc) {
        // Handle error
    }
}

void start_smp_bluetooth_adverts(void) {
    k_work_init(&advertise_work, advertise);
    int rc = bt_enable(NULL);
    if (rc) {
        // Handle error
    }
    k_work_submit(&advertise_work);
}

当前CONFIG_BT_LONG_WQ_STACK_SIZE在menuconfig中显示为固定值1300,无法直接修改,请问如何增大该值?

解决方案

由于CONFIG_BT_LONG_WQ_STACK_SIZE在menuconfig中被标记为固定值(通常是板级配置或蓝牙子系统默认配置锁定),可以通过以下几种方式修改:

  • 直接修改项目配置文件(prj.conf)
    在项目根目录的prj.conf中添加或修改以下配置:

    CONFIG_BT_LONG_WQ_STACK_SIZE=2048
    

    替换2048为你需要的栈大小(建议先尝试增大到2048,根据实际运行情况调整)。

  • 编译时通过west命令传递参数
    使用west build时直接指定该配置项:

    west build -b <你的板型号> -DCONFIG_BT_LONG_WQ_STACK_SIZE=2048
    

    例如ESP32-S3-WROOM-1对应的板型号是esp32s3_devkitm,命令为:

    west build -b esp32s3_devkitm -DCONFIG_BT_LONG_WQ_STACK_SIZE=2048
    
  • 修改板级配置文件(如果需要长期生效)
    找到Zephyr源码中对应板的配置文件,比如ESP32-S3-WROOM-1的配置文件通常在zephyr/boards/xtensa/esp32s3_devkitm/esp32s3_devkitm.conf,在其中添加:

    CONFIG_BT_LONG_WQ_STACK_SIZE=2048
    

    注意:修改Zephyr源码中的板级配置会影响所有使用该板的项目,建议优先使用前两种方法。

修改完成后,重新编译烧录即可解决蓝牙长工作队列的栈溢出问题。

内容的提问来源于stack exchange,提问作者Sude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:12:29