组件-FinSh组件

目录

1、简介

1.1、msh

1.2、FinSH 内置命令

1.2.1、常用命令

2、命令实现原理

3、配置

4、FinS功能和函数

4.1、 finsh_system_init()函数

4.2、权限验证

4.2.1、finsh_get_password()函数

4.2.2、finsh_set_password()函数

4.2.3、finsh_wait_auth()函数

4.3、prompt

4.3.1、finsh_get_prompt_mode()函数

4.3.2、finsh_set_prompt_mode()函数

4.3.3、finsh_get_prompt()函数

4.3.4、finsh_set_prompt()函数

4.4、历史记录

4.4.1、shell_handle_history()函数

4.4.2、shell_push_history()函数


1、简介

FinSH是RT-Thread的命令行组件,提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信。

用户在控制终端输入命令,控制终端通过串口、USB、网络等方式将命令传给设备里的 FinSH,FinSH 会读取设备输入命令,解析并自动扫描内部函数表,寻找对应函数名,执行函数后输出回应,回应通过原路返回,将结果显示在控制终端上。

1.1、msh

msh(module shell)称为传统命令行模式。

msh 通过解析,将输入字符分解成以空格区分开的命令和参数。其命令执行格式如下所示:

command [arg1] [arg2] [...]

注:command既可以是RT-Thread 内置的命令,也可以是可执行的文件。

1.2、FinSH 内置命令

在 RT-Thread 中默认内置了一些 FinSH 命令,在 FinSH 中输入 help 后回车或者直接按下 Tab 键,就可以打印当前系统支持的所有命令。

注:默认命令的数量不是固定的。例如,当打开 DFS 组件时,就会把 ls,cp,cd 等命令加到 FinSH 中。

1.2.1、常用命令

version显示版本信息
list_thread显示线程状态
list_sem显示信号量状态
list_event显示事件状态
list_mutex显示互斥量状态
list_mailbox显示邮箱状态
list_msgqueue显示消息队列状态
list_mempool显示内存池状态
list_timer显示定时器状态
list_device显示设备状态
list显示命令。根据不同的参数显示不同的信息
free显示动态内存状态

2、命令实现原理

1)每个命令使用宏MSH_CMD_EXPORT定义一个finsh_syscall结构体,并将其存放到FSymTab段。__fsym_##cmd##_name和__fsym_##cmd##_desc放在在.rodata.name段。

注:FSymTab段的范围为FSymTab$$Base段至FSymTab$$Limit段。

2)调用时从FSymTab段中比较finsh_syscall结构体的name查找func,然后调用。

struct finsh_syscall
{
    const char     *name;       /* the name of system call */
#if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB)
    const char     *desc;       /* description of system call */
#endif
    syscall_func func;      /* the function address of system call */
};

#define MSH_CMD_EXPORT(command, desc)   \
    MSH_FUNCTION_EXPORT_CMD(command, command, desc)

#define MSH_FUNCTION_EXPORT_CMD(name, cmd, desc)                      \
                const char __fsym_##cmd##_name[] RT_SECTION(".rodata.name") = #cmd;    \
                const char __fsym_##cmd##_desc[] RT_SECTION(".rodata.name") = #desc;   \
                RT_USED const struct finsh_syscall __fsym_##cmd RT_SECTION("FSymTab")= \
                {                           \
                    __fsym_##cmd##_name,    \
                    __fsym_##cmd##_desc,    \
                    (syscall_func)&name     \
                };

3、配置

FINSH_THREAD_NAMEfinsh线程名称
FINSH_THREAD_PRIORITYfinsh线程优先级
FINSH_THREAD_STACK_SIZEfinsh线程栈大小
MSH_USING_BUILT_IN_COMMANDS

使能finsh内置命令。

1)cmd_ps命令。显示线程信息或模块信息

2)cmd_free命令。显示动态内存状态

FINSH_CMD_SIZEfinsh命令行大小
FINSH_ARG_MAX最大参数
FINSH_USING_HISTORY开启历史记录
FINSH_HISTORY_LINESfinsh历史记录数量
FINSH_USING_SYMTAB使能finsh符号表
FINSH_USING_DESCRIPTIONfinsh命令描述
FINSH_ECHO_DISABLE_DEFAULT关闭finsh的echo模式
FINSH_USING_AUTH开启权限验证功能
FINSH_PASSWORD_MAX密码最大长度
FINSH_PASSWORD_MIN密码最小长度
FINSH_DEFAULT_PASSWORD

默认密码

4、FinS功能和函数

FinSH 源码位于components/finsh目录下。

FinSH 支持自动补全、查看历史命令等功能,通过键盘上的按键可以很方便的使用这些功能,FinSH 支持的按键如下表所示:

按键功能描述
Tab 键当没有输入任何字符时按下 Tab 键将会打印当前系统支持的所有命令。若已经输入部分字符时按下 Tab 键,将会查找匹配的命令,也会按照文件系统的当前目录下的文件名进行补全,并可以继续输入,多次补全
↑↓键上下翻阅最近输入的历史命令
退格键删除符
←→键向左或向右移动标
struct finsh_shell
{
    struct rt_semaphore rx_sem;

    enum input_stat stat;

    rt_uint8_t echo_mode: 1;
    rt_uint8_t prompt_mode: 1;

#ifdef FINSH_USING_HISTORY
    rt_uint16_t current_history;
    rt_uint16_t history_count;

    char cmd_history[FINSH_HISTORY_LINES][FINSH_CMD_SIZE];
#endif

    char line[FINSH_CMD_SIZE + 1];
    rt_uint16_t line_position;
    rt_uint16_t line_curpos;

#if !defined(RT_USING_POSIX_STDIO) && defined(RT_USING_DEVICE)
    rt_device_t device;
#endif

#ifdef FINSH_USING_AUTH
    char password[FINSH_PASSWORD_MAX];
#endif
};

4.1、 finsh_system_init()函数

此函数用于创建finsh线程finsh_thread_entry。

int finsh_system_init(void)

4.2、权限验证

FinSH 支持权限验证功能,系统在启动后会进行权限验证,只有权限验证通过,才会开启 FinSH 功能,提升系统输入的安全性。

4.2.1、finsh_get_password()函数

获取验证密码。

const char *finsh_get_password(void)

4.2.2、finsh_set_password()函数

修改验证密码。

rt_err_t finsh_set_password(const char *password)

4.2.3、finsh_wait_auth()函数

此函数用于密码验证。

1)等待输入密码(以回车确认输入完成)

2)密码比较

static void finsh_wait_auth(void)

注:默认验证失败后需等待2S后,才能进行下次验证。

4.3、prompt

4.3.1、finsh_get_prompt_mode()函数

此函数用于获取是否支持prompt。

rt_uint32_t finsh_get_prompt_mode(void)

4.3.2、finsh_set_prompt_mode()函数

此函数用于设置是否支持prompt。

void finsh_set_prompt_mode(rt_uint32_t prompt_mode)

4.3.3、finsh_get_prompt()函数

此函数用于获取prompt。

const char *finsh_get_prompt(void)

注:默认prompt为"msh "

4.3.4、finsh_set_prompt()函数

此函数用于设置prompt。
 

4.4、历史记录

4.4.1、shell_handle_history()函数

输出历史记录。

static rt_bool_t shell_handle_history(struct finsh_shell *shell)

4.4.2、shell_push_history()函数

保存历史记录。

static void shell_push_history(struct finsh_shell *shell)


 


 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值