STM32 Nr shell 命令行移植

本文介绍了一种在STM32平台上移植nr_micro_shell命令行工具的方法。通过对NR和Finsh两种工具的资源占用对比,选择了NR进行移植。文章详细记录了从下载源码、配置STM32CubeMX、修改串口映射到实现基本交互功能的全过程。

一、前言

工作中的开发环境都是基于linux命令行交互,作为命令行的重度使用者,玩单片机也要使用命令行工具,百度了一些命令行工具,有几个不错的开源 cmd 交互工具,主要看了 finsh 和 nr_micro_shell 两个开源项目。Finsh 功能上限较多,但资源占用比较高,nr 有基本功能,且占用 MCU 资源较少,Github 给出的对比列表如下:

Nr Finsh 编译资源对比:

原始工程

添加nr_micro_shell增加量

添加finsh增加量

ROM

63660

+3832

+26908

RAM

4696

+1104

+1304

综合衡量了一下,移植 nr 作为后续项目的一个命令行交互。本篇文章分享一下小熊派移植 nr shell 的过程~

二、代码下载

上 github 拉代码,开源仓库:

github.com/Nrusher/nr_micro_shell

重点关注源码目录:

三、STM32 CubeMX 工程

配置 STM32L431 UART 外设中断数据收发,开启 FreeRTOS,生成 Makefile 工程

Makefile 工程生成后,移植 nr shell 下面 源码

添加 makefile ,将添加的文件加入编译:

移植之后在顶层 make 编译代码

make -j16

四、代码修改

修改 STM32 CubeMX 的串口重映射,重映射到 printf,在 main 中加入如下代码:

将映射的输出代码关联到 nr shell 打印函数

以上输出解决了,下面解决输入问题,创建一个信号量用于同步接受状态,同时开启空闲中断接收:

中断回调函数,释放信号,同时开启下次中断接收:

Nr shell 的基本收发交互功能就完成了,可以进行愉快的交互了

五、移植现象

处理效率马马虎虎,一条简单指令 10 ms,有空优化优化

 

nr_micro_shell 是一个专为资源受限的 MCU(单片机)设计的轻量级命令行工具,适用于 ROM 和 RAM 资源有限的嵌入式系统。它提供了类似于 Linux shell 的交互体验,包括 Tab 键命令补全、历史命令查询、方向键移动光标等功能。其核心实现文件中包含了命令行交互的主要逻辑,主要函数包括 `shell_init()` 和 `shell()`,分别用于初始化 shell 环境和处理用户输入的命令 [^2]。 ### 功能特点 - **占用资源少**:nr_micro_shell 使用简单,仅需调用两个函数 `shell_init()` 和 `shell()` 即可完成初始化和命令处理 [^2]。 - **交互体验好**:支持多种用户交互功能,如 Tab 键命令补全、历史命令查询、方向键移动光标等,提升了用户的操作体验 [^2]。 - **扩展性好**:用户可以根据需要自定义命令,并通过标准函数原型注册命令函数,从而实现功能的灵活扩展 。 ### 使用方法 1. **环境准备**: - 在使用 nr_micro_shell 之前,需进行必要的环境配置。这包括修改配置文件 `nr_micro_shell_config.h`,例如屏蔽 RT-Thread 相关的头文件引用,并定义适合当前平台的输出接口 `shell_printf` [^4]。 2. **初始化**: - 在程序中调用 `shell_init()` 函数以完成 nr_micro_shell 的初始化工作 [^1]。 3. **处理输入**: - 在主循环或任务中周期性地获取用户输入,并将输入字符传递给 `shell()` 函数进行处理。例如,可以通过 J-Link RTT 获取输入,具体实现如下 [^4]: ```c int key = SEGGER_RTT_GetKey(); if (key >= 0) { shell((char)key); } ``` 4. **扩展命令**: - 用户可以通过定义新的命令函数并将其注册到系统中,来实现功能扩展。例如,在 `nr_micro_shell_command.c` 中添加清屏命令的实现 [^3]: ```c void shell_clear_cmd(char argc, char *argv) { shell_printf("\x1b[2J\x1b[H"); } ``` ### 常见问题与解决方案 - **问题1:如何在非 RT-Thread 环境下使用 nr_micro_shell?** - 解决方案:需要修改配置文件 `nr_micro_shell_config.h`,移除 RT-Thread 相关的头文件引用,并根据当前平台定义合适的输出接口 `shell_printf` [^4]。 - **问题2:如何实现清屏命令?** - 解决方案:可以在 `nr_micro_shell_command.c` 文件中添加一个清屏命令的实现函数 `shell_clear_cmd()`,并通过 ANSI 转义序列 `\x1b[2J\x1b[H` 实现清屏功能 [^3]。 - **问题3:如何获取用户输入?** - 解决方案:可以通过多种方式获取用户输入,如使用 J-Link RTT、串口通信等。在获取到输入字符后,将其传递给 `shell()` 函数进行处理 。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Top嵌入式

投喂个鸡腿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值