问题描述
在新版本的程序中,使用 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】**
如果这个堆空间不足就无法完成控制台线程的创建,此时只需优化线程对栈空间的减小