1. 源码目录结构

    ESP32官方提供的源码资源很丰富,有兴趣的开发者可选择下载,参见下图。另外也提供了ESP32的IOT解决方案。

 

ESP32 marlin源码分析 esp32 cmake_单元测试

 

  可以看出,整个目录结构完全按照功能模块来划分,每个功能模块都有自己的CMakeList.txt文件,main文件夹,Makefile文件,以及README.md文件。

  分别代表:

  • CMakeList.txt: CMake 是一个跨平台的自动化建构系统,它使用CMakeLists.txt文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。
  • Makefile:在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • Main文件夹: 里面包括c文件以及头文件,用以实现具体的功能。

 

    下图为其中一个模块的目录结构:

 

ESP32 marlin源码分析 esp32 cmake_ESP32 marlin源码分析_02

 

  2.单元测试结构

  ESP-IDF 是乐鑫为 ESP32 提供的物联网开发框架。其包含一系列库及头文件,提供了基于 ESP32 构建软件项目所需的核心组件;ESP-IDF 还提供了开发和量产过程中最常用的工具及功能,例如:构建、烧录、调试和测量等。

  ESP-IDF 中附带了一个基于Unity的单元测试应用程序框架,且所有的单元测试用例分别保存在 ESP-IDF 仓库中每个组件的test子目录中。

  单元测试被添加在相应组件的test子目录中,test 子目录需要包含 :ref:组件 CMakeLists.txt <component-directories>,因为他们本身就是一种组件。ESP-IDF 使用了 unity 测试框架,需要将其指定为组件的依赖项。

  

ESP32 marlin源码分析 esp32 cmake_测试用例_03

 

    单元测试被添加在相应组件的test子目录中,测试用例写在 C 文件中,一个 C 文件可以包含多个测试用例。测试文件的名字要以“test”开头。

    测试文件需要包含 unity.h 头文件,此外还需要包含待测试 C 模块需要的头文件。如下图所示,为EPS32 VFS模块的单元测试源码目录为例:

ESP32 marlin源码分析 esp32 cmake_ESP32 marlin源码分析_04

 

    测试用例需要通过 C 文件中特定的函数来添加,如下所示:

1     TEST_CASE("test name", "[module name]"
2     {
3           // 在这里添加测试用例
4     }

  第一个参数是字符串,用来描述当前测试; 第二个参数是字符串,用方括号中的标识符来表示,标识符用来对相关测试或具有特定属性的测试进行分组。以下为vfs中对 TEST_CASE() 函数的调用:

1        TEST_CASE("Can use access() for UART", "[vfs]"){}

 

 vfs模块的单元测试源码整体框架如下图所示:

  

ESP32 marlin源码分析 esp32 cmake_测试用例_05

 

  3.代码风格

    函数名命名举例:

1       static void sdio_intr_host(void*);
2       static void sdio_intr_send(void*);
3       static void sdio_intr_recv(void*);

 

    变量命名举例:

1       uint8_t command_bits;           
2       uint8_t address_bits; 
3       uint8_t dummy_bits;

  

    注释举例:

ESP32 marlin源码分析 esp32 cmake_测试用例_06

 

  由上面两个例子可看出为了提升代码的可读性,项目的函数名、变量名等都是根据函数功能或者变量含义来命名,且相同模块的不同功能是通过使用下划线连接模块名和功能名称来实现的,非常直观,且整个项目看下来,命名方式非常统一,且不同功能模块之间有注释分割,使得代码看起来简洁清晰,可读性非常强!