【问题积累】rtt 堆空间不足导致控制台无法工作:无法输入指令

问题描述

在新版本的程序中,使用 init 的方式创建线程

int th_swd_init(void)
{
  static struct rt_thread thd_swd_m;
  static uint8_t stk_swd_m[2048];
  rt_err_t ret;

  /* 创建 SWD 下载处理线程 */
  ret = rt_thread_init(&thd_swd_m, "thd_swd_m", fun_swd_m, RT_NULL,
                       stk_swd_m, 2048, 17, 1);
  if (ret == RT_EOK)
    rt_thread_startup(&thd_swd_m);
  log_print("m_SWD", NP, "thread:thd_swd_m init %s",(ret == RT_EOK) ? "OK" : "FAIL");

  return 0;
}

发现控制台能输出调试信息,但是无法输入指令


问题分析

虽然此时控制台无法输入指令,但是程序还是能正常运行的
在这里插入图片描述
刷卡操作的时候,看到控制台的信息输出有明显迟滞,比LCD上的显示都慢很多,于是猜测是否原乡的控制台线程还是在运行,只是新的程序CPU过于繁忙,导致解析指令没有机会运行
于是在指令中增加调试接口

 extern long list_thread(void);
// 在刷卡函数中添加线程输出信息
void app_card_info_update(void)
{
  int8_t err;
  if ( card_tcb.uid_len == 8)
  {
   ...
    list_thread();
  }
}

在这里插入图片描述
对比之前
在这里插入图片描述
发现此时 tshell 在新的程序中没有启动成功
查找代码中关于tshell创建的地方:

#ifdef RT_USING_HEAP
    /* create or set shell structure */
    shell = (struct finsh_shell *)rt_calloc(1, sizeof(struct finsh_shell));
    if (shell == RT_NULL)
    {
        rt_kprintf("no memory for shell\n");
        return -1;
    }
    tid = rt_thread_create(FINSH_THREAD_NAME,
                           finsh_thread_entry, RT_NULL,
                           FINSH_THREAD_STACK_SIZE, FINSH_THREAD_PRIORITY, 10);
#else
    shell = &_shell;
    tid = &finsh_thread;
    result = rt_thread_init(&finsh_thread,
                            FINSH_THREAD_NAME,
                            finsh_thread_entry, RT_NULL,
                            &finsh_thread_stack[0], sizeof(finsh_thread_stack),
                            FINSH_THREAD_PRIORITY, 10);
#endif /* RT_USING_HEAP */

调试查看实际堆空间
在这里插入图片描述

size = 0x2003000 - 0x2002E858 = 0x7A8 < 0x1000( tshell需要的大小 )

于是从SWD线程和main线程中分出 0x800 出来,再次编译测试
在这里插入图片描述
此线程就启动起来了,且之前的刷卡控制台信息输出缓慢的问题也好了。


总结

调试rtt在最后,如果控制台突然无法使用了,多半是堆空间不足,控制台线程创建的时候空间不足导致的:
** rtthread中: heap_szie = max_size - 静态变量【编译的 ZI RAM】**
如果这个堆空间不足就无法完成控制台线程的创建,此时只需优化线程对栈空间的减小

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值