前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >letter-shell串口终端在高云FPGA上的移植

letter-shell串口终端在高云FPGA上的移植

原创
作者头像
单片机点灯小能手
修改于 2023-09-24 04:09:55
修改于 2023-09-24 04:09:55
87800
代码可运行
举报
运行总次数:0
代码可运行

shell,中文是外壳的意思,就是操作系统的外壳。通过shell命令可以操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。

嵌入式平台可以基于串口实现shell功能,通过对串口命令的解析,可以执行相应的函数,查询变量的值等等。

本文介绍letter-shell开源shell库在TangNano 4K开发板、高云GW1NSR-4C ARM处理器上的移植和应用。

letter-shell简介

letter-shell,一个功能强大的嵌入式shell,由标准C语言开发,可以在各种嵌入式平台上使用,可以通过命令行来执行函数,查询变量的值等等,支持裸机运行或RTOS运行,最新的发布版本是v3.1.2,letter-shell有以下功能:

  • 命令自动补全
  • 快捷键功能定义
  • 命令权限管理
  • 用户管理
  • 变量支持
  • 代理函数和参数代理解析

代码完全开源,并遵循MIT开源协议,Github收获近1K Star。

开源地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/NevermindZZT/letter-shell

作者的主页地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://nevermindzzt.github.io/

目前还保持更新状态,最近的一次提交是2023.07.25。

letter-shell源码获取

打开上文中letter-shell的开源地址,直接下载最新版本的Release代码,

或者,通过Git命令获取目前最新的代码,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git clone https://github.com/NevermindZZT/letter-shell.git --depth=1
​
Cloning into 'letter-shell'...
remote: Enumerating objects: 72, done.
remote: Counting objects: 100% (72/72), done.
remote: Compressing objects: 100% (66/66), done.
remote: Total 72 (delta 3), reused 35 (delta 2), pack-reused 0
Receiving objects: 100% (72/72), 783.28 KiB | 344.00 KiB/s, done.
Resolving deltas: 100% (3/3), done.

src目录中就是letter-shell的源文件,demo文件夹下是基于ESP32和STM32的移植示例代码。

letter-shell移植

首先把src文件夹的所有文件复制到GW1NSR-4C Keil工程的用户目录下,并新建两个接口文件:shell_port.cshell_port.h,用来对接shell库。

把这些文件都导入到我们的工程中,并包含头文件路径。

shell_cfg.h文件通过宏定义,可以实现功能的配置,非常灵活。

在shell_port.c文件中实现shell_write函数(串口发送字符串),并进行shell初始化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "shell.h"
#include "drv_uart.h"
​
Shell shell;
char shellBuffer[512];
​
short userShellWrite(char *data, unsigned short len)
{
    UART_SendString(UART0, data);
    return len;
}void userShellInit(void)
{
    shell.write = userShellWrite;shellInit(&shell, shellBuffer, 512);
}

对于裸机移植,不用实现shell read函数,只需要实现write函数。

并在shellport.h文件中进行声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef __SHELL_PORT_H__
#define __SHELL_PORT_H__
​
#include "shell.h"
​
extern Shell shell;void userShellInit(void);
​
#endif

然后在串口接收中断服务函数,每接收到一字节数据调用shellHandler函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void UART0_Handler(void)
{
    char rx = 0;
    
    if(UART_GetRxIRQStatus(UART0) == SET)
    {
        rx = UART_ReceiveChar(UART0);
        shellHandler(&shell, rx);
    }
    
    UART_ClearRxIRQ(UART0);
}

主程序初始化时调用userShellInit函数,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "main.h"
​
int main(void)
{
    delay_init();
    uart0_init(115200); //enable rx interrupt
    
    userShellInit();
    
    while(1)
    {}
}

重新编译生成bin文件,并下载到开发板,打开串口终端,如SercureCRT,可以看到串口输出如下信息,说明移植成功,按下tab键,会提示当前支持的一些命令:

函数和变量应用示例

移植成功之后,我们来演示函数和变量的调用,即通过在终端输入函数名和参数可以直接执行函数,输入变量名可以直接打印变量的实时值。

定义一些变量和函数,并注册到shell命令解析列表中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "main.h"
​
char str[100] = "Hello GoWin GW1NSR-4C (TangNano 4K)";
int cnt = 0;
​
int func(int i, char ch, char *str)
{
    printf("input int: %d, char: %c, string: %s\r\n", i, ch, str);
    return 1;
}
//获取系统频率
int get_sysclk(void)
{
    printf("SystemCoreClock = %d\r\n", SystemCoreClock);
    printf("APB1 CLK = %d\r\n", PCLK1);
    printf("APB2 CLK = %d\r\n", PCLK2);
    printf("AHB CLK  = %d\r\n", HCLK);
    return 2;
}SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), get_sysclk, get_sysclk, test);
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), func, func, test);
SHELL_EXPORT_VAR(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_VAR_INT), cnt, &cnt, test);
SHELL_EXPORT_VAR(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_VAR_STRING), str, str, test);
​
int main(void)
{
    delay_init();
    uart0_init(115200); //enable rx interrupt
    
    printf("SystemCoreClock = %d\r\n", SystemCoreClock);
    printf("APB1 CLK = %d\r\n", PCLK1);
    printf("APB2 CLK = %d\r\n", PCLK2);
    printf("AHB CLK  = %d\r\n", HCLK);
    printf("Hello GW1NSR-4C SoC(ARM Cortex-M3)\r\n");
    printf("letter-shell Example\r\n");
    userShellInit();
    
    while(1)
    {
        delay_ms(1000);
        cnt++;
    }
}

下载,运行。

在终端中直接输入对应的函数名即可直接运行函数,如果函数带参数,还可以在后面输入参数,参数类型支持整形、字符、字符串等多种类型,而且运行结束可以看到函数的返回值,输入变量的名字,可以直接获取到当前实时值,变量类型值整形和字符、字符串多种类型,非常强大、方便。

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
从零开始的异世界生信学习 linux部分 linux 基础---学习笔记-3 Linux三剑客 grep,sed,awk
-w:word 精确查找某个关键词 pattern less -S Data/example.gtf | grep -w 'gene' ##匹配文件中含有gene的文字
用户10361520
2023/02/21
5790
awk、sed、grep
[https://www.runoob.com/linux/linux-comm-
花落花相惜
2021/12/04
1.3K0
Linux:让你效率起飞的三驾马车
是对字符串操作的一种逻辑公式,就是用事先 定义好的一些特定字符、及这些特定字符的组合,组成一个 “规则字符串”,这个“规则字符串”用来表达对字符串的 一种过滤逻辑。
不会写代码的医学生
2024/03/21
1540
Linux学习笔记-Day13
序列行:一个字母代表一个碱基/氨基酸,为ATCGN或20种氨基酸。#N代表在测序中无法确定具体是什么碱基
用户11190095
2024/07/28
1770
Linux进阶 03 文本处理三驾马车
⭐重头戏来啦!真的很难很繁琐,每个命令下面又有许多个小参数,套娃!先记录下来以后要多看看~
可乐同学与生信死磕到底
2024/04/18
2621
跟萌老师学Linux的第三天
是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
贝诺酯
2023/03/23
1.2K0
生信马拉松 Day13 Linux-3笔记
实际容忍度很高,pattern写在左后,或者options写在pattern后面都可以
阿呆的月历
2024/02/04
1950
Linux三剑客(grep、sed、awk)
下面所说的是Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。
全栈程序员站长
2022/07/21
3.1K0
Linux三剑客(grep、sed、awk)
五分钟入门文本处理三剑客grep awk sed
grep awk sed是Linux下文本处理常用的命令,能完成很多神奇的操作,今天就分享一下这三个命令最常见的用法
Java识堂
2020/05/27
6990
linux学习第二十六篇:正则介绍,grep,sed,awk命令
正则介绍 正则就是一串有规律的字符串,掌握好正则对于编写shell脚本有很大帮助,各种编程语言中都有正则,原理是一样的。正则表达式是这样解释的:它是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。对于系统管理员来讲,正则表达式贯穿在我们的日常运维工作中,无论是查找某个文档,抑或查询某个日志文件分析其内容,都会用到正则表达式。其实正则表达式,只是一
用户1215343
2018/02/05
4.1K0
linux学习第二十六篇:正则介绍,grep,sed,awk命令
Linux的文本处理工具浅谈-awk sed grep
日志样子举例如下: http://youku.com 200 http://youku.com 302 http://youku.com 403 http://youku.com 502 http://baidu.com 302 http://baidu.com 404 现想使用awk命令按域名统计 返回码大于等于400的百分比,假如优酷总共有4行,大于等于400的返回码有两行,那占比就为50%
sunsky
2020/08/20
3.6K0
Linux三剑客之grep,awk,sed命令必知必会
Grep是用于快速搜索匹配模式的简单工具,但是awk更像是一种编程语言,用于处理文件并根据输入值生成输出。
Vincent-yuan
2021/12/20
9.5K0
Linux三剑客之grep,awk,sed命令必知必会
Linux 三剑客grep sed 与 awk
grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。
PHP开发工程师
2022/08/12
9150
awk(报告生成器),grep(文本过滤器),sed(流编辑器)使用入门
三剑客 linux下的文本三剑客 grep egrep,grep,fgrep 文本查找的需要 grep:根据模式搜索文本,并将符合模式的文本行显示出来。 pattern:文本符和正则表达式的元字符组合而成的匹配条件 grep [option] "pattern" file grep root /etc/passwd -i:忽略大小写 --color:匹配的字符高亮显示 alias alias grep='grep --color' -v:反向查找 -o:只显示被模式匹配的字符串(不显示行
若与
2018/04/25
1.4K0
awk(报告生成器),grep(文本过滤器),sed(流编辑器)使用入门
Linux下find、awk、sed、grep命令的例子
Global Regular Expression Print(全局正则表达式打印)
wuweixiang
2019/04/09
1.9K0
【Linux】三剑客 grep、awk、sed 常见用法
grep、awk、sed 都是 Linux 命令行工具,通常用于处理文本数据,俗称“Linux 三剑客“。
行者Sun
2024/09/02
8450
【Linux】三剑客 grep、awk、sed 常见用法
【Linux系列】三剑客awk,sed,grep
grep(global regular expression print,全局正则表达式输出)是一个搜索工具。
用户9913368
2022/08/13
1.2K0
Linux awk 命令
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
狼啸风云
2019/11/03
4.3K0
常用 linux 命令集锦
文章涉及到vim\grep\cat\more\less\echo\sed\awk的入门用法。
一个会写诗的程序员
2022/01/07
4.6K0
Linux下文本处理“三剑客”
grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行,grep和sed的区别在于,grep是以行为单位,进行字符串的对比,sed则可以进行删除、替换等更多的功能
网络安全自修室
2020/09/15
1.1K0
推荐阅读
相关推荐
从零开始的异世界生信学习 linux部分 linux 基础---学习笔记-3 Linux三剑客 grep,sed,awk
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档