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

