此目录文件用于在 esp-idf 中使用 letter-shell 做参考
此 demo 已经包含 CMakeLists.txt, 可直接作为 esp-idf 的模块编译
-
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 开头,拼接命令名即可
在.platformio\packages\framework-arduinoespressif32\tools\sdk中用vscode打开 再搜索_rodata_end = ABSOLUTE(.);在上方插入
/* lettershell关键词注册 */
. = ALIGN (4);
_shell_command_start = ABSOLUTE(.);
KEEP (*(shellCommand))
_shell_command_end = ABSOLUTE(.);
. = ALIGN (4);
即可使用lettershell