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
相关产品推荐
相关产品推荐

