# fk_shell **Repository Path**: orange_gg/fk_shell ## Basic Information - **Project Name**: fk_shell - **Description**: 单片机shell - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-09 - **Last Updated**: 2025-11-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # fk_shell #### 介绍 fk_shell 是一个为单片机设计的轻量级交互式命令行工具。允许开发者通过串口或其他通信接口与单片机进行实时交互,实现命令调试、参数配置、系统监控等功能,显著提升嵌入式开发的调试效率,使用者可以自定义各种命令函数。 ##### 支持功能: - tab自动补全 - 上/下键回溯历史命令 - 用户自定义命令通过宏定义自动注册 - 命令行最大长度灵活配置 ##### 演示效果如下 ![shell](./img/fk_shell.gif) ![shell](./img/fk_shell_pc.png) coremark 跑分演示 ![shell](./img/fk_shell_coremark.png) #### 资源占用 添加fk_shell前后对比 | 命令 | 空白工程 | 添加 fk_shell 后 | 添加 fk_shell、md5sum | | ------- | ------------ |---------- |---------- | | ROM | 6220 (6.07kB) | 9436 (9.21kB) | 12216 (11.93kB) | | RAM | 1296 (1.27kB) | 1528 (1.49kB) | 1592 (1.55kB) | 配置: - 历史命令 ram 128 字节 - 支持命令:lscmd clear reboot test md5sum - 优化等级 -O1 #### 软件架构 ... #### 使用说明 ##### 移植 1. 源码包含 ```c fk_shell_config.h // 配置文件,用于裁剪和输出函数引用 fk_shell.c/h // 核心文件 fk_shell_lib.c/h // 相关支持库包 fk_shell_cmd_manager.c/h // 提供命令注册支持,提供 lscmd clear 两个命令 ``` 2. fk_shell_config.h文件 ```c #ifndef __FK_SHELL_CONFIG_H__ #define __FK_SHELL_CONFIG_H__ #ifdef __cplusplus extern "C" { #endif #define fk_shell_printf printf // 字符串格式化输出 typedef signed char fk_int8_t; typedef signed short fk_int16_t; typedef signed int fk_int32_t; typedef unsigned char fk_uint8_t; typedef unsigned short fk_uint16_t; typedef unsigned int fk_uint32_t; typedef signed long long fk_int64_t; typedef unsigned long long fk_uint64_t; #include #define fk_memset memset #define fk_memcpy memcpy #define fk_memcmp memcmp #include #define fk_strcmp strcmp #define fk_strcpy strcpy #define fk_strlen strlen #if defined FK_USING_ASSERT #else #define FK_ASSERT(X) (void)0 #endif // MD5 lib 库 #define USING_FK_LIB_MD5 // 历史命令 #define USING_FK_SHELL_HISTORY_LIST #if defined USING_FK_SHELL_HISTORY_LIST #define USING_FK_SHELL_HISTORY_LIST_BUFFER 64 #endif // 设备名称 #define FK_SHELL_DEVICE_NAME "DEMO" // 用户名长度 #define FK_SHELL_NAME_MAX_LENGTH 12 // 命令长度限制 #define FK_SHELL_CURRENT_LINE_CACHE_LENGTH 64 // 启动清屏 - 0-关闭 1-开启 #define FK_SHELL_POWER_ON_CLEAR 0 // 启动信息 #define FK_SHELL_SHOW_STARTUP_INFO // 输入回显启动 #define FK_SHELL_INPUT_ECHO // 彩色字符 #define FK_SHELL_SHOW_COLOR // 换行符选择 #define FK_SHELL_NEW_LINE_FORMAT 2 #if (FK_SHELL_NEW_LINE_FORMAT==0) #define FK_SHELL_NEW_LINE_SYMBOL "\n" #elif (FK_SHELL_NEW_LINE_FORMAT==1) #define FK_SHELL_NEW_LINE_SYMBOL "\r" #elif (FK_SHELL_NEW_LINE_FORMAT==2) #define FK_SHELL_NEW_LINE_SYMBOL "\r\n" #else #define FK_SHELL_NEW_LINE_SYMBOL "\r\n" #endif #ifdef __cplusplus } #endif #endif ``` 2. main.c ```c #include "fk_shell.h" struct fk_shell_struct shell; int main(int argc, char **argv) { fk_shell_init(&shell, "shell"); while(1) { char ch = getchar(); if(ch) fk_shell_get_data( &shell, ch ); } return 0; } ``` ##### 使用 1. 添加命令 添加方式比较简单,如下 fk_shell_cmd_test 是对应的命令函数,通过调用 FK_SHELL_CMD_LIST_EXPORT 宏将函数添加到命令列表,FK_SHELL_CMD_LIST_EXPORT的第一个参数为被索引的命令(本例:test),第二个参数为命令函数(本例:fk_shell_cmd_test)。 ```c int fk_shell_cmd_test(int argc, char **argv) { fk_shell_printf("\r\n"); for (int i = 0; i < argc; i++) { fk_shell_printf("(%2d)[%s]\r\n", i, argv[i]); } return 0; } FK_SHELL_CMD_LIST_EXPORT(test, fk_shell_cmd_test); ``` 经过以上操作后,就可以使用命令 test 调用该函数(参数间使用空格隔开),如下图 ![shell](./img/fk_shell_pc_test.png) 2. 附带的一些命令 | 命令 | 说明 | | ------- | -------- | | lscmd | 列出所有命令 | | clear | 清屏 | | md5sum | md5计算 |