From abc23365d032b13137b039992a0ca767d9e02297 Mon Sep 17 00:00:00 2001 From: Letter Date: Thu, 13 Jun 2024 22:40:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=BD=E4=BB=A4=E7=BB=84=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo/esp-idf/readme.md | 10 ++++++++- extensions/shell_enhance/shell_cmd_group.c | 2 +- extensions/shell_enhance/shell_cmd_group.h | 25 ++++++++++++++++++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/demo/esp-idf/readme.md b/demo/esp-idf/readme.md index 63c3cef..d18bb5b 100644 --- a/demo/esp-idf/readme.md +++ b/demo/esp-idf/readme.md @@ -8,8 +8,16 @@ ## 注意 -- `esp-idf` 编译系统会忽略 `__attribute__((used))` 声明,所以仅仅作为命令定义的函数不会被包含在编译出来的固件里面,只有被代码引用的函数会被编译进去 +- `esp-idf` 编译系统会忽略 `__attribute__((used))` 声明,所以仅仅作为命令定义的函数不会被包含在编译出来的固件里面,只有被代码引用的函数会被编译进去,参考 ![保留符号](#保留符号) - 此 demo 包含链接使用的 `.lf` 文件,在使用这个文件的情况下不需要修改 `esp-idf` 中的 `ld` 文件 - 如果使用 overlay 的方式配置 shell,建议在主 CMakeList.txt 后面添加 `idf_build_set_property(COMPILE_OPTIONS "-DSHELL_CFG_USER=\"shell_cfg_user.h\"" APPEND)` + +## 保留符号 + +由于 shell 命令实际上声明的是一个全局变量,并且没有被引用过,所以编译系统编译时会忽略这个变量,导致这个命令不会被编译进去,`__attribute__((used))` 声明就是用来防止编译系统优化的 + +同时,需要修改 ld 文件,将这些符号编译到一块连续的空间中,这块可以参考项目 readme + +对于 esp-idf,还提供了一个 lf 文件的方式,此 demo 就是使用了这种方式,但是 lf 文件仅作用于当前组件,就会导致其他组件声明的命令不会被编译进来,可以在其他组件的 CMakeLists.txt 中添加 `target_link_libraries(${COMPONENT_LIB} INTERFACE "-u shellCommandtest")` 来解决这个问题,其中 `shellCommandtest` 是就是 shell 导出时声明的符号,以 `shellCommand` 开头,拼接命令名即可 diff --git a/extensions/shell_enhance/shell_cmd_group.c b/extensions/shell_enhance/shell_cmd_group.c index bb741a5..d9e1e94 100644 --- a/extensions/shell_enhance/shell_cmd_group.c +++ b/extensions/shell_enhance/shell_cmd_group.c @@ -76,7 +76,7 @@ static void shellCmdGroupHelp(Shell *shell, char *name, ShellCommand *group) if (item->data.cmd.desc) { shellWriteString(shell, item->data.cmd.desc); } - shellWriteString(shell, "\r\n"); + shellWriteString(shell, "\r\n\r\n"); item++; } } diff --git a/extensions/shell_enhance/shell_cmd_group.h b/extensions/shell_enhance/shell_cmd_group.h index 6719b52..86e9adc 100644 --- a/extensions/shell_enhance/shell_cmd_group.h +++ b/extensions/shell_enhance/shell_cmd_group.h @@ -43,15 +43,36 @@ * @param _type 命令类型(SHELL_TYPE_CMD_MAIN or SHELL_TYPE_CMD_FUNC) * @param _func 命令函数 * @param _desc 命令描述 + * @param ... 其他参数 */ -#define SHELL_CMD_GROUP_ITEM(_type, _name, _func, _desc) \ +#define SHELL_CMD_GROUP_ITEM(_type, _name, _func, _desc, ...) \ { \ .attr.value = SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(_type)|SHELL_CMD_DISABLE_RETURN, \ .data.cmd.name = #_name, \ .data.cmd.function = (int (*)())_func, \ - .data.cmd.desc = #_desc \ + .data.cmd.desc = #_desc, \ + ##__VA_ARGS__ \ } +#if SHELL_USING_FUNC_SIGNATURE == 1 + /** + * @brief shell 命令组item定义 + * + * @param _type 命令类型(SHELL_TYPE_CMD_MAIN or SHELL_TYPE_CMD_FUNC) + * @param _func 命令函数 + * @param _desc 命令描述 + * @param _sign 命令签名 + */ + #define SHELL_CMD_GROUP_ITEM_SIGN(_type, _name, _func, _desc, _sign) \ + { \ + .attr.value = SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(_type)|SHELL_CMD_DISABLE_RETURN, \ + .data.cmd.name = #_name, \ + .data.cmd.function = (int (*)())_func, \ + .data.cmd.desc = #_desc, \ + .data.cmd.signature = #_sign, \ + } +#endif + /** * @brief shell 命令组定义结尾 *