RT-Thread论坛
直播中

云达贞

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

msh突然无法使用,不显示是怎么回事?

基于rtt nano移植了agile_modbus_rtu的从机与freemodbus的tcp程序,在修改 #define FINSH_THREAD_STACK_SIZE 4096前大小为1024,只有rtu可以使用,此时msh还可以正常使用,改为4096后rtu与tcp都可以使用了,但是没有了msh。求助各位大佬,是哪里的问题

回帖(1)

djelje

2025-9-8 17:48:33

从你的描述来看,问题可能出在系统资源和线程配置上。以下是可能的原因和解决方案:


1. FinSH线程栈溢出


原栈大小1024可能不满足需求,但增大到4096后占用了更多资源,导致FinSH无法启动。


解决方案:


// 在rtconfig.h中适当调整栈大小
#define FINSH_THREAD_STACK_SIZE 2048  // 尝试折中值

2. 系统堆内存不足


4096的栈导致内存耗尽,FinSH线程创建失败。


解决方案:



  1. 检查堆大小(RT_HEAP_SIZE),确保足够:
    // 在board.h中调整堆大小(至少20KB)
    #define RT_HEAP_SIZE (20*1024)  // 原值基础上增加

  2. 查看启动日志确认内存分配状态


3. 线程优先级冲突


TCP线程可能阻塞了FinSH线程。


解决方案:
提高FinSH线程优先级:


// 在finsh_port.c中修改
finsh_thread->init_priority = 10;  // 默认20,数字越小优先级越高

4. 串口设备冲突


RTU占用串口导致FinSH无法访问同一串口。


解决方案:


// 方法1:为FinSH指定其他串口
rt_device_t finsh_dev = rt_device_find("uart2");
finsh_set_device(finsh_dev->parent.name);

// 方法2:为同一串口实现多路复用

5. 启动顺序问题


TCP线程抢先占满资源。


解决方案:
延迟启动Modbus线程:


// 在main.c中
int main(void)
{
    rt_thread_delay(100); // 先让FinSH启动
    start_modbus_threads();
}

6. 调试建议



  1. 添加内存监控代码:
    size_t total, used, max;
    rt_memory_info(&total, &used, &max);
    rt_kprintf("Memory: %d/%d (max:%d)n", used, total, max);

  2. 检查线程列表:
    msh > ps_thread  # 观察FinSH线程是否存在


7. 替代方案


若仍无法解决,可启用Finsh的Telnet模式:


// 在rtconfig.h中启用
#define FINSH_USING_SERVER
#define FINSH_USING_SERVER_TELNET

关键检查点:



  1. 系统剩余内存是否大于8KB

  2. FinSH线程启动返回值

  3. 串口设备错误计数

  4. RT-Thread版本兼容性(检查agile_modbus对FinSH的影响)


建议先尝试折中的2048栈大小并增加堆内存,再逐步排除其他原因。如果使用调试器,可在finsh_thread_entry入口设置断点验证线程是否运行。

举报

更多回帖

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