1
0
mirror of https://github.com/NevermindZZT/letter-shell.git synced 2025-01-21 10:02:54 +08:00

命令组支持函数签名

This commit is contained in:
Letter 2024-06-13 22:40:10 +08:00
parent 199fa5fe92
commit abc23365d0
3 changed files with 33 additions and 4 deletions

View File

@ -8,8 +8,16 @@
## 注意 ## 注意
- `esp-idf` 编译系统会忽略 `__attribute__((used))` 声明,所以仅仅作为命令定义的函数不会被包含在编译出来的固件里面,只有被代码引用的函数会被编译进去 - `esp-idf` 编译系统会忽略 `__attribute__((used))` 声明,所以仅仅作为命令定义的函数不会被包含在编译出来的固件里面,只有被代码引用的函数会被编译进去,参考 ![保留符号](#保留符号)
- 此 demo 包含链接使用的 `.lf` 文件,在使用这个文件的情况下不需要修改 `esp-idf` 中的 `ld` 文件 - 此 demo 包含链接使用的 `.lf` 文件,在使用这个文件的情况下不需要修改 `esp-idf` 中的 `ld` 文件
- 如果使用 overlay 的方式配置 shell建议在主 CMakeList.txt 后面添加 `idf_build_set_property(COMPILE_OPTIONS "-DSHELL_CFG_USER=\"shell_cfg_user.h\"" APPEND)` - 如果使用 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` 开头,拼接命令名即可

View File

@ -76,7 +76,7 @@ static void shellCmdGroupHelp(Shell *shell, char *name, ShellCommand *group)
if (item->data.cmd.desc) { if (item->data.cmd.desc) {
shellWriteString(shell, item->data.cmd.desc); shellWriteString(shell, item->data.cmd.desc);
} }
shellWriteString(shell, "\r\n"); shellWriteString(shell, "\r\n\r\n");
item++; item++;
} }
} }

View File

@ -43,15 +43,36 @@
* @param _type (SHELL_TYPE_CMD_MAIN or SHELL_TYPE_CMD_FUNC) * @param _type (SHELL_TYPE_CMD_MAIN or SHELL_TYPE_CMD_FUNC)
* @param _func * @param _func
* @param _desc * @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, \ .attr.value = SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(_type)|SHELL_CMD_DISABLE_RETURN, \
.data.cmd.name = #_name, \ .data.cmd.name = #_name, \
.data.cmd.function = (int (*)())_func, \ .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 * @brief shell
* *