完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
开发环境: MDK:Keil 5.30 开发板:N32G4FRML-STB 开发板 MCU:N32G4FRMEL7 RT-Thread版本:3.1.5 1 FinSH简介FinSH是RT-Thread的命令行外壳(shell),提供一套供用户在命令行的操作接口,主要用于调试、查看系统信息。在大部分嵌入式系统中,一般开发调试都使用硬件调试器和printf日志打印,在有些情况下,这两种方式并不是那么好用。比如对于RT-Thread这个多线程系统,我们想知道某个时刻系统中的线程运行状态、手动控制系统状态。如果有一个shell,就可以输入命令,直接相应的函数执行获得需要的信息,或者控制程序的行为。这无疑会十分方便。硬件拓扑结构如下图所示: 用户在控制终端输入命令,控制终端通过串口、USB、网络等方式将命令传给设备里的 FinSH,FinSH 会读取设备输入命令,解析并自动扫描内部函数表,寻找对应函数名,执行函数后输出回应,回应通过原路返回,将结果显示在控制终端上。 当使用串口连接设备与控制终端时,FinSH 命令的执行流程,如下图所示: FinSH 支持权限验证功能,系统在启动后会进行权限验证,只有权限验证通过,才会开启 FinSH 功能,提升系统输入的安全性。 FinSH 支持自动补全、查看历史命令等功能,通过键盘上的按键可以很方便的使用这些功能,FinSH 支持的按键如下表所示:
FinSH支持两种模式,分别是传统命令行模式和 C 语言解释器模式: 1. C语言解释器模式, 为行文方便称之为c-style; C 语言解释器模式下,FinSH 能够解析执行大部分 C 语言的表达式,并使用类似 C 语言的函数调用方式访问系统中的函数及全局变量,此外它也能够通过命令行方式创建变量。在该模式下,输入的命令必须类似 C 语言中的函数调用方式,即必须携带 () 符号,例如,要输出系统当前所有线程及其状态,在 FinSH 中输入 list_thread() 即可打印出需要的信息。FinSH 命令的输出为此函数的返回值。对于一些不存在返回值的函数(void 返回值),这个打印输出没有意义。 2. 传统命令行模式,此模式又称为msh(module shell)。C语言表达式解释模式下, finsh能够解析执行大部分C语言的表达式,并使用类似C语言的函数调用方式访问系统中的函数及全局变量,此外它也能够通过命令行方式创建变量。在msh模式下,finsh运行方式类似于dos/bash等传统shell。例如,可以通过 cd / 命令将目录切换至根目录。msh 通过解析,将输入字符分解成以空格区分开的命令和参数。其命令执行格式如下所示: command [arg1] [arg2] [...] 其中 command 既可以是 RT-Thread 内置的命令,也可以是可执行的文件。 最初 FinSH 仅支持 C-Style 模式,后来随着 RT-Thread 的不断发展,C-Style 模式在运行脚本或者程序时不太方便,而使用传统的 shell 方式则比较方便。另外,C-Style 模式下,FinSH 占用体积比较大。出于这些考虑,在 RT-Thread 中增加了 msh 模式,msh 模式体积小,使用方便,推荐大家使用 msh 模式。 如果在 RT-Thread 中同时使能了这两种模式,那它们可以动态切换,在 msh 模式下输入 exit 后回车,即可切换到 C-Style 模式。在 C-Style 模式输入 msh() 后回车,即可进入 msh 模式。两种模式的命令不通用,msh 命令无法在 C-Style 模式下使用,反之同理。 FinSH的移植分为两个部分:第一部分是实现 UART 控制台,该部分只需要实现两个函数即可完成 UART 控制台打印功能。第二部分是实现移植 FinSH 组件,实现在控制台输入命令调试系统,该部分实现基于第一部分,只需要添加 FinSH 组件源码并再对接一个系统函数即可实现。下面将对这两部分进行说明。 2 在 Nano 上添加 UART 控制台在 RT-Thread Nano 上添加 UART 控制台打印功能后,就可以在代码中使用 RT-Thread 提供的打印函数 rt_kprintf() 进行信息打印,从而获取自定义的打印信息,方便定位代码 bug 或者获取系统当前运行状态等。实现控制台打印,需要完成基本的硬件初始化,以及对接一个系统输出字符的函数。 2.1 串口初始化使用串口对接控制台的打印,首先需要初始化串口,如引脚、波特率等。需要在 board.c 中的 rt_hw_board_init() 函数中调用串口初始化。 2.2 实现 rt_hw_console_output实现 finsh 组件输出一个字符,即在该函数中实现 uart 输出字符: /*输出一个字符,系统函数,函数名不可更改 */ void rt_hw_console_output(const char *str); 示例代码:如下是基于N32G4FRMEL7的串口驱动对接的 rt_hw_console_output() 函数,实现控制台字符输出,示例仅做参考。 以上代码很简单,就是将裸机的字符输出的内容使用rt_hw_console_output()函数实现,笔者使用的是串口1作为调试串口。 注意:RT-Thread 系统中已有的打印均以 \n 结尾,而并非 \r\n,所以在字符输出时,需要在输出 \n 之前输出 \r,完成回车与换行,否则系统打印出来的信息将只有换行。 上面实现了rt_hw_console_output()函数,也就实现了rt_kprintf()函数,在kservice.c中调用了rt_hw_console_output()函数。 以下代码就是在调用rt_hw_console_output()。 RT_CONSOLEBUF_SIZE定义缓冲区的最大长度为,默认配置的大小为128。 2.3 结果验证在应用代码中编写含有 rt_kprintf() 打印的代码,编译下载,打开串口助手进行验证。如下图是一个在 main() 函数中每隔 1 秒进行循环打印 Hello RT-Thread 的示例效果: 3 在 Nano 上添加 FinSH 组件RT-Thread FinSH 是 RT-Thread 的命令行组件(shell),提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信,使用 FinSH 组件基本命令的效果图如下所示。 本文以串口 UART 作为 FinSH 的输入输出端口与 PC 进行通信,描述如何在 Nano 上实现 FinSH shell 功能。 在 RT-Thread Nano 上添加 FinSH 组件,实现 FinSH 功能的步骤主要如下: 1.添加 FinSH 源码到工程。 2.实现函数对接。 3.1 Keil添加 FinSH 源码工程把 FinSH 组件的源码到工程。 另外还需要配置Finsh的头文件路径。 3.2 实现 rt_hw_console_getchar要实现 FinSH 组件功能:既可以打印也能输入命令进行调试,控制台已经实现了打印功能,现在还需要在 board.c 中对接控制台输入函数,实现字符输入:
rt_hw_console_getchar():控制台获取一个字符,即在该函数中实现 uart 获取字符,可以使用查询方式获取(注意不要死等,在未获取到字符时,需要让出 CPU),也可以使用中断方式获取。 3.2.1查询方式如下是基于N32G4FRMEL7的串口驱动对接的 rt_hw_console_getchar(),完成对接 FinSH 组件,其中获取字符采用查询方式,示例仅做参考。
3.2.2 中断方式如下是基于 N32G4FRMEL7串口驱动,实现控制台输出与 FinSH Shell,其中获取字符采用中断方式。原理是,在 uart 接收到数据时产生中断,在中断中把数据存入 ringbuffer 缓冲区,然后释放信号量,tshell 线程接收信号量,然后读取存在 ringbuffer 中的数据。
【注】需要确认 rtconfig.h 中已使能 RT_USING_CONSOLE 宏定义 移植完成后,将程序下载到板子中,打开串口助手,在发送去输入字符,点击发送即可进行交互。注意一定要有换行符。 这里推荐使用xshell等工具,用起来就有种Linux终端的感觉。 4 FinSH实例前文移植了FinSH,接下来我门通过一个实例来讲解如果使用自定义 msh 命令。本节我们来读取芯片闪存容量寄存器和芯片ID,寄存器地址描述如下:
产品唯一的身份标识应用如下: ● 用来作为序列号(例如USB字符序列号或者其他的终端应用) ● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。 ● 用来激活带安全机制的自举过程 96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。 这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)。 实现读取芯片闪存容量寄存器和芯片ID很简单,代码如下:
这里需要关注宏定义MSH_CMD_EXPORT,我们在Finsh命令行中就可调用我们自定义的命令,如下所示: 从结果可以看出闪存存储器容量是512K,芯片唯一序列号是:39FFDF054E42323210611451,以上结果是完全符合预期的。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
411个成员聚集在这个小组
加入小组晒晒我的奖品 国民威廉希尔官方网站 N32L436_EVB开发板
2285 浏览 0 评论
【国民威廉希尔官方网站 N32项目移植】lorawan移植--接入腾讯云
2269 浏览 0 评论
【国民威廉希尔官方网站 N32项目移植】半小时移植完成SPI1驱动代码&使用W5500模块进行UDP通信,十分甚至九分好用
2871 浏览 0 评论
【国民威廉希尔官方网站 N32项目移植】基于N32G4FR和小度音响的智能家庭中枢控制系统
2705 浏览 0 评论
【国民威廉希尔官方网站 N32项目移植】基于freeRTOS的CAN通信
2955 浏览 0 评论
2213浏览 2评论
【国民威廉希尔官方网站 N32项目移植】easypower 结论
1693浏览 1评论
【国民威廉希尔官方网站 N32项目移植】自行车码表项目 4.项目提交
1378浏览 1评论
【国民威廉希尔官方网站 N32项目移植】N32G457项目移植之RT-Thread OLED
846浏览 1评论
【国民威廉希尔官方网站 N32项目移植】N32G457项目移植之RT-Thread SPI_TFT_LCD ST7735
1809浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-22 14:59 , Processed in 0.316252 second(s), Total 34, Slave 29 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号