开发人员与嵌入式系统的交互工具和命令在嵌入式系统的开发中是至关重要的。这些工具和命令允许开发人员配置、调试、测试和监控嵌入式系统。以下是一些常用的工具和命令:
(1)串口终端工具:通过串口连接嵌入式系统后,开发人员可以利用串口终端工具(如PuTTY、Tera Term、Minicom等)执行命令、查看输出,并与嵌入式系统进行交互。通常,串口终端工具需要配置串口的波特率、数据位、校验位和停止位等。
(2)SSH(Secure Shell):如果嵌入式系统支持SSH,开发人员就可以通过SSH连接到嵌入式系统,进行安全的远程终端会话。SSH通常需要使用户名和密码或通过SSH密钥进行身份验证。
(3)Telnet:Telnet是一种网络协议,允许开发人员通过网络连接到嵌入式系统。Telnet类似于SSH,但不提供加密功能。
(4)命令行界面(CLI):嵌入式系统通常会提供一个命令行界面,允许开发人员执行系统命令、配置参数和查看状态信息。通过命令行界面可进行文件操作、网络配置、进程管理等。
(5)GDB(GNU Debugger):GDB是一种功能强大的调试器,可用于调试嵌入式应用程序。通过GDB,开发人员可以设置断点、单步执行代码、检查变量值和调试嵌入式系统。
(6)JTAG和SWD:是用于硬件调试的接口。开发人员可以使用JTAG或SWD连接到嵌入式处理器的调试接口,从而进行硬件调试、故障排除。
(7)FinSH控制台(Friendly Interactive Shell)控制台:是一个轻量级的嵌入式系统命令行Shell,通常用于嵌入式系统开发。FinSH控制台允许开发人员与嵌入式系统进行交互,如运行命令、查看系统状态、进行调试等操作,以便轻松地开发和调试嵌入式系统。
本节的要求如下:
➲ 了解自定义FinSH控制台命令的基本原理。
➲ 掌握由RT-Thread Studio的基础工程拓展其他工程的方法。
➲ 掌握RT-Thread和自定义FinSH控制台命令的应用。
1.5.1.1 FinSH控制台简介
FinSH控制台是RT-Thread的命令行组件,提供了一套供用户在命令行中调用的操作接口,主要用于调试或查看系统信息。FinSH控制台可以使用串口、以太网、USB等与PC进行通信。FinSH控制台与PC的连接如图1.59所示。
图1.59 FinSH控制台与PC的连接
用户在控制终端(如PC)输入命令,控制终端通过串口、USB、网络等方式将命令传给设备里的FinSH控制台,FinSH控制台会读取设备输入命令,解析并自动扫描内部函数表,寻找对应函数名,执行函数后输出响应,响应通过原路返回,将结果显示在控制终端上。
FinSH控制台支持自动补全、查看历史命令等功能,通过键盘上的按键可以很方便地使用这些功能,FinSH控制台支持的按键功能如表1.6所示。
表1.6 FinSH控制台支持的按键功能
1.5.1.2 FinSH控制台的内置命令
RT-Thread默认地内置了一些FinSH控制台命令,在FinSH控制台中输入help后按下Enter键或者Tab键,就可以显示当前系统支持的所有命令。常用的FinSH控制台内置命令如表1.7所示。
表1.7 常用的FinSH控制台内置命令
1.5.1.3 FinSH控制台的功能配置和自定义FinSH控制台命令
1)FinSH控制台的功能配置
FinSH控制台的功能可以裁减,宏配置选项是在rtconfig.h文件中进行的,具体配置项如表1.8所示。在实际的开发中,用户可以根据需求进行配置。
表1.8 FinSH控制台的功能配置项
2)自定义FinSH控制台命令
除了FinSH控制台内置的命令,FinSH控制台还提供了多个宏接口来导出自定义命令,导出的命令可以直接在FinSH控制台中执行。RT-Thread同时支持自定义MSH命令和自定义C-Style命令,自定义MSH命令的使用更加广泛,如果没有特殊说明,本书中所说的自定义FinSH控制台命令都是MSH命令。
自定义的FinSH控制台命令可以在MSH模式下运行,将一个命令导出到MSH模式可以使用如下宏接口如下:
宏接口MSH_CMD_EXPORT()既可以导出有参数的命令,也可以导出无参数的命令。在导出无参数命令时,宏接口MSH_CMD_EXPORT()的入参为void。示例如下:
在导出有参数的命令时,宏接口MSH_CMD_EXPORT()的入参为int argc和char**argv。argc表示参数的个数,argv表示指向命令行参数字符串指针的数组指针。示例如下:
1.5.2.1 硬件设计
要实现自定义FinSH控制台命令,首先要了解如何定义FinSH控制台命令并将其添加到命令列表中;其次要让命令效果更加明显。本节使用FinSH控制台来控制LED,将对LED的控制转化为对GPIO的控制,即控制GPIO输出高电平和低电平,如图1.60所示,从而将自定义的FinSH控制台命令和LED的控制结合起来实现联动控制。
图1.60 将对LED的控制转化为对GPIO的控制
ZI-ARMEmbed和LED连接如图1.61所示,图中LED的一端连接3.3 V的电源,另一端通过电阻连接ZI-ARMEmbed中的STM32F407。当PE0、PE1、PE2和PE3为高电平时,LED两端电压相同,无法形成压降,LED熄灭。反之当PE0、PE1、PE2和PE3为低电平时,LED的两端形成压降,LED点亮。
图1.61 ZI-ARMEmbed和LED的连接
1.5.2.2 软件设计
软件设计流程如图1.62所示。
(1)在main线程中进行LED引脚的初始化,配置相关GPIO引脚的模式和初始电平。
(2)编写自定义FinSH控制台命令函数,当输入的FinSH控制台命令是“ledCtrl on”时点亮4个LED,当输入的FinSH控制台命令是“ledCtrl off”时熄灭4个LED。
图1.62 软件设计流程
1.5.2.3 功能设计与核心代码设计
通过原理学习可知,要实现自定义FinSH控制台命令,就需要使用RT-Thread提供的接口将自定义的FinSH控制台命令添加到命令列表中,这样在启动FinSH控制台之后就可以使用自定义的FinSH控制台命令了。
1)主函数(zonesion/app/main.c)
主函数的主要工作是调用led_pin_init()函数,完成引导工作。代码如下:
2)自定义FinSH控制台命令函数(zonesion/app/finsh_ex.c)
自定义FinSH控制台命令函数实现LED的开关控制,代码如下:
1.5.3.1 硬件部署
同1.2.3.1节。
1.5.3.2 创建工程
(1)本节在03-init工程的基础上增加了控制LED的FinSH控制台命令代码。增加的代码如下:
(2)导入04-FinSH控制台工程。
(3)双击“04-FinSH”→“RT-Thread Settings”,可弹出“RT-Thread Settings”窗口,如图1.63所示。本节使用GPIO来控制LED,所以需要打开PIN设备,在工程中该设备已经默认打开(在实际中彩色图标表示已打开),所以这里不需要进行任何设置。
(4)添加LED驱动头文件路径。右键单击工程名“04-FinSH”,在弹出的右键菜单中选择“属性”可弹出“04-FinSH的属性”对话框,在该对话框中选择“C/C++构建”→“设置”,可以看到使用的C的交叉编译器为GNU ARM Cross C Compiler,在includes中添加LED驱动头文件的路径“"${workspace_loc:/${ProjName}/zonesion/common/DRV/drv_led}"”,如图1.64所示。
图1.63 “RT-Thread Settings”窗口
图1.64 添加LED驱动头文件路径
至此就完成了工程的修改。
1.5.3.3 项目调试与验证效果
(1)运行RT-Thread Studio,选择菜单“文件”→“导入”,在弹出的“导入”对话框中选择“RT-Thread Studio项目到工作空间中”,单击“下一步”按钮,在“导入项目”视图中将“选择根目录”设置为“RT-ThreadStudio\workspace\05-FinSH”,在“项目”下会显示所有的工程,勾选“04-FinSH”后单击“完成”按钮。
(2)关闭RT-Thread Studio,拔掉仿真器,按下ZI-ARMEmbed上的电源按键重新上电。
(3)在MobaXterm串口终端FinSH控制台中输入“ledCtrl on”命令,FinSH控制台输出“LED ON!”信息,并同时点亮4个LED(见图1.65)。
(4)在MobaXterm串口终端FinSH控制台中输入“ledCtrl off”命令,FinSH控制台输出“LED OFF”信息,并同时熄灭4个LED(见图1.66)。
图1.65 同时点亮4个LED
图1.66 同时熄灭4个LED
本节介绍了FinSH控制台的应用,以及从RT-Thread Studio基础工程拓展其他工程的方法。通过本节的学习,读者可结合自定义FinSH控制台命令和RT-Thread进行简单的应用开发。