RT-Thread论坛
直播中

李秀珍

8年用户 1061经验值
私信 关注
[问答]

rt_thread4.1.0 开启ulog异步日志,finsh失效是怎么回事?

rt_thread4.1.0 开启ulog异步日志,finsh失效,>msh打印不出来,按任何指令也没有显示


回帖(1)

他在笑

2025-10-11 16:06:39

在RT-Thread 4.1.0中开启ulog异步日志后导致finsh/msh失效的问题,通常是由串口资源冲突线程优先级配置不当引起的。以下是系统性解决步骤:


1. 检查串口资源占用


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); // 解锁
    }


2. 调整线程优先级


确保finsh线程优先级高于ulog异步线程:



  • 修改finsh优先级(在rtconfig.h中):
     #define FINSH_THREAD_PRIORITY   10  // 默认20,数值越小优先级越高

  • 修改ulog异步线程优先级(在menuconfig中):
     RT-Thread Components → Utilities → Enable ulog → 
         [*] Enable async output →
             (25) The async output thread priority   # 设置为25(比finsh低)


3. 配置ulog异步缓冲区


增大缓冲区防止阻塞:



  • 增大缓冲区尺寸menuconfigrtconfig.h):
     #define ULOG_ASYNC_OUTPUT_BUF_SIZE 2048  // 默认512,建议1024-4096


4. 关闭其他后台输出


临时关闭干扰源以定位问题:



  • 关闭ulog控制台输出(保持文件/网络后端):
     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);
    }

  • 禁用非必要模块(如网络日志、文件日志)。


5. 检查串口驱动与中断


确保驱动适配RT-Thread设备框架:



  • 确认串口驱动实现
     static const struct rt_uart_ops _uart_ops = {
         .configure = _uart_configure,
         .control = _uart_control,
         .putc = _uart_putc,     // 必须实现
         .getc = _uart_getc,
         ...
    };

  • 检查串口中断:避免在中断中打印日志(需用[I]标记)。


6. 动态调试命令


通过初始日志或LED判断系统状态:


   #include 
   LOG_I("System startup");  // 查看是否输出到串口

7. 同步模式测试


临时切换到同步日志验证是否ulog异步引起:


   // 在rtconfig.h中关闭异步模式
   #define ULOG_USING_ASYNC_OUTPUT 0



总结排查流程



  1. 优先级调整 → 提高finsh优先级,降低ulog异步线程优先级

  2. 串口互斥访问 → 加锁或分设备输出

  3. 缓冲区扩大 → 避免ulog堆积阻塞

  4. 精简环境 → 关闭非核心模块

  5. 驱动检查 → 确保串口实现符合设备框架



⚠️ 关键点:finsh线程必须高于ulog异步线程,且双方访问串口时需互斥处理。典型配置:



  • finsh优先级:10~15

  • ulog异步线程优先级:20~25

  • 缓冲区大小 ≥1024



通过以上步骤应能恢复finsh功能。若仍存在问题,建议用J-Link等调试器检查线程阻塞状态。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分