FINSH模块
MSH
初始化
- 根据链接脚本指明FINSH使用内存空间
_syscall_table_begin
_syscall_table_end
的地址
FSymtab段
1 | . = ALIGN(4); |
__fsymtab_start
和__fsymtab_end
用于指明finsh使用内存- FSymTab用于存放所有注册命令的结构体
struct finsh_syscall
,包括命令名称,命令选项,命令描述,命令函数执行地址信息
宏
1 | /** |
- 宏过载语法,选择2个参数使用
MSH_FUNCTION_CMD2
,_MSH_FUNCTION_CMD2
的desc为0;3个参数使用MSH_FUNCTION_CMD2_OPT
- 定义字符串成员,地址定义为.rodata.name;内容为#cmd;
1 | const char __fsym_# |
__fsym_##cmd
存储名称,细节,挂钩的函数指针地址
遍历FINSH命令
1 | for (index = _syscall_table_begin; |
TAB补全实现
- 判断输入为
/t
- 将光标移动到行首;使用
/b
退格,一个个退回删除之前的显示字符 - 将命令首地址传入
shell_auto_complete
- 计算偏移地址
shell_auto_complete
msh_auto_complete
- 首地址为
/0
,即无输入任何字符串,直接TAB/t
,则调用msh_cmd
输出所有支持的命令 - 匹配命令名字,并输出命令
1 | for (index = _syscall_table_begin; index < _syscall_table_end; FINSH_NEXT_SYSCALL(index)) |
- 输出提示字符
msh />
与命令输入的字符串
1 | rt_kprintf("%s%s", FINSH_PROMPT, prefix); |
- finsh_get_prompt输出提示
1 |
|
msh_opt_auto_complete
1 | argc = msh_get_argc(prefix, &opt_str); |
msh_get_argc
获取命令空格之后参数- 没获取到参数时,判断
prefix
不是一个已知的命令,并且命令行字符串的最后一个字符是空格 msh_get_cmd_opt
获取syscall_table
中是否有匹配的命令argc
为0,输出msh_opt_help
所有的命令?msh_opt_complete
与msh_auto_complete
作用相同
TAB 子选项自动补全
- msh_opt_auto_complete
- 使用完成命令注册
1 |
|
SHELL
finsh_system_init
分配finsh结构体使用内存
- 创建
finsh_thread_entry
线程 - 创建信号量,用于阻塞接字符串;信号量由控制台设备对象解除
- 设置提示模式
- INIT_APP_EXPORT中调用
finsh_thread_entry
获取控制台设备对象
获取控制台密码用于密码确认
finsh_wait_auth
- 阻塞等待获取密码;密码输入显示
*
- 敲入回车认为密码输入完成
- 进入密码验证判断;失败线程阻塞等待2S再次获取输入字符
- 阻塞等待获取密码;密码输入显示
进入控制台线程
finsh_getchar
rt_sem_take(&shell->rx_sem, RT_WAITING_FOREVER);
等待信号量释放finsh_rx_ind
函数中释放信号量
- handle control key判断
1
2
3
4
5
6
7/*
* handle control key
* up key : 0x1b 0x5b 0x41
* down key: 0x1b 0x5b 0x42
* right key:0x1b 0x5b 0x43
* left key: 0x1b 0x5b 0x44
*/- 上下键:历史命令显示
- 左右键:移动当前光标
- tab键 补全命令
- 删除键:删除
- 回车键:执行msh命令
设置控制台设备模式
1 | /** |
历史命令显示
- 回车存入历史命令
shell_push_history
- 上下键显示历史命令
shell_handle_history
MSH命令执行
cmd&msh_parse&&msh_file
- 一些系统命令的输出
- 一些共用的解析
- 文件系统的命令支持
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 wdfk-prog的个人博客!
评论