前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RT-thread —- FinSH 控制台

RT-thread —- FinSH 控制台

作者头像
全栈程序员站长
发布2022-08-31 15:53:36
8480
发布2022-08-31 15:53:36
举报

大家好,又见面了,我是你们的朋友全栈君。

一、介绍

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 模式可以使用如下宏接口:

代码语言:javascript
复制
MSH_CMD_EXPORT(name, desc);//命令及其描述

.这个命令可以导出有参数的命令,也可以导出无参数的命令。导出无参数命令时,函数的入参为 void,示例如下:

代码语言:javascript
复制
void hello(void)
{
    rt_kprintf("hello RT-Thread!\n");
}
MSH_CMD_EXPORT(hello , say hello to RT-Thread);

导出有参数的命令时,函数的入参为 int argc 和 char**argv 。argc 表示参数的个数,argv 表示命令行参数字符串指针数组指针。导出有参数命令示例如下:

代码语言:javascript
复制
static void atcmd(int argc, char**argv)
{
……
}
MSH_CMD_EXPORT(atcmd, atcmd sample: atcmd <server|client>);

3.2、自定义 C-Style 命令和变量

将自定义命令导出到 C-Style 模式可以使用如下接口:

代码语言:javascript
复制
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 来对导出的命令进行重命名。

代码语言:javascript
复制
FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc);
RT-thread ---- FinSH 控制台
RT-thread ---- FinSH 控制台

在重命名的命令名字前加 __cmd_ 就可以将命令导出到 msh 模式,否则,命令会被导出到 C-Style 模式。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143194.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、介绍
  • 二、FinSH 内置命令
    • 2.1、tap键
      • 2.2、显示线程状态
        • 2.3、显示信号量状态
          • 2.4、显示事件状态
            • 2.5、显示互斥量状态
              • 2.6、显示邮箱状态
                • 2.7、显示消息队列状态
                  • 2.8、显示内存池状态
                    • 2.9、显示定时器状态
                      • 2.10、显示设备状态
                        • 2.11、显示动态内存状态
                        • 三、自定义 FinSH 命令
                          • 3.1、自定义 msh 命令
                            • 3.2、自定义 C-Style 命令和变量
                              • 3.3、自定义命令重命名
                          相关产品与服务
                          消息队列 CMQ 版
                          消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档