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

STM32L432KC上Zephyr Logging DMA模式异常问题排查

在STM32L432KC上使用UART DMA运行Zephyr Logging的问题

我正尝试在STM32L432KC上通过UART DMA运行Zephyr Logging。

测试用主循环代码

#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>

LOG_MODULE_REGISTER(example, LOG_LEVEL_DBG);

int main(void)
{
    while (1) {
        LOG_INF("main loop");
        k_msleep(1000);
    }
}

完整配置

CONFIG_SOC_SERIES_STM32L4X=y
CONFIG_SOC_STM32L432XX=y

# Enable MPU
CONFIG_ARM_MPU=y

# Enable HW stack protection
CONFIG_HW_STACK_PROTECTION=y

# enable uart driver
CONFIG_SERIAL=y

# enable GPIO
CONFIG_GPIO=y

# Enable Clocks
CONFIG_CLOCK_CONTROL=y

# console
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
CONFIG_UART_ASYNC_API=y

# enable DMA
CONFIG_DMA=y

# enable pin controller
CONFIG_PINCTRL=y

# config logging
CONFIG_LOG=y
CONFIG_LOG_BACKEND_UART_ASYNC=y
CONFIG_LOG_MODE_IMMEDIATE=y

构建及烧录命令

west flash -b nucleo_l432kc

现象与问题

默认配置下的实际日志输出:

*** Booting Zephyr OS build zephyr-v3.2.0-863-g78809549ee4c  ***
[00:00:01.001,000] <inf> example: main loop

当我将CONFIG_LOG_MODE_IMMEDIATE=y改为CONFIG_LOG_MODE_DEFERRED=y后,日志能按预期每秒输出一次,但代码会卡在k_sem_take(&sem, K_FOREVER)处,且uart_callback从未被调用来释放信号量。

另外发现,开启以下配置后,CONFIG_LOG_MODE_DEFERRED=y模式能正常工作:

CONFIG_LOG_PROCESS_THREAD=y
CONFIG_LOG_PROCESS_THREAD_SLEEP_MS=100

但我疑惑为何必须创建额外线程?DMA本身是非阻塞的,这让我十分困惑。我想实现无需额外线程和缓冲、完全由DMA处理的Zephyr日志功能,希望有经验的开发者指点问题所在。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:20:26