RT-Thread零基础快速入门第7讲——FinSH控制台「建议收藏」

RT-Thread零基础快速入门第7讲——FinSH控制台「建议收藏」目录一、前言源码链接二、FinSH控制台使用方法第一步:配置FinSH第二步:烧录程序并把串口连接到PC端第三步:打开xshell或者串口助手第四步:测试FinSH命令三、自定义FinSH命令自定义msh命令自定义C-Style命令和变量自定义命令重命名四、项目实战五、结束语一、前言本来我是打算先讲完RT-thread的内核,再讲设备和组件,但是考虑到后面很多地方都会用到FinSH控制台…

大家好,又见面了,我是你们的朋友全栈君。

一、 前言

本来我是打算先讲完RT-thread的内核,再讲设备和组件,但是考虑到后面很多地方都会用到FinSH控制台,所以我就先把这个讲了,这样大家在后面的学习就不会有很多疑问了。
FinSH 是 RT-Thread 的命令行组件(shell),它提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息,可以使用串口 / 以太网 / USB 等方式与 PC 机进行通信。一般我们默认用串口1和PC机通讯,通过串口我们可以查看单片机运行的情况,也可以通过发送命令控制单片机执行某些操作。关于FinSH更多详细的内容,大家可以在官网上面查看。
FinSH控制台组件介绍:https://www.rt-thread.org/document/site/programming-manual/finsh/finsh/#

源码链接

我发布的所有关于RT-thread的教程源代码都在下面这个链接里面,随着我教程的更新,新的代码也会加入进去。
教程源码下载链接:https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取码:7nsx

二、FinSH控制台使用方法

第一步:配置FinSH

在一个项目工程中打开env,输入menuconfig,选中finsh shell选项即可,一般默认都是打开的。
如果你不知道menuconfig怎么使用,可以在下面这个链接查看。
Menuconfig使用方法:https://www.rt-thread.org/document/site/programming-manual/env/env/#bsp-menuconfig
在这里插入图片描述使能串口1,这个如果没有修改过的话,也是默认打开的
在这里插入图片描述

第二步:烧录程序并把串口连接到PC端

单片机把配置好的工程下载到板子上,并通过usb转串口把单片机的串口1连接到电脑上。

第三步:打开xshell或者串口助手

在这里插入图片描述

第四步:测试FinSH命令

复位一下单片机就可以看到上电时串口打印的版本信息
在这里插入图片描述
FinSH控制台的基本操作和Linux是一样的
在这里插入图片描述
我们可以先输入tab键查看当前系统支持的命令。如下图所示,左边是命令名称,右边是关于命令的描述,如下图所示。
在这里插入图片描述
我们输入命令之后按下回车键就可以执行命令了,例如我输入list_thread命令,会返回了所有线程的信息,如下图所示,led0和led1是我自己创建的线程,另外几个则是系统的线程。
在这里插入图片描述
这些命令的作用我就不一一描述了,大家可以在官网上面查看。
FinSH内置命令详解:https://www.rt-thread.org/document/site/programming-manual/finsh/finsh/#finsh_2

三、自定义FinSH命令

自定义FinSH命令是这一讲我重点要讲的内容,在项目的实际应用中,为了方便调试,我们经常会自定义FinSH命令。
Rt-thread支持三种自定义模式

自定义msh命令

这是传统的命令行模式,也是最常用的一种。
在这里插入图片描述
该命令可以导出有参数的命令,也可以导出无参数的命令。导出无参数命令时,函数的入参为 void,示例如下:

void hello(void)
{ 
   
    rt_kprintf("hello RT-Thread!\n");
}
MSH_CMD_EXPORT(hello , say hello to RT-Thread);//hello是命令名称,say hello to RT-Thread是命令描述

导出有参数的命令时,函数的入参为 int argc 和 char**argv。argc 表示参数的个数,argv 表示命令行参数字符串指针数组指针。导出有参数命令示例如下:

static void atcmd(int argc, char**argv)
{ 
   
    ……
}
MSH_CMD_EXPORT(atcmd, atcmd sample: atcmd <server|client>);

自定义C-Style 命令和变量

自定义C-Style命令能够解析执行大部分 C 语言的表达式,并使用类似 C 语言的函数调用方式访问系统中的函数及全局变量,此外它也能够通过命令行方式创建变量,不过我个人基本没怎么用这种方式,最常用的还是msh命令。
在这里插入图片描述
以下示例定义了一个 hello 函数,并将它导出成 C-Style 模式下的命令

void hello(void)
{ 
   
    rt_kprintf("hello RT-Thread!\n");
}
FINSH_FUNCTION_EXPORT(hello , say hello to RT-Thread);

以下示例定义了一个 dummy 变量,并将它导出成 C-Style 模式下的变量命令:

static int dummy = 0;
FINSH_VAR_EXPORT(dummy, finsh_type_int, dummy variable for finsh)

自定义命令重命名

FinSH 的函数名字长度是有限制的,默认是 16 字节。因此当一个函数名长度超过了上限,只有函数名前16个字节会保留下来,所以如果输入了全部命令执行的时候就会出错。这时就可以使用自定义命令重命名来对导出的命令进行重命名了。
在这里插入图片描述
在重命名的命令名字前加 _cmd 就可以将命令导出到 msh 模式,否则,命令会被导出到 C-Style 模式。以下示例定义了一个 hello 函数,并将它重命名为 ho 后导出成 C-Style 模式下的命令。

void hello(void)
{ 
   
    rt_kprintf("hello RT-Thread!\n");
}
FINSH_FUNCTION_EXPORT_ALIAS(hello , ho, say hello to RT-Thread);

四、项目实战

我这里创建了两个自定义msh命令,一个是带参数的一个是不带参数的。

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define LED0_PIN GET_PIN(F, 9)
#define LED1_PIN GET_PIN(F, 10)

#define THREAD_PRIORITY 25 //线程优先级
#define THREAD_TIMESLICE 5 //线程时间片

/* 静态线程参数定义 */
ALIGN(RT_ALIGN_SIZE)
static char led1_stack[1024];  //线程栈内存空间
static struct rt_thread led1;  //线程句柄

int main(void)
{ 
   
    int i = 0;

    while (1)
    { 
   
        rt_thread_mdelay(200);
    }
}

/* led0函数 */
void led0_init(void)
{ 
   
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
    while(1)
    { 
   
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_kprintf("LED0_ON \n");
        rt_thread_mdelay(1000);
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_kprintf("LED0_OFF \n");
        rt_thread_mdelay(1000);
    }
}
MSH_CMD_EXPORT(led0_init, led0 init);

/* msh命令测试函数: argc是输入变量的个数,argv是输入变量的内容 */
void msh_test(int argc, char**argv)
{ 
   
    /* 检查输入的变量是否有两个 */
    if (argc < 2)
    { 
   
        rt_kprintf("Please input'msh_test <a|b>'\n");
        return;
    }
    if (!rt_strcmp(argv[1], "a"))
    { 
   /* 输入的是a */
        rt_kprintf("Hello world ! \n");
    }
    else if (!rt_strcmp(argv[1], "b"))
    { 
   /* 输入的是b */
        rt_kprintf("Hello RT-thread ! \n");
    }
    else
    { 
   /* 输入的是其他内容 */
        rt_kprintf("Please input'msh_test <a|b>'\n");
    }
}
MSH_CMD_EXPORT(msh_test, msh test sample : msh_test a|b);

运行的结果如下图所示:
执行“led0_init”指令之后,led灯就跑起来了。
在这里插入图片描述
这是带参数的指令,输入的时候除了指令的输入还需要再输入一个参数,输入不同的参数会有不同的效果,具体要执行什么操作可以在函数里面自己去定义。
在这里插入图片描述
到这里可能有些同学就会问了,如果我不想用命令导出那要怎么做?这就需要用到自动初始化了,比如INIT_APP_EXPORT()函数,用了自动初始化函数之后就不需要手动输入命令去调用了,关于自动初始化的更多内容我后面会单独写一篇博客。

五、结束语

好了,关于FinSH控制台的编程讲解就到这里,如果还有什么问题可以私信给我。如果需要本文对应的源码的话可以在博文前言部分的链接下载。
如果觉得这篇文章对你有用,点赞+关注支持一下博主呗。
后续我会继续更新RT-thread入门教程系列,如果感兴趣的同学可以关注一下博主,谢谢!

RT-thread相关教程汇总:https://blog.csdn.net/ShenZhen_zixian/article/details/120563891

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143437.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 异步FIFO_Verilog实现「建议收藏」

    异步FIFO_Verilog实现「建议收藏」异步FIFO_Verilog实现概述:FIFO本质上还是RAM,是一种先进先出的数据缓存器(先存入的数据先取出)。它与普通存储器的区别:没有外部读写地址线,只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1,不像其他存储器可以由地址线决定读取或写入某个指定的地址,异步FIFO读写时钟不同,读写是相互独立的。用途:(1)跨时钟域多bit传输:读写可以由不同的时钟控制,使用异步FIFO可以在两个不同时钟系统之间快速方便的传输数据。(2)数据匹配:对于不同宽度的数据接口可以使用FIFO,

  • spring容器初始化过程总结_java构造方法初始化

    spring容器初始化过程总结_java构造方法初始化前言我们知道,spring的启动其实就是容器的启动,而一般情况下,容器指的其实就是上下文ApplicationContext。AbstractApplicationContext作为整个A

  • 【OpenCV入门教程之九】 非线性滤波专场:中值滤波、双边滤波[通俗易懂]

    正如我们上一篇文章中讲到的,线性滤波可以实现很多种不同的图像变换。然而非线性滤波,如中值滤波器和双边滤波器,有时可以达到更好的实现效果。邻域算子的其他一些例子还有对二值图像进行操作的形态学算子,用于计算距离变换和寻找连通量的半全局算子。先上一张截图:一、理论与概念讲解——从现象到本质1.1非线性滤波概述之前的那篇文章里,我们所考虑的滤波器都是线性的,即两个信号之和的响应和他们各自响应之和相等。换句话说,每个像素的输出值是一些输入像素的加权和,线性滤波器易于构造,并且易于从频率响应角度来进行分

  • 数据库主键和外键的作用_数据库外键约束的作用

    数据库主键和外键的作用_数据库外键约束的作用主键保证了数据的唯一性,外键保证了数据的完整性。主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。…

    2022年10月24日
  • Linux从入门到指令详解

    Linux从入门到指令详解一、概述我们为什么要学习Linuxlinux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样,想想而已基本不可能,因为用户已经习惯于使用微信交流,不是说技术上实现不了解而是老百姓已经习惯了,想让他们不用,即使他们自己不用亲戚朋友还是要用,没有办法的事情。用习惯了windows操作系统,再让大家切换到别的操作系统基本上是不可能的事情,改变一个人已经养成的习惯太难。没有办法深入到普通老百姓的生

  • 2021年G3锅炉水处理模拟试题及G3锅炉水处理模拟考试题库[通俗易懂]

    题库来源:安全生产模拟考试一点通公众号小程序安全生产模拟考试一点通:N1叉车司机实操考试视频参考答案及N1叉车司机考试试题解析是安全生产模拟考试一点通题库老师及N1叉车司机操作证已考过的学员汇总,相对有效帮助N1叉车司机操作证考试学员顺利通过考试。1、【多选题】《特种设备使用管理规则》规定,特种设备安全管理制度中,包括特种设备采购、安装、()等制度。(ACD)A、改造B、销售C、修理D、报废2、【多选题】叉车工作中要保持三个距离:()。(ABC)A、叉车与…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号