0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一个开源MCU级的命令行交互组件

jf_pJlTbmA9 来源:维护:Nrusher 作者:维护:Nrusher 2023-10-17 16:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、nr_micro_shell介绍

在进行调试和维护时,常常需要与单片机进行交互,获取、设置某些参数或执行某些操作,nr_micro_shell正是为满足这一需求,针对资源较少的MCU编写的基本命令行工具。虽然RT_Thread组件中已经提供了强大的finsh命令行交互工具,但对于ROMRAM资源较少的单片机,finsh还是略显的庞大,在这些平台上,若仍想保留基本的命令行交互功能,nr_micro_shell是一个不错的选择。

nr_micro_shell具有以下优点

1.占用资源少,使用简单,灵活方便。使用过程只涉及两个shell_init()和shell()两个函数,无论是使用RTOS还是裸机都可以方便的应用该工具,不需要额外的编码工作。

2.交互体验好。完全类似于linux shell命令行,当串口终端支持ANSI(如Hypertrm终端)时,其不仅支持基本的命令行交互,还提供Tab键命令补全,查询历史命令,方向键移动光标修改功能。

3.扩展性好。nr_micro_shell为用户提供自定义命令的标准函数原型,只需要按照命令编写命令函数,并注册命令函数,即可使用命令。

nr_micro_shell和相同配置下的finsh (finsh不使用msh)占用资源对比

wKgZomUD6LyACC8CAAA_iWGFbWE152.png

两者配置都为

最多3条历史命令。

支持Tab补全 。

命令行最大长度为100。

最多10个命令参数。

命令行线程堆栈为512字节。

nr_micro_shell演示效果如下

wKgaomUD6L6AH7MJAAj12eu6YWo543.gif
wKgaomUD6MCAf9uYAAYQ5gkcWX4476.gif

1.1 目录结构

wKgZomUD6MGALN-oAABnkJblsnk087.png

1.2 许可证

nr_micro_shell package 遵循 MIT 许可,详见 LICENSE 文件。

1.3 依赖

无依赖

2、Rt_Thread下ENV工具使用nr_micro_shell

RT_Thread 使用 nr_micro_shell package package 需要在 RT-Thread 的包管理器中选择它,具体路径如下:

RT-Thread online packages
    tools packages ---> 
        [*] nr_micro_shell:Lightweight command line interaction tool. --->

相关的设置在按下sapce键选中后,按enter可进行相关参数配置。然后让 RT-Thread 的包管理器自动更新,或者使用 pkgs --update 命令更新包到 BSP 中。

若您需要运行示例,请保证RT_Thread配置中的Using console for kt_printf.选项是被打开的,kt_printf可以正常工作,且Use components automatically initialization.选项打开。编译直接下载或仿真便可以使用nr_micro_shell。命令行空白时按Tab,可显示所有支持的命令,测试示例命令可见doc/pic下的使用示例动图。自定义命令过程,参照下文3. 裸机下使用nr_micro_shell package中的方法。

3、裸机下使用nr_micro_shell package

3.1 配置:

所有配置工作都可以在 nr_micro_shell_config.h 中完成。有关详细信息,请参见文件中的注释。

3.2 用法:

确保所有文件都已添加到项目中。

确保nr_micro_shell_config.h中的宏函数"shell_printf(),ansi_show_char()"可以在项目中正常使用。

使用示例如下

#include "nr_micro_shell.h"

int main(void)
{
    /* 初始化 */
    shell_init();

    while(1)
    {
        if(USART GET A CHAR 'c')
        {
            /* nr_micro_shell接收字符 */
            shell(c);
        }
    }
}

建议直接使用硬件输入前,建议使用如下代码(确保可以正常打印信息),验证nr_micro_shell是否可以正常运行

#include "nr_micro_shell.h"

int main(void)
{
    unsigned int i = 0;
    //匹配好结束符配置 NR_SHELL_END_OF_LINE 0
    char test_line[] = "test 1 2 3n"
    /* 初始化 */
    shell_init();
    
    /* 初步测试代码 */
    for(i = 0; i < sizeof(test_line)-1; i++)
    {
        shell(test_line[i]);
    }

    /* 正式工作代码 */
    while(1)
    {
        if(USART GET A CHAR 'c')
        {
            /* nr_micro_shell接收字符 */
            shell(c);
        }
    }
}

3.3 添加自己的命令

STEP1:

您需要在nr_micro_shell_commands.c*中实现一个命令函数。命令函数的原型如下

void your_command_funtion(char argc, char *argv)
{
    .....
}

argc是参数的数目。argv存储每个参数的起始地址和内容。如果输入字符串是

test -a 1

则argc为3,argv的内容为

-------------------------------------------------------------
0x03|0x08|0x0b|'t'|'e'|'s'|'t'|''|'-'|'a'|''|'1'|''|
-------------------------------------------------------------

如果想知道第一个或第二个参数的内容,应该使用

/* "-a" */
printf(argv[argv[1]])
/* "1" */
printf(argv[argv[2]])

STEP2: 在使用命令前需要注册命令,共有两种方法注册命令

1.当配置文件中NR_SHELL_USING_EXPORT_CMD未被定义,在 static_cmd[] 表中写入

const static_cmd_st static_cmd[] =
{
   .....
   {"your_command_name",your_command_funtion},
   .....
   {"",NULL}
};

注意:不要删除{"",NULL}!

2.当配置文件中NR_SHELL_USING_EXPORT_CMD被定义,且NR_SHELL_CMD_EXPORT()支持使用的编译器时,可以使用以下方式注册命令

NR_SHELL_CMD_EXPORT(your_command_name,your_command_funtion);

4、Linux下使用nr_micro_shell仿真

在工程./examples/simulator/目录下存放着nr_micro_shell仿真代码,仍在./examples/nr_micro_shell_commands.c文件中按上述方式添加自定义命令,添加完成后可以使用make命令编译源码,生产的可执行文件为./examples/simulator/out/nr_micro_shell或./examples/simulator/out/nr_micro_shell_db。可使用的make命令如下

# 编译可执行文件
make
# 编译可仿真执行文件
make debug
# 清除编译生成文件
make clean

5、注意事项

根据你的使用习惯使用NR_SHELL_USING_EXPORT_CMD选择命令注册方式。

使用注册表注册命令时,确保您的工程中存在注册表

const static_cmd_st static_cmd[] =
{
   .....
   {"",NULL}
};

使用NR_SHELL_CMD_EXPORT()时确保,NR_SHELL_CMD_EXPORT()支持使用的编译器,否则会报错。

nr_micro_shell 不支持ESC键等控制键(控制符)。

直接来源:最后一个bug
原文来源:维护:Nrusher
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    19110

    浏览量

    403305
  • 开源
    +关注

    关注

    3

    文章

    4327

    浏览量

    46429
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ROC rk3588s PC的uboot命令行的启动

    到了 Ubuntu 启动流程。根据您的 Wiki 指导,我曾尝试在启动时通过串口终端反复按下 Ctrl+C、空格等按键,但始终无法进入 U-Boot 命令行。我怀疑是 U-Boot 环境变量中的 bootdelay
    发表于 04-06 21:40

    涂鸦CLI正式开源:让AI Agent命令管理3000+品类智能设备

    最近,CLI(命令行工具)正在成为AIAgent时代的基础设施。飞书、企业微信、钉钉等多家主流办公协作平台,相继开源了各自的CLI工具,将消息、文档、日程等产品能力封装为命令行接口,供开发者
    的头像 发表于 04-02 18:10 267次阅读
    涂鸦CLI正式<b class='flag-5'>开源</b>:让AI Agent<b class='flag-5'>一</b>行<b class='flag-5'>命令</b>管理3000+品类智能设备

    极海APM32F427 MCU在RT-Thread系统上使用LwIP网络功能

    下面是基于RT-Thread的ENV命令行开发环境,在APM32F427上使用LwIP网络协议栈实现网络通信功能的。
    的头像 发表于 04-02 15:19 8480次阅读
    极海APM32F427 <b class='flag-5'>MCU</b>在RT-Thread系统上使用LwIP网络功能

    运维工程师必须掌握的10系统命令

    系统命令是运维工程师与服务器交互的基础工具。虽然现代运维工作有大量的自动化工具和平台,但掌握核心系统命令仍然必要。命令行工具响应速度快、不依赖图形界面、可以组合使用应对复杂场景。在服务
    的头像 发表于 03-23 10:28 209次阅读

    Kubernetes kubectl命令行工具详解

    kubectl是Kubernetes官方提供的命令行工具,作为与Kubernetes集群交互的主要接口,它通过调用Kubernetes API Server实现对集群资源的全面管理。在生产环境中,运维工程师需要熟练掌握kubectl命令
    的头像 发表于 02-02 16:40 585次阅读

    命令行阿里千问搭建过程

    克隆千问仓库,安装依赖; 下载模型权重; 命令行执行启动脚本,配置参数后运行推理。
    发表于 12-24 10:35

    使用AT组件命令行可以发送成功,但是在程序里发送总是超时,怎么解决?

    是AT说明里的例程,按照例程把发送命令加入到控制台,输入命令是可以正确响应的。 但是我在程序里写是类似的代码,就提示超时。 在提示超时后,又会显示正确的响应结果,这是为了啥?! 下面是我的程序 int
    发表于 09-23 07:14

    所见即所得——Luban-Lite VS Code插件让开发实现“命令行自由”

    NEWS所见即所得!Luban-LiteVSCode插件指南亲爱的开发者朋友们,你是否还在为嵌入式开发中频繁切换命令行而抓狂?配置环境参数如“走迷宫”,编译烧录还需切换AiBurn?今天,匠芯创为您
    的头像 发表于 08-07 15:38 1212次阅读
    所见即所得——Luban-Lite VS Code插件让开发实现“<b class='flag-5'>命令行</b>自由”

    解析K8S实用命令

    前言: 作为运维工程师,掌握 Kubernetes 命令行工具是日常工作的核心技能。本文将深入解析 K8S 最实用的命令,从基础操作到高级技巧,助你成为容器化集群管理专家。
    的头像 发表于 07-24 14:07 991次阅读

    已收藏!你需要知道的57常用树莓派命令

    初次使用树莓派并不总是那么容易,因为你可能还没有使用命令行的习惯。然而,终端命令是必不可少的,而且通常比通过图形用户界面(GUI)操作更高效。那么,有哪些重要的命令是你应该知道的呢?有相当多的
    的头像 发表于 07-23 18:36 1281次阅读
    已收藏!你需要知道的57<b class='flag-5'>个</b>常用树莓派<b class='flag-5'>命令</b>!

    USB串行配置实用程序是否有可用的命令行版本?

    USB串行配置实用程序是否有可用的命令行版本?
    发表于 07-22 08:09

    【RA-Eco-RA6M4开发板评测】移植shell实现命令交互

    /XLmbJn0SKoDT1aLdxHDrbg 超级精简高可移植的shell命令行C实现二. 移植移植参考上述文章,很简单只需要实现输入输出接口 即可。代码见shell.c/h shell_func.c/h 接口
    发表于 07-19 22:47

    浅谈wsl --update` 命令行选项无效的解决方案

    PS C:\Users\Administrator> wsl --update >> 命令行选项无效: --update
    的头像 发表于 06-27 10:28 1.2w次阅读

    2025科大讯飞智能交互产品升级发布会定档

    命令行到图形界面,从触屏操作到语音助手,技术浪潮重新定义人机交互的边界。当大模型的智慧涌现,机器从“能听会说”真正走向“能理解会思考”,那么未来交互的新范式将是什么?
    的头像 发表于 06-11 17:12 1375次阅读

    飞凌嵌入式ElfBoard ELF 1板卡-Uboot常用命令之查看命令

    上电后,在uboot倒计时结束前按下空格,输入9进入uboot命令行:进入uboot命令行之后,可以通过输入“?”或者help可以查看uboot全部命令。如图(图未截全):每一个
    发表于 05-22 11:26