我在 C 中的典型嵌入式软件中找不到关于文件结构的好建议。SO 上有很多这样的问题和答案,但没有一个涵盖我提出的问题,或者似乎适用于 C 中的嵌入式系统。
我明白没有灵丹妙药。如果这有助于缩小建议范围,我的典型应用程序必须适合具有 8 到 32 kB 闪存和几 kB RAM 的目标。时钟在 4 到 20 MHz 范围内。
1.图层
我已经看到源代码分层组织,每一层都有自己的目录:
- 应用
- 传输层
- 硬件抽象层
问题是模块通常在所有这些层中都有文件,因此在目录中分离层意味着单个模块的文件分散在各处。封装不良。
2.目录中的模块,$ROOT/includes/中的h文件
每个模块一个目录。好处是真正的封装。我不确定如何做好是如何发布模块的API。开源 PC 应用程序 SW 似乎:
- 在模块目录中包含所有源代码(所有 C 文件和所有头文件,仅用于模块内)
- 将模块目录外的 API 头文件发布到
$PROJ_ROOT/includes
.
这样我就可以-I$PROJ_ROOT/includes
在我的编译器命令中有(或等效的),并且在我的#include
语句中没有搜索路径。
一个问题是 API 在模块目录之外,从而破坏了封装。例如,在 VCS 中将模块作为独立的模块进行维护是比较困难的。
3. 目录中有API的模块
与上面相同,但 API 头文件位于模块目录中。适当的封装和更易于版本控制模块,但 API 头文件与其他模块头文件处于同一级别,这些头文件是私有的。在模块之外包含这样一个“私有”头文件的诱惑对于未来的开发人员来说可能太大了,并且不可见哪个 h 文件是公开的,哪些不是。
4. 目录中有API的模块,子目录中有私有结构
仅将 API 头文件直接放在模块目录中,其他所有文件放在一个或多个子目录中。这可能行得通,但我觉得结构越来越复杂,我不太喜欢。
我觉得我应该选择 2 或 4,但会非常感谢洞察力。如何解决我描述的相关缺点?其他选择?
这种大小的成功开源软件的链接也可能很好。也欢迎文学建议。