大家好,又见面了,我是你们的朋友全栈君。
一、介绍
FinSH 是 RT-Thread 的命令行组件(shell),有了 shell,就像在开发者和计算机之间架起了一座沟通的桥梁,开发者能很方便的获取系统的运行情况,并通过命令控制系统的运行。特别是在调试阶段,有了 shell,开发者除了能更快的定位到问题之外,也能利用 shell 调用测试函数,改变测试函数的参数,减少代码的烧录次数,缩短项目的开发时间。
FinSH 支持两种输入模式,分别是传统命令行模式(msh,较常用)和 C 语言解释器模式,但是两者不能同时使用。
二、FinSH 内置命令
2.1、tap键
按下 Tab 键后打印出来的当前支持的所有显示 RT-Thread 内核状态信息的命令。
2.2、显示线程状态
使用 ps 或者 list_thread 命令来列出系统中的所有线程信息,包括线程优先级、状态、栈的最大使用量等。
2.3、显示信号量状态
使用 list_sem 命令来显示系统中所有信号量信息,包括信号量的名称、信号量的值和等待这个信号量的线程数目。
2.4、显示事件状态
使用 list_event 命令来显示系统中所有的事件信息,包括事件名称、事件的值和等待这个事件的线程数目。
2.5、显示互斥量状态
使用 list_mutex 命令来显示系统中所有的互斥量信息,包括互斥量名称、互斥量的所有者和所有者在互斥量上持有的嵌套次数等。
2.6、显示邮箱状态
使用 list_mailbox 命令显示系统中所有的邮箱信息,包括邮箱名称、邮箱中邮件的数目和邮箱能容纳邮件的最大数目等。
2.7、显示消息队列状态
使用 list_msgqueue 命令来显示系统中所有的消息队列信息,包括消息队列的名称、包含的消息数目和等待这个消息队列的线程数目。
2.8、显示内存池状态
使用 list_mempool 命令来显示系统中所有的内存池信息,包括内存池的名称、内存池的大小和最大使用的内存大小等。
2.9、显示定时器状态
使用 list_timer 命令来显示系统中所有的定时器信息,包括定时器的名称、是否是周期性定时器和定时器超时的节拍数等。
2.10、显示设备状态
使用 list_device 命令来显示系统中所有的设备信息,包括设备名称、设备类型和设备被打开次数。
2.11、显示动态内存状态
使用 free 命令来显示系统中所有的内存信息。
三、自定义 FinSH 命令
除了 FinSH 自带的命令,FinSH 还也提供了多个宏接口来导出自定义命令,导出的命令可以直接在FinSH 中执行。
3.1、自定义 msh 命令
自定义的 msh 命令,可以在 msh 模式下被运行,将一个命令导出到 msh 模式可以使用如下宏接口:
MSH_CMD_EXPORT(name, desc);//命令及其描述
.这个命令可以导出有参数的命令,也可以导出无参数的命令。导出无参数命令时,函数的入参为 void,示例如下:
void hello(void)
{
rt_kprintf("hello RT-Thread!\n");
}
MSH_CMD_EXPORT(hello , say hello to RT-Thread);
导出有参数的命令时,函数的入参为 int argc 和 char**argv 。argc 表示参数的个数,argv 表示命令行参数字符串指针数组指针。导出有参数命令示例如下:
static void atcmd(int argc, char**argv)
{
……
}
MSH_CMD_EXPORT(atcmd, atcmd sample: atcmd <server|client>);
3.2、自定义 C-Style 命令和变量
将自定义命令导出到 C-Style 模式可以使用如下接口:
FINSH_FUNCTION_EXPORT(name, desc);
与msh类似,不赘述。
3.3、自定义命令重命名
FinSH 的函数名字长度有一定限制,它由 finsh.h 中的宏定义 FINSH_NAME_MAX 控制,默认是16 字节,这意味着 FinSH 命令长度不会超过 16 字节。这里有个潜在的问题:当一个函数名长度超过FINSH_NAME_MAX 时,使用 FINSH_FUNCTION_EXPORT 导出这个函数到命令表中后,在 FinSH符号表中看到完整的函数名,但是完整输入执行会出现 null node 错误。这是因为虽然显示了完整的函数名,但是实际上 FinSH 中却保存了前 16 字节作为命令,过多的输入会导致无法正确找到命令,这时就可以使用 FINSH_FUNCTION_EXPORT_ALIAS 来对导出的命令进行重命名。
FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc);
在重命名的命令名字前加 __cmd_ 就可以将命令导出到 msh 模式,否则,命令会被导出到 C-Style 模式。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143194.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...