mirror of
https://github.com/NevermindZZT/letter-shell.git
synced 2025-01-21 10:02:54 +08:00
命令组支持函数签名
This commit is contained in:
parent
199fa5fe92
commit
abc23365d0
@ -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` 开头,拼接命令名即可
|
||||||
|
@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 命令组定义结尾
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user