letter shell
开源项目 letter shell 是一个功能强大的嵌入式 shell,作者 NevermindZZT,目前获得 786 个 Star,遵循 MIT 开源协议
letter shell 是一个 C 语言编写的,可以嵌入在程序中的嵌入式 shell,主要面向嵌入式设备,以 C 语言函数为运行单位,可以通过命令行调用,运行程序中的函数
letter shell 3.x 支持的功能:
-
命令自动补全
-
快捷键功能定义
-
命令权限管理
-
用户管理
-
变量支持
-
代理函数和参数代理解析
项目地址:https://github.com/NevermindZZT/letter-shell
环境准备
- 硬件:STM32F1xx
- 开发工具:Cube MX、Cube IDE
- 串口助手:MobaXterm
- 实时操作系统:FreeRTOS
- 项目源码:letter shell 3.1.2
获取项目源码
- 使用 git clone 项目获得源码
- 直接下载项目源码压缩包
- 点进去一样是下载源码压缩包
搭建项目工程
-
本次实验使用的是 STM32F103ZETx,配置外部时钟源
-
配置时钟树
-
配置系统选项
系统时基需要修改为别的源,具体根据自己的条件选择,SysTick 需要留给 FreeRTOS 用作时基
-
配置(usart)串口外设
串口参数根据自己的需求配置,使用FreeRTOS并不需要使用到外部中断,可以不用开启
-
FreeRTOS 配置
激活 FreeRTOS ,选择 V2 版本
在高级设置使能 Newlib
在 FreeRTOS 添加 letter shell 任务,任务栈空间至少 256,任务函数名设为 shellTask,选择生成弱函数,任务参数设为 &shell
-
选择工程保存路径与 Cube IDE 代码开发工具
选择 Cube IDE 作为开发工具,根据需求修改堆栈大小,最后生成工程代码
letter shell 移植
-
需要移植的项目源码
-
Cube IDE 工程新建文件夹,添加头文件路径,把需要移植的源码分别复制到头文件夹和源文件夹里面,先移植 src文件夹的文件,在移植 demo 的文件,提示相同文件时选择覆盖
-
直接编译工程,修改头文件的报错
一般需要修改芯片的头文件 stm32f4xx_hal.h,根据自己使用的芯片选择,还需要删除掉没有的头文件
-
修改 shell_port.c 源文件
包含信号量互斥量头文件:#include “semphr.h”
修改 letter shell 的short userShellWrite(char *data, unsigned short len)
函数short userShellWrite(char *data, unsigned short len) { HAL_UART_Transmit(&huart1, (uint8_t *)data, len, 0x1FF); return len; }
修改 letter shell 的
short userShellRead(char *data, unsigned short len)
函数short userShellRead(char *data, unsigned short len) { if (HAL_UART_Receive(&huart1, (uint8_t *)data, len, 0x1FF) != HAL_OK) { return 0; } else { return 1; } }
修改
void userShellInit(void)
初始化函数,把任务创建的代码注释掉,函数外最尾行可以注释也可以直接删除void userShellInit(void) { shellMutex = xSemaphoreCreateMutex(); shell.write = userShellWrite; shell.read = userShellRead; shell.lock = userShellLock; shell.unlock = userShellUnlock; shellInit(&shell, shellBuffer, 512); // if (xTaskCreate(shellTask, "shell", 256, &shell, 5, NULL) != pdPASS) // { // logError("shell task creat failed"); // } } //CEVENT_EXPORT(EVENT_INIT_STAGE2, userShellInit);
-
修改配置文件(shell_cfg.h)
-
在 freertos.c 包含头文件 shell_port.h
-
修改 .ld 链接文件
-
在 main 函数调用 letter shell 的初始化函数
userShellInit()
-
添加测试控制命令
在哪创建控制命令,就需要包含头文件shell_port.h
void shellTest(int a, int b, int c) { shellPrint(&shell, "This is test\r\n"); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), test, shellTest, This is test);
-
移植完成,编译应该没有错误或警告了,可以进行烧录测试。其他功能或内容可以查阅官方源码地址
测试是否成功
略
串口 printf 重定向
#ifdef __GNUC__
#define PUTCHAR_REDEFINE int __io_putchar(int ch)
#else
#define PUTCHAR_REDEINFE int fputc(int ch, FILE *f)
#endif
PUTCHAR_REDEFINE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, SERIAL_TIMEOUT);
return ch;
}
参考文章
letter-shell | 一个功能强大的嵌入式shell
示例源码
https://download.csdn.net/download/Wu_HuaJie/87502333