在RT-Thread 4.1.0中开启ulog异步日志后导致finsh/msh失效的问题,通常是由串口资源冲突或线程优先级配置不当引起的。以下是系统性解决步骤:
ulog的异步日志线程与finsh线程可能同时访问同一个串口设备,导致竞争阻塞:
修改代码,为ulog后端和finsh指定不同的串口(若有多个物理串口):
/* finsh使用串口1 (console默认设备) */
void finsh_set_device("uart1");
/* ulog后端使用串口2 */
struct ulog_backend usart2_backend = {
.output = your_usart2_output
};
ulog_backend_register(&usart2_backend, "usart2", RT_FALSE);rt_hw_console_output()中加锁 void rt_hw_console_output(const char *str) {
rt_device_t console = rt_console_get_device();
rt_device_control(console, RT_DEVICE_CTRL_LOCK, RT_NULL); // 加锁
rt_device_write(console, 0, str, rt_strlen(str));
rt_device_control(console, RT_DEVICE_CTRL_UNLOCK, RT_NULL); // 解锁
}确保finsh线程优先级高于ulog异步线程:
rtconfig.h中): #define FINSH_THREAD_PRIORITY 10 // 默认20,数值越小优先级越高menuconfig中): RT-Thread Components → Utilities → Enable ulog →
[*] Enable async output →
(25) The async output thread priority # 设置为25(比finsh低)增大缓冲区防止阻塞:
menuconfig或rtconfig.h): #define ULOG_ASYNC_OUTPUT_BUF_SIZE 2048 // 默认512,建议1024-4096临时关闭干扰源以定位问题:
void ulog_console_backend_output(struct ulog_backend *backend, rt_uint32_t level, const char *tag, rt_bool_t is_raw, const char *log, size_t len) {
/* 注释掉实际输出代码 */
// rt_device_write(console_dev, 0, log, len);
}确保驱动适配RT-Thread设备框架:
static const struct rt_uart_ops _uart_ops = {
.configure = _uart_configure,
.control = _uart_control,
.putc = _uart_putc, // 必须实现
.getc = _uart_getc,
...
};[I]标记)。通过初始日志或LED判断系统状态:
#include
LOG_I("System startup"); // 查看是否输出到串口临时切换到同步日志验证是否ulog异步引起:
// 在rtconfig.h中关闭异步模式
#define ULOG_USING_ASYNC_OUTPUT 0
⚠️ 关键点:finsh线程必须高于ulog异步线程,且双方访问串口时需互斥处理。典型配置:
- finsh优先级:10~15
- ulog异步线程优先级:20~25
- 缓冲区大小 ≥1024
通过以上步骤应能恢复finsh功能。若仍存在问题,建议用J-Link等调试器检查线程阻塞状态。
举报
更多回帖