RT

您所在的位置:网站首页 监控控制台控制使用方法 RT

RT

2024-07-12 07:50| 来源: 网络整理| 查看: 265

目录 一、 前言源码链接 二、FinSH控制台使用方法第一步:配置FinSH第二步:烧录程序并把串口连接到PC端第三步:打开xshell或者串口助手第四步:测试FinSH命令 三、自定义FinSH命令自定义msh命令自定义C-Style 命令和变量自定义命令重命名 四、项目实战五、结束语

一、 前言

本来我是打算先讲完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 ); 自定义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 #include #include #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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3