嵌入式SHELL组件

本文最后更新于:17 天前

嵌入式交互SHELL实现

模块简介

需求分析

  • 嵌入式产品中一般都会有一个通过串口或者USB等通讯方式实现的与开发人员或者测试人员交互的模块,每个产品可能的实现的方式不一样,本模块的目标是实现一个方便移植的通用性SHELL模块。
  • 功能性需求:
    1. 实现可以在项目的任何地方都可以注册命令
    2. 实现用户输入命令或者带参命令可以调用相关回调函数以及对参数的解析
    3. 实现对用户输入的十进制、十六进制数字进行解析取值
    4. 实现基本鉴权功能
  • 非功能性需求:
    1. 可以方便移植
    2. 无需太多学习成本即可上手使用
    3. 源代码实现简洁易读,如果不满足极端场景下使用可以交给用户选择配置

架构设计

设计目标

  1. 可移植性高
  2. 可读性高
  3. 可使用性高

设计原理

  • 结合需求里面的“可以在项目的任意地方注册shell命令”,命令采用双向链表实现。

    链表的具体实现细节参考文章链表

  • 单个shell节点需要做出抽象,shell需要挂在链表上则需要包含节点元素;shell需包含命令字符串和需要执行的函数指针。
  • 命令包含参数,待传参数个数不确定的情况下,则命令执行的回调函数的形参应该是(const uint8_t argc,const char *argv[]),与main函数形参类型一致。
  • 包含鉴权功能,进入shell之前必须先输入密钥校验正确,才能正确使用shell功能。
  • 命令格式为 “cmd param1 param2 param3 param4 …”,cmd是命令,后面的param为参数。遍历查找字符串时只对比cmd,后面的参数在命令的事件处理内部处理。
  • 接收到串口数据包首先要对串口数据包进行分解,分解为命令带参的格式,然后再将分出来的命令进行比对查找。
  • 单条命令以”\r”或者”\n”结尾标识
  • 命令解析流程
1
2
3
4
5
6
7
typedef uint8_t(*Shell_function)(const uint8_t argc,const char *argv[]);
typedef struct _SHELLNODE
{
Node node; //挂在链表上的节点
const char *name; //命令字符串
Shell_function handleFunc; //命令回调函数
} ShellNode;

落地实践


嵌入式SHELL组件
https://hudaxia.top/2021/10/02/组件-交互shell实现/
作者
胡大侠
发布于
2021年10月2日
更新于
2023年3月10日
许可协议