CIU32L051 letter Shell终端移植
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;
}
//这调指令会将上述的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
这篇文章详细介绍了如何将Letter Shell终端移植到MCU中,并通过RTT实现日志输出,非常实用!
这篇文章详细介绍了如何将Letter Shell终端移植到MCU中,并且通过自定义指令来控制MCU执行特定程序,非常实用!
这篇文章详细讲解了如何将Letter Shell移植到MCU中,并且通过自定义指令来控制MCU执行程序,非常实用。
页:
[1]