以前玩玩小项目,可能一个main.c就搞定了,或者分一两个工具文件也行。

但如果要搞比较复杂的项目了,或者要跟别人合作了,那这么搞就不行了。

今天来看看VScode里使用ESP-IDF如何分文件编写。

图片

创建完项目之后,main文件夹下干净的很,就一个main.c和一个CMakeLists.txt,因为ESP-IDF用的是CMake,所以我们一会就要用到这个CMakeLists.txt。

我之前写过一文入门CMake,但是说实话,我现在已经忘光光了,只会阿巴阿巴,所以这一篇文也算是我自己的笔记。

要分文件编写,最简单的方法就是在main文件下创建.c和.h文件。

图片

比如上面这样,也是适用于小项目,大项目也是不推荐,这个一会再来说。

这么写完之后在main.c里可以包含对应的头文件,VSCode也会弹出代码提示,但是一旦开始编译就会出问题,那就是编译器并不会去编译我们的Z_test.c。

这个时候我们就需要修改CMakeLists.txt(跟main.c在同一级目录下的那个)

默认是下面这样的。

idf_component_register(SRCS "main.c"  
                 INCLUDE_DIRS ".")

也就是它只编译main.c。

这个也好办,我们把我们要编译的文件加上去就可以了。

idf_component_register(SRCS "main.c" "Z_test.c" 
                   INCLUDE_DIRS ".")

不过这样的话,文件一多,看起来就很复杂了,我们可以使用CMake的set。

set(ALL_SRCS 
    "main.c"
    "Z_test.c"
)

idf_component_register(SRCS ${ALL_SRCS}
                   INCLUDE_DIRS ".")

其中ALL_SRCS可以理解为自定义的变量名,底下的“main.c”和“Z_tets.c”就是赋值给这个变量的值。

下面使用就是${变量名}

不过这样子也得一个个把文件名写上去,嫌麻烦的话可以用下面的方式。

file(GLOB ALL_SRCS "*.c")

idf_component_register(SRCS ${ALL_SRCS}
                   INCLUDE_DIRS ".")

具体什么意思咱不用知道(现在的我也说不明白,我只会阿巴阿巴)

咱要知道的就是ALL_SRCS这个变量,代表的是“*.c”,这个通配符,意思就是所有.c文件我都包含了。

不过一旦项目复杂了,就会导致所有文件都被编译,即使有部分的文件你并不希望它被编译。

那么改用上一个方案,或者你用通配符自己重写一下。

上面是分文件,但是分的文件和main.c在同一级目录下的做法。

我们之前常用的方法是另外建一个文件夹,然后分文件到这个文件夹里。

在ESP-IDF中,我们要先建一个名字叫components的文件夹,名字一定得叫这个,这是ESP-IDF规定的,如果我们去使用ESP-IDF的官方组件,那么ESP-IDF默认就是把模组的文件夹放进components,如果没有这个文件夹它会创建。

并且编译的时候,它会自己跑到components里面去找文件,所以你不叫这名字还不行。

另外我们再在这个文件夹里创建一个存放自己文件的文件夹。

比如下面这样。

图片

其中Z_Tools是存放我自己文件的文件夹。

Include是存放.h文件的,src是存放.c文件的,你不叫这个名字也可以,不区分也可以,就全部丢到Z_Tools下也行。

另外我们要自己写一个CMakeLists.txt,直接抄main.c下的那个CMakeLists.txt就行。

idf_component_register(SRCS "src/Z_uart.c"
                   INCLUDE_DIRS "include")

其中INCLUDE_DIRS后面就是设置头文件路径的。

main下的那个CMakeLists.txt是把INCLUDE_DIRS设置为“.”,意思就是本目录,所以刚刚我们直接编译是没问题的。

如果像我这样把头文件单独装到一个文件夹里,那就需要指定一下头文件目录了。

最后有个小问题,那就是如果我们想要在我们自己文件里使用ESP-IDF的库,那么还需要在CMakeLists.txt加上点东西。

比如我要使用最常用的GPIO。

那么打开ESP-IDF编程指南里GPIO章节,往下划,在API详情模块可以看到下面这样的。

图片

除了包含头文件之外,还需要在CMakeLists.txt添加上图中下面的内容。

就像我这样。

file(GLOB ALL_SRCS "src/*.c")

idf_component_register(SRCS ${ALL_SRCS}
                   INCLUDE_DIRS "include"
                   REQUIRES esp_driver_gpio)

写完之后重新编译一下就可以了。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐