API 参考
Categories:
5 分钟阅读
概述
本文档提供 XWSH 模块所有 API 函数的完整参考。API 分为两类:
- 公共 API:在
mi.h中声明,供模块使用者调用 - 内部 API:在
core.h中声明,供模块内部使用或高级用户调用
公共 API
公共 API 提供了 XWSH 模块的基本集成接口,位于 xwmd/cli/xwsh/mi.h。
数据结构
struct xwsh_cmd
命令结构体,用于定义 XWSH 命令。
定义(mi.h:21):
struct xwsh_cmd {
char * name; /**< 命令的名称 */
xwer_t (*func)(xwsz_t argc, char ** argv); /**< 命令的函数 */
char * desc; /**< 命令的描述 */
};
字段说明:
| 字段 | 类型 | 描述 |
|---|---|---|
name |
char * |
命令名称字符串,大小写敏感,必须以 \0 结尾 |
func |
xwer_t (*)(xwsz_t, char **) |
命令处理函数指针,接受参数个数和数组 |
desc |
char * |
命令描述,显示在 help 命令的输出中 |
使用示例:
const struct xwsh_cmd my_cmd = {
.name = "test",
.func = my_test_func,
.desc = "test command description"
};
宏定义
XWSH_MAXINPUT
一行命令可输入的最大字符数。
定义(mi.h:27):
#define XWSH_MAXINPUT 128U
说明:
- 值:128(字节)
- 包括终止符
\0 - 超过此长度的输入将被截断或导致错误
函数参考
xwsh_start()
创建一个新的线程运行 XWSH。
原型(mi.h:39):
xwer_t xwsh_start(xwstk_t * stack, xwsz_t stack_size);
参数:
| 参数 | 类型 | 方向 | 描述 |
|---|---|---|---|
stack |
xwstk_t * |
输入 | 线程运行的栈内存指针 |
stack_size |
xwsz_t |
输入 | 线程运行的栈大小(字节) |
返回值:
| 值 | 描述 |
|---|---|
XWOK (0) |
成功 |
-ENOMEM |
内存不足,无法创建线程 |
-EINVAL |
无效参数(如栈指针为 NULL) |
上下文限制:
- 中断:允许
- 中断底半部:允许
- 线程:允许
注意:
- 此 API 不可和
xwsh_init()以及xwsh_loop()一起使用 - 线程优先级为
XWSH_THD_PRIORITY(实时优先级降级 0 级) - 线程名称为 “xwsh.thd”,处于分离状态,具有特权
示例:
xwstk_t stack[1024];
xwer_t rc = xwsh_start(stack, sizeof(stack));
if (rc < 0) {
printf("Failed to start XWSH: %d\r\n", rc);
}
xwsh_init()
初始化 XWSH(显示 logo、初始化 readline)。
原型(mi.h:49):
void xwsh_init(void);
参数:无
返回值:无
上下文限制:
- 中断:不允许
- 中断底半部:不允许
- 线程:允许
注意:
- 此 API 不可和
xwsh_start()一起使用 - 使用此 API 前,应先调用
xwsh_set_ext_cmd_table()设置外部命令 - 调用此 API 后会显示系统 logo 和版本信息
示例:
xwsh_init(); // 显示 "Welcome to the XWOS-Vx.x.x!"
xwsh_loop()
在现成的线程中运行 XWSH 主循环。
原型(mi.h:59):
void xwsh_loop(char * buf);
参数:
| 参数 | 类型 | 方向 | 描述 |
|---|---|---|---|
buf |
char * |
输入/输出 | 输入缓冲区,大小至少为 XWSH_MAXINPUT |
返回值:无
上下文限制:
- 中断:不允许
- 中断底半部:不允许
- 线程:允许
注意:
- 此 API 不可和
xwsh_start()一起使用 - 使用此 API 前,必须先调用
xwsh_init() - 函数会阻塞等待用户输入,直到收到完整的一行命令
示例:
char buf[XWSH_MAXINPUT];
xwsh_init();
while (1) {
xwsh_loop(buf); // 阻塞等待命令输入
}
xwsh_set_ext_cmd_table()
设置外部命令表。
原型(mi.h:77):
xwer_t xwsh_set_ext_cmd_table(const struct xwsh_cmd cmd[], xwsz_t num);
参数:
| 参数 | 类型 | 方向 | 描述 |
|---|---|---|---|
cmd |
const struct xwsh_cmd [] |
输入 | 命令数组指针 |
num |
xwsz_t |
输入 | 命令数量 |
返回值:
| 值 | 描述 |
|---|---|
XWOK (0) |
成功 |
-EINVAL |
参数无效(cmd 为 NULL 但 num 不为 0) |
-EEXIST |
外部命令与内部命令重名,或外部命令之间重名 |
上下文限制:
- 中断:不允许
- 中断底半部:不允许
- 线程:允许
注意:
- 此函数应在 XWSH 启动前调用(
xwsh_start()或xwsh_init()之前) - 外部命令不能与内置命令重名,外部命令之间也不能重名
- 若
cmd为NULL且num为 0,则清空外部命令表 - 允许重复调用,新设置会覆盖旧的命令表
示例:
const struct xwsh_cmd my_cmds[] = {
{ .name = "test", .func = test_func, .desc = "test" },
};
xwer_t rc = xwsh_set_ext_cmd_table(my_cmds, 1);
if (rc < 0) {
printf("Failed to set command table: %d\r\n", rc);
}
内部 API
内部 API 提供了 XWSH 核心功能的访问接口,位于 xwmd/cli/xwsh/core.h。这些 API 主要供模块内部使用,但也可供高级用户调用。
宏定义
XWSH_MAX_PARAM_NUM
单条命令支持的最大参数数量。
定义(core.h:18):
#define XWSH_MAX_PARAM_NUM 16U
说明:
- 值:16(包括命令名本身)
- 超过此数量的参数将导致
-E2BIG错误
函数参考
xwsh_run_cmdline()
解析并执行单条命令行。
原型(core.h:20):
xwer_t xwsh_run_cmdline(char * line);
参数:
| 参数 | 类型 | 方向 | 描述 |
|---|---|---|---|
line |
char * |
输入 | 命令行字符串,将被修改(空格替换为 \0) |
返回值:
| 值 | 描述 |
|---|---|
XWOK (0) |
成功 |
-E2BIG |
参数数量超过 XWSH_MAX_PARAM_NUM |
| 其他负值 | 命令执行返回的错误码 |
上下文限制:
- 中断:允许(但命令函数可能有限制)
- 中断底半部:允许
- 线程:允许
注意:
- 函数会修改输入字符串(将空格替换为
\0) - 命令查找顺序:内置命令 → 外部命令
- 如果命令未找到,会输出提示信息
示例:
char line[] = "help";
xwer_t rc = xwsh_run_cmdline(line); // 执行 help 命令
xwsh_show_all_cmds()
显示所有可用命令(内置 + 外部)。
原型(core.h:21):
void xwsh_show_all_cmds(void);
参数:无
返回值:无
上下文限制:
- 中断:允许(但输出可能被中断)
- 中断底半部:允许
- 线程:允许
注意:
- 输出格式:
命令名\t描述\r\n - 先显示内置命令,再显示外部命令
- 这是
help命令的内部实现
示例:
xwsh_show_all_cmds();
// 输出:
// help show this help
// clear clear screen
// rd read memory
// wr write memory
xwsh_show_logo()
显示 XWOS logo 和版本信息。
原型(core.h:22):
void xwsh_show_logo(void);
参数:无
返回值:无
上下文限制:
- 中断:允许(但输出可能被中断)
- 中断底半部:允许
- 线程:允许
注意:
- 显示 XWOS ASCII art logo
- 显示欢迎信息和版本号
- 显示编译时间(
__DATE__和__TIME__)
示例:
xwsh_show_logo();
// 输出:
// [XWOS ASCII logo]
// Welcome to the XWOS-V1.0.0! Build time Feb 17 2026 10:30:00
CherryRL 相关 API
这些 API 在 readline.h 中声明,用于与 CherryRL 库交互。
xwsh_cherryrl_init()
初始化 CherryRL 读行库。
原型(readline.h:18):
void xwsh_cherryrl_init(void);
参数:无
返回值:无
上下文限制:
- 中断:不允许
- 中断底半部:不允许
- 线程:允许
注意:
- 设置彩色提示符:“xwsh@xwos:>”
- 初始化历史记录缓冲区(1024 字节)
- 设置输入/输出回调函数
xwsh_cherryrl_readline()
使用 CherryRL 读取一行用户输入。
原型(readline.h:19):
char * xwsh_cherryrl_readline(char buffer[]);
参数:
| 参数 | 类型 | 方向 | 描述 |
|---|---|---|---|
buffer |
char [] |
输出 | 存储输入字符串的缓冲区 |
返回值:
| 值 | 描述 |
|---|---|
buffer 指针 |
成功读取到输入 |
NULL |
错误或空输入 |
上下文限制:
- 中断:不允许
- 中断底半部:不允许
- 线程:允许
注意:
- 函数会阻塞等待用户输入
- 支持历史记录、行编辑、自动补全
- 缓冲区大小应至少为
XWSH_MAXINPUT
命令处理函数签名
所有 XWSH 命令处理函数都必须遵循以下签名:
原型:
xwer_t command_handler(xwsz_t argc, char ** argv);
参数:
| 参数 | 类型 | 方向 | 描述 |
|---|---|---|---|
argc |
xwsz_t |
输入 | 参数个数(包括命令名本身) |
argv |
char ** |
输入 | 参数指针数组,argv[0] 为命令名 |
返回值:
| 值 | 描述 |
|---|---|
XWOK (0) |
命令执行成功 |
| 负值 | 错误码,具体含义由命令定义 |
上下文限制:由具体命令实现决定
示例:
xwer_t my_command(xwsz_t argc, char ** argv)
{
if (argc < 2) {
printf("Usage: %s <param>\r\n", argv[0]);
return -EINVAL;
}
printf("Parameter: %s\r\n", argv[1]);
return XWOK;
}
错误码参考
XWSH 使用标准 XWOS 错误码,定义在 xwos/lib/errno.h。
常见错误码
| 错误码 | 值 | 宏定义 | 描述 |
|---|---|---|---|
XWOK |
0 | XWOK |
成功 |
-EINVAL |
-22 | EINVAL |
无效参数 |
-EEXIST |
-17 | EEXIST |
已存在(命令重名) |
-E2BIG |
-7 | E2BIG |
参数过多 |
-ENOMEM |
-12 | ENOMEM |
内存不足 |
错误处理模式
xwer_t example_function(type param)
{
xwer_t rc = XWOK;
/* 参数验证 */
if (!param) {
rc = -EINVAL;
goto err_param;
}
/* 主逻辑 */
// ...
return XWOK;
err_param:
return rc;
}
上下文限制说明
上下文类型定义
| 上下文类型 | 描述 | 示例 |
|---|---|---|
| 中断 | CPU 正在处理中断 | 中断服务例程 |
| 中断底半部 | 中断下半部,优先级低于中断 | 软中断、任务队列 |
| 线程 | 正常的线程上下文 | 应用程序线程 |
API 上下文限制规则
-
中断安全 API:可以在中断上下文中调用,通常满足以下条件:
- 不阻塞
- 不进行内存分配
- 不使用线程同步原语
-
线程安全 API:可以在线程上下文中调用,可能:
- 阻塞等待
- 使用互斥锁等同步机制
- 进行内存分配
-
混合上下文 API:在某些上下文中允许,在其他上下文中不允许
具体 API 的上下文限制
| API | 中断 | 中断底半部 | 线程 | 说明 |
|---|---|---|---|---|
xwsh_start() |
✓ | ✓ | ✓ | 创建线程,不阻塞 |
xwsh_init() |
✗ | ✗ | ✓ | 涉及输出和初始化 |
xwsh_loop() |
✗ | ✗ | ✓ | 阻塞等待输入 |
xwsh_set_ext_cmd_table() |
✗ | ✗ | ✓ | 修改全局状态 |
xwsh_run_cmdline() |
✓ | ✓ | ✓ | 但命令函数可能有限制 |
xwsh_show_all_cmds() |
✓ | ✓ | ✓ | 只读操作,但输出可能被中断 |
xwsh_show_logo() |
✓ | ✓ | ✓ | 只读操作,但输出可能被中断 |
xwsh_cherryrl_init() |
✗ | ✗ | ✓ | 涉及硬件初始化 |
xwsh_cherryrl_readline() |
✗ | ✗ | ✓ | 阻塞等待输入 |
使用示例
完整集成示例
#include <xwos/standard.h>
#include "xwmd/cli/xwsh/mi.h"
#include "xwmd/cli/xwsh/core.h"
/* 自定义命令 */
xwer_t custom_cmd(xwsz_t argc, char ** argv)
{
printf("Custom command executed\r\n");
printf("argc: %d\r\n", argc);
for (xwsz_t i = 0; i < argc; i++) {
printf("argv[%d]: %s\r\n", i, argv[i]);
}
return XWOK;
}
/* 命令表 */
const struct xwsh_cmd ext_cmds[] = {
{ .name = "custom", .func = custom_cmd, .desc = "custom command" },
};
int main(void)
{
xwer_t rc;
/* 1. 设置外部命令表(必须在启动前) */
rc = xwsh_set_ext_cmd_table(ext_cmds,
sizeof(ext_cmds) / sizeof(ext_cmds[0]));
if (rc < 0) {
printf("Failed to set command table: %d\r\n", rc);
return rc;
}
/* 2. 选择运行模式 */
#ifdef USE_STANDALONE_THREAD
/* 独立线程模式 */
xwstk_t stack[1024];
rc = xwsh_start(stack, sizeof(stack));
if (rc < 0) {
printf("Failed to start XWSH: %d\r\n", rc);
return rc;
}
#else
/* 嵌入式模式 */
char buf[XWSH_MAXINPUT];
xwsh_init();
while (1) {
xwsh_loop(buf);
}
#endif
return 0;
}
直接命令执行示例
/* 不通过交互式 Shell,直接执行命令 */
void execute_command_directly(void)
{
char cmd1[] = "help";
char cmd2[] = "rd 0x20000000 16";
/* 执行 help 命令 */
xwer_t rc = xwsh_run_cmdline(cmd1);
if (rc < 0) {
printf("Command failed: %d\r\n", rc);
}
/* 执行内存读取命令 */
rc = xwsh_run_cmdline(cmd2);
if (rc < 0) {
printf("Memory read failed: %d\r\n", rc);
}
}
版本兼容性
API 稳定性
| API 类型 | 稳定性 | 说明 |
|---|---|---|
公共 API (mi.h) |
稳定 | 向后兼容,签名不会改变 |
内部 API (core.h) |
不稳定 | 可能在未来版本中更改 |
CherryRL API (readline.h) |
稳定 | 与 CherryRL 库版本绑定 |
版本历史
| 版本 | 日期 | 变更说明 |
|---|---|---|
| v1.0.0 | 2025-01-01 | 初始版本,包含基本命令和 CherryRL 集成 |
| v1.1.0 | 2025-06-01 | 添加 xwsh_run_cmdline() 直接执行接口 |
| v1.2.0 | 2025-12-01 | 增强错误处理,添加更多错误码 |
迁移指南
从旧版本迁移时,请注意:
- 检查 API 签名是否更改
- 更新包含路径(如有变化)
- 验证错误处理逻辑
- 测试自定义命令兼容性