Funpack5-1 - 用NXP FRDM-MCXA346 开发板实现一个带缓冲区的shell
该项目使用了NXP FRDM-MCXA346 开发板,实现了一个带缓冲区的shell的设计,它的主要功能为:实现一个能读取、解析并执行用户输入命令的简易命令行解释器,并管理好输入缓冲区。
标签
Funpack活动
开发板
estelle
更新2026-03-04
11

项目介绍

本示例在 MCXA346 开发板上实现了一个带缓冲区的简易交互式 shell(命令行解释器),能够在串口终端显示提示符 ysh > $,接收并解析用户输入的行命令(以换行结束),并执行 LED 控制相关命令(例如:开/关/翻转/闪烁/亮度脉冲)。该示例用于演示如何在嵌入式 MCU 上实现简单的人机交互与 GPIO 控制。

硬件简介

  • 开发板:MCXA346(示例运行板)
  • 板载 LED:用于演示 GPIO 输出,通常为活动低(active-low)设计
  • 串口(UART-USB 转接):用于与主机终端通信,发送/接收 shell 命令

(说明:此处硬件采用板上现有资源,无外部传感器或外设)

方案框图与设计思路(概要)

image.png

设计思路简介:

  • main() 中初始化板级硬件和调试控制台;
  • 使用一个固定大小的输入缓冲区(例如 128 字节)逐字符读取终端输入;
  • 对可打印字符进行回显,对退格键做删除处理;遇到换行符则将缓冲区作为一条命令并调用解析器;
  • 命令解析器使用空白分隔符拆分 token,根据第一 token 分发到具体处理函数(例如 led 子命令);
  • 对于 LED 控制实现若干操作:直接写 GPIO(on/off)、端口翻转、阻塞式闪烁、以及基于软件 PWM 的短时亮度脉冲。

调试软件与工具

  • 构建工具:CMake + Ninja(示例工程已配置 CMakePresets)
  • 串口终端:vscode串行监视器,波特率与 BOARD 配置一致;
  • IDE/调试:可使用提供的调试器或 SDK 的 runner(本次在示例目录通过 CMake: build 成功构建)。

软件流程图(概要)

image.png

  1. 启动 -> 初始化硬件与串口
  2. 显示欢迎信息与提示(Type 'help' for commands.
  3. 循环:显示提示符 ysh > $;逐字符读取输入并回显;遇换行 -> 提取命令行
  4. 调用 shell_process_command() 解析命令并执行对应操作
  5. 返回循环

关键代码说明

  • 输入读取与缓冲(位于 main()
    • 使用常量 SHELL_BUF_SIZE 分配缓冲区;
    • 使用 GETCHAR() 逐字符读取:处理回车/换行作为命令结束、处理退格(\b 或 127)并在终端回显删除、对可打印字符追加到缓冲区并回显;
  • 命令解析器(shell_process_command()
    • 使用 strtok() 按空白分割获得 token;
    • 支持的命令:helpled onled offled toggleled blink <ms> [n]led brightness <0-100> [ms]
  • LED 控制辅助函数
    • led_set(bool on):写 GPIO 电平;注意多数板载 LED 为活动低,示例中将逻辑反转以保证 led on 点亮 LED;
    • led_blink(ms, times):阻塞式闪烁实现;
    • led_brightness_pulse(percent, duration_ms):基于软件 PWM 的短时脉冲(阻塞),用于演示“亮度”效果。

关键代码片段示例(摘录)

/* 将 LED 设为点亮/熄灭(对活动低 LED 取反写入) */
static void led_set(bool on)
{
GPIO_PinWrite(BOARD_LED_GPIO, BOARD_LED_GPIO_PIN, on ? 0U : 1U);
}

/* 行输入读取(简要) */
while (1) {
int ch = GETCHAR();
if (ch == '\r' || ch == '\n') break; /* 行结束 */
if (ch == '\b' || ch == 127) { /* 退格处理 */ }
if (isprint(ch)) { buf[idx++] = (char)ch; PUTCHAR(ch); }
}

/* 命令分词并执行 */
char *tok = strtok(local, " \t");
if (strcmp(tok, "led") == 0) { /* 处理 led 子命令 */ }

(完整代码位于 gpio_led_output.c

功能展示图及说明(占位)



  • 串口终端显示提示符与 help 输出——说明:应显示欢迎信息与可用命令列表。
  • 执行 led on / led off 前后的 LED 状态照片或视频帧——说明:展示 LED 点亮/熄灭行为。
  • led blink 1000 5led brightness 50/100/10 3000 的效果说明——说明:闪烁时序图与亮度脉冲示意图。


项目中遇到的难题及解决方法

  • 软件安装问题:一开始装软件失败困惑了很久,因为没用IDE,要配置的工具链很长,还好有一个工具自动下载安装,但是windows下的环境安装问题还是困惑了很久,不知道该用IDE还是配置vscode,最后还是选择了配置vscode
  • 例程选择问题:装好软件后看到有一个littlefs_shell_onchip_flash的例程,后面花了半天时间在这个历程上面,但是这个例程只专注于实现shell,忽略了控制灯的功能,于是最后选择了gpio的例程,简单用ai实现了一个shell
  • 阻塞式操作阻塞 shell 响应:当前的 blinkbrightness 为阻塞实现,会阻塞命令行交互;可选方案为引入一个简单的任务/定时器或在后台运行状态机以实现非阻塞行为(作为后续改进)。

心得体会

  • 在资源受限的嵌入式环境中实现一个健壮的交互式 shell,是学习串口协议、输入处理和简单命令解析的好练习;
  • 对于用户体验,要注意细节:回显、退格、提示符和帮助信息都会显著影响交互体验;
  • 硬件差异(如 LED 极性)会导致逻辑判断出错,开发时要注意板级定义与文档;
  • 未来如果将示例扩展成更完整的控制台,建议:将耗时操作移到后台、添加命令历史/编辑、支持脚本/宏以及增加对多个外设的控制命令。
附件下载
led_output.7z
团队介绍
个人+GPT
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号