# CherrySH
**Repository Path**: electron/CherrySH
## Basic Information
- **Project Name**: CherrySH
- **Description**: No description available
- **Primary Language**: C
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-01-24
- **Last Updated**: 2026-01-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
**[English](README.md) | 简体中文**
CherrySH
CherrySH 是一个专为嵌入式应用程序而设计的微型Shell。
## 功能
- 支持 TAB 键补全,包括命令和路径补全
- 支持历史记录,通过 ``↑`` ``↓`` 按键
- 支持环境变量,需使用 ``$` `作为前缀,例如` `$PATH``
- 支持设定用户名、主机名、路径
- 支持非阻塞模式,支持裸机和 RTOS
- 支持光标左右移动,支持 ``HOME``、``END`` 切换光标
- 支持组合按键,包括 ``Ctrl + \`` ``Alt + \`` ``F1-F12` 等
- 支持信号处理,捕获和处理不同的信号,例如Ctrl+C``SIGINT``和Ctrl+Z``SIGTSTP``,可中断当前执行的 shell 任务
- 支持用户登录,需要实现hash函数,默认strcmp
- 支持环境变量添加、修改、删除、读出
- 支持文件系统,FatFS,FileX,LittleFS,RomFS等(TODO)
- 支持 exit 函数实现终止命令执行以及现场返回并调用设定的handler,利用setjmp实现(裸机)(TODO)
- 支持作业控制,可以在前台或后台运行命令,并使用相关的控制命令(如fg、bg、jobs)来管理和操作作业(TODO)
- 支持多用户命令权限(TODO)
## 示例


## 移植
以先楫半导体hpm5301evklite为例。
- 命令查找采用的是 gcc 的 section 功能,因此,我们需要先修改 linkerscript 文件,增加相关 section,举例 gcc ld 文件:
```
.text : {
.....
. = ALIGN(4);
__fsymtab_start = .;
KEEP(*(FSymTab))
__fsymtab_end = .;
. = ALIGN(4);
__vsymtab_start = .;
KEEP(*(VSymTab))
__vsymtab_end = .;
. = ALIGN(4);
}
```
- 实现字符输入输出函数,接收推荐用中断 + ringbuf的形式
``` c
#include "csh.h"
static chry_shell_t csh;
static uint16_t csh_sput_cb(chry_readline_t *rl, const void *data, uint16_t size)
{
uint16_t i;
(void)rl;
for (i = 0; i < size; i++) {
if (status_success != uart_send_byte(HPM_UART0, ((uint8_t *)data)[i])) {
break;
}
}
return i;
}
static uint16_t csh_sget_cb(chry_readline_t *rl, void *data, uint16_t size)
{
uint16_t i;
(void)rl;
for (i = 0; i < size; i++) {
if (status_success != uart_receive_byte(HPM_UART0, (uint8_t *)data + i)) {
break;
}
}
return i;
}
```
- 初始化 shell,参考 samples 中实现
- 调用 `chry_shell_task_exec` 和 `chry_shell_task_repl`,参考 samples 中实现
- 配置系统环境变量
``` c
#define __ENV_PATH "/sbin:/bin"
const char ENV_PATH[] = __ENV_PATH;
CSH_RVAR_EXPORT(ENV_PATH, PATH, sizeof(__ENV_PATH));
#define __ENV_ZERO ""
const char ENV_ZERO[] = __ENV_ZERO;
CSH_RVAR_EXPORT(ENV_ZERO, ZERO, sizeof(__ENV_ZERO));
```
- 使用 `CSH_CMD_EXPORT` 导出命令
``` c
static int write_led(int argc, char **argv)
{
if (argc < 2) {
printf("usage: write_led \r\n\r\n");
printf(" status 0 or 1\r\n\r\n");
return -1;
}
board_led_write(atoi(argv[1]) == 0);
return 0;
}
CSH_CMD_EXPORT(write_led, );
```