API 参考

XWSH 模块的 API 参考:所有公共和内部函数的详细说明。

概述

本文档提供 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 参数无效(cmdNULLnum 不为 0)
-EEXIST 外部命令与内部命令重名,或外部命令之间重名

上下文限制

  • 中断:不允许
  • 中断底半部:不允许
  • 线程:允许

注意

  • 此函数应在 XWSH 启动前调用(xwsh_start()xwsh_init() 之前)
  • 外部命令不能与内置命令重名,外部命令之间也不能重名
  • cmdNULLnum 为 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

显示 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 上下文限制规则

  1. 中断安全 API:可以在中断上下文中调用,通常满足以下条件:

    • 不阻塞
    • 不进行内存分配
    • 不使用线程同步原语
  2. 线程安全 API:可以在线程上下文中调用,可能:

    • 阻塞等待
    • 使用互斥锁等同步机制
    • 进行内存分配
  3. 混合上下文 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 增强错误处理,添加更多错误码

迁移指南

从旧版本迁移时,请注意:

  1. 检查 API 签名是否更改
  2. 更新包含路径(如有变化)
  3. 验证错误处理逻辑
  4. 测试自定义命令兼容性