1、msh配置
msh功能是自动开启的,配置如下,可以在“RT-Thread Settings”里去修改。
调试过程中遇到msh不能使用,理解msh也是一个线程,有自己的优先级20,高优先级的线程(比如main是10)如果一直执行,就会阻塞msh。
2、自带的msh命令
2.1、系统msh命令
因为开启了ulog日志功能,所以系统自带的msh命令会加上这一部分,输入“help”+回车,可以看到命令列表。
clear是清屏、version是打印内核版本、list会列出关于系统的各种信息、ps列出线程信息、free是查看内存使用、pin是控制GPIO、reboot重启系统;
2.2、ulog提供的msh命令
因为使用ulog功能,所以就会打印出很多日志信息,但是使用msh的时候又不希望这些信息刷屏,所以可以临时过滤日志方便交互、或者终端开启滚动锁定。
2.2.1、关于level的取值
- 0:断言
- 3:错误
- 4:警告
- 6:信息
- 7:调试
2.2.2、按模块过滤 ulog_tag_lvl <tag> <level>
功能 | 函数调用 | 执行命令 |
---|---|---|
关闭 wifi 模块全部日志 | ulog_tag_lvl_filter_set("wifi", LOG_FILTER_LVL_SILENT); | ulog_tag_lvl wifi 0 |
开启 wifi 模块全部日志 | ulog_tag_lvl_filter_set("wifi", LOG_FILTER_LVL_ALL); | ulog_tag_lvl wifi 7 |
设置 wifi 模块日志级别为警告 | ulog_tag_lvl_filter_set("wifi", LOG_LVL_WARNING); | ulog_tag_lvl wifi 4 |
2.2.3、按全局级别过滤 ulog_lvl <level>
功能 | 函数调用 | 执行命令 |
---|---|---|
关闭全部日志 | ulog_global_filter_lvl_set(LOG_FILTER_LVL_SILENT); | ulog_lvl 0 |
开启全部日志 | ulog_global_filter_lvl_set(LOG_FILTER_LVL_ALL); | ulog_lvl 7 |
设置日志级别为警告 | ulog_global_filter_lvl_set(LOG_LVL_WARNING); | ulog_lvl 4 |
剩余内容见ulog官方手册:RT-Thread 文档中心-ulog日志
3、添加msh命令
添加msh命令有两步:写想要执行的函数,然后使用MSH_CMD_EXPORT导出;
3.1、MSH_CMD_EXPORT
MSH_CMD_EXPORT(name, desc);
name是函数的名称,desc是description描述,也就是help列出命令后方展示的内容;
3.2、添加不带参数的msh命令
void hello(void)
{
rt_kprintf("hello RT-Thread!\n");
}
MSH_CMD_EXPORT(hello , say hello to RT-Thread);
3.3、添加不带参数的msh命令
需要注意函数的参数格式为(int argc,char** argv)。
- argc的类型是整型,代表参数的个数(包含函数名);
- argv的类型是字符串数组指针,代表参数的内容(包含函数名);
下面的示例是官方的,在此基础上解释:
- 1、msh输入:atcmd client
- 2、解析msh命令:需要执行的函数是atcmd,传入的参数:argc=2,argv=["atcmd","client"]
- 3、根据解析内容执行atcmd函数
static void atcmd(int argc, char**argv)
{
if (argc < 2){
rt_kprintf("Please input'atcmd <server|client>'\n");
return;
}
if (!rt_strcmp(argv[1], "server")){
rt_kprintf("AT server!\n");
}else if (!rt_strcmp(argv[1], "client")){
rt_kprintf("AT client!\n");
}else{
rt_kprintf("Please input'atcmd <server|client>'\n");
}
}
MSH_CMD_EXPORT(atcmd, atcmd sample: atcmd <server|client>);
参考资料:
RT-Thread 文档中心 msh
RT-Thread 文档中心 ulog