打印
[CIU32L051系列]

CIU32L051 letter Shell终端移植

[复制链接]
423|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
晓伍|  楼主 | 2025-7-8 07:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.Letter Shell终端的介绍
        letter shell 是一个功能强大的嵌入式 shell,作者 NevermindZZT,目前获得 786 个 Star,遵循 MIT 开源协议,letter shell 是一个 C 语言编写的,可以嵌入在程序中的嵌入式 shell,主要面向嵌入式设备,它提供了一种给嵌入式设备的一种输入方法,通过letter可以将嵌入式软件中的相关设计封装成指令的形式,通过letter shell终端发送对应的指令即可调用对应的程序,这大大提高了MCU开发的灵活性。本质上Letter Shell是通过软件的形式给嵌入式设备提供了一种输入形式,可以节省对应的外设,减少了对应的资源消耗。

        本文的主要是讲,通过Letter Shell与SEGGER_RTT实现不需要任何外设进行日志输出的方法,以及如何在软件中封装对应的中断指令,以及letter Shell中断指令的用法。

2.Letter Shell的移植
2.1letter Shell源码的获取
       源码在git上的对应链接: NevermindZZT/letter-shell: letter shell

        若资源下载不下来,则需要挂VPN去下载。

        下载后的源码结构如下图:

     

2.2终端移植
       将下载后的zip资源进行解压,得到2.1所示的对应文件,将所有的文件存放置工程目录下:



        将Segger-RTT下的shell_port.c文件移动到下图对应的文件夹下     



        再将资源文件夹下externsions文件下除LOG文件夹以外的文件全部删除,具体如下:



        将剩余的资源文件添加到工程中具体流程如下:



        添加完成后,打开shell_port.c文件可以看到,这个文件是实现letter终端的数据输入和数据读出,以及通过SEGGER RTT与Letter Shell终端初始化的功能,还有LOG对象的注册等。

        下图是shell_port.c中终端写入的实现,框选内容为需要自己实现的内容。



        另外在该文件中使用需要关联LOG对象和letter shell,所以需要在文件内添加如下内容的代码:      



        这里实现的是RTT与letter shell的交互



这里的尾行输入,我称为底线输入模式



        shell初始化时进行LOG和shell对象的关联



        在letter Shell的配置文件中,需要修改如下内容:



        需要替换为自己工程中的内容。

        后续有可能会需要使用到Shell的伴生对象时需要给他开辟对应的存储空间,改为malloc进行动态开辟和释放,具体如下:

  



        在log文件夹下的log.h文件中需要添加使用log的宏,才可以使用对应的日志输出功能。

具体如下:



        到这里代码需要letter shell已经移植完毕。

3.Letter shell终端与RTT的功能测试
        在main函数中添加如下代码驱动letter shell终端,具体如下:



        此处内容显而易见对RTT和letter shell进行了初始化,并将其进行关联,在while程序中一直执行letter shell终端的任务即可。

        但是当前我们的代码中是没有对应的日志输出的,这是应为我们还没有给letter shell终端添加自定义的相关指令,当然可以通过letter shell终端中默认的一些指令进行测试,不过这里我选择添加一条自定义的指令进行测试,具体流程如下:



        1.定义指令需要调用的函数,这里我随意举一个例子:

int func(int a,char b,char *str)
{

    logPrintln("input int: %d, char: %c, string: %s\r\n", i, ch, str);

    static uint8_t testnum=0;

    testnum++;

    logPrintln("testnum = %d", testnum);

    logError("testnum = %d", testnum);

    logWarning("testnum = %d", testnum);

    logInfo("testnum = %d", testnum);

    logDebug("testnum = %d", testnum);

    logPrintln("testnum = %d", testnum);

    return i + ch + str[0];
}


//这调指令会将上述的func函数添加到letter shell终端中,在RTT对应的输入栏中输入对应的指令即可在系统中调用func这个函数,这条指令各位读者可以参考shell.号文件,该文件内有对该指令的一些解释,并且有多种指令添加的方式,这里就不详细进行讲解
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), func, func, test);//该指令在程序编译时便将该内容添加至了letter shell终端中



终端指令的输入方式:
    指令名称:
        指令名称 + 指令对应的对应调用函数的对应参数
    以func为例,终端中应输入如下指令:
        func 10 d "adwda"\r          (注意这里的\r代表的是回车的意思,必须要添加)




        上述所有内容修改完后,若报错,建议检查头文件是否被正确添加,或者看看是否对应的头文件路径是否有被正确包含。全部无误后,将工程烧录至开发板中。

        在烧录程序前,将下图所示的内容勾选,否则你需要烧录完成后给设备断电后才可看到对应现象。        



4.测试效果
        这里测试,博主使用的是H7 Toll中的RTT进行测试,各位若如果没有H7 Toll,可以使用JLINK的RTT进行测试,具体方法两者均一致。

        启动SEGGER RTT,具体如下



        启动后,RTT的终端呈现如下情况则说明Letter shell的移植已经成功,但还需测试对应的自定义指令是否可以正常使用,具体呈现如下:



        接着在H7 Toll的RTT上位机中对应的输入栏输入对应的定义指令,具体如下:



      上图显示的结构是testnum = 8说明博主已经输入了8次对应的指令,下图是博主输入到第5 次时拍摄的H7 Toll时的效果图,可见我们输入的指令,在我们的嵌入式软件程序中确实被正确执行。

      

5.总结
        本文讲述了如何将Letter shell移植到MCU中和如何自定义指令,通过终端的形式控制MCU去主动执行我们想要执行的程序,这使得MCU的可控制性得到大大提高,且通过RTT进行日志输出,减少了外设资源的使用。

        另外Letter shell还可以设置日志的优先级,并且屏蔽低优先级的日志输出,且不同优先级的日志输出颜色均可设置,这可以大大提高日志查询的效率,协助各位更快的发现产品中存在的问题。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/wxy888888/article/details/149113571

使用特权

评论回复
沙发
暗夜幽灵骑士| | 2025-7-10 10:09 | 只看该作者
这篇文章详细介绍了如何将Letter Shell终端移植到MCU中,并通过RTT实现日志输出,非常实用!

使用特权

评论回复
板凳
逆鳞风暴| | 2025-7-10 22:23 | 只看该作者
这篇文章详细介绍了如何将Letter Shell终端移植到MCU中,并且通过自定义指令来控制MCU执行特定程序,非常实用!

使用特权

评论回复
地板
星空魔法师| | 2025-7-11 13:57 | 只看该作者
这篇文章详细讲解了如何将Letter Shell移植到MCU中,并且通过自定义指令来控制MCU执行程序,非常实用。

使用特权

评论回复
5
幻想收藏家| | 2025-7-14 20:28 | 只看该作者
这篇文章详细介绍了如何将Letter Shell终端移植到MCU中,并通过RTT实现日志输出,非常实用!

使用特权

评论回复
6
瞌睡虫本虫| | 2025-7-15 12:58 | 只看该作者
移植Letter Shell到MCU上确实可以提高开发效率,节省资源,这篇教程很详细,感谢分享!

使用特权

评论回复
7
绝影孤狼| | 2025-7-22 19:06 | 只看该作者
这篇文章详细讲解了如何将Letter Shell终端移植到MCU中,并通过RTT实现日志输出,非常实用!

使用特权

评论回复
8
懒癌晚期患者| | 2025-7-23 08:03 | 只看该作者
这篇文章详细介绍了如何将Letter Shell终端移植到MCU中,并且通过自定义指令来控制MCU执行特定程序,非常有用!

使用特权

评论回复
9
17327196220| | 2025-7-23 16:07 | 只看该作者
有碰到开发问题或者需要芯片、开发板的工程师吗?我们是代理兼FAE,联系我ID(微信)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

91

主题

4313

帖子

1

粉丝