如何组织复杂程序的源? 我们创建了非常复杂的嵌入式系统和源代码。包含了Visual C++、IAR、代码编写器Studio和AltIn设计器和PCB的一些项目。所有这些可能都有几个版本。 那么,你能建议我怎样安排这些事情呢? 谢谢你

如何组织复杂程序的源? 我们创建了非常复杂的嵌入式系统和源代码。包含了Visual C++、IAR、代码编写器Studio和AltIn设计器和PCB的一些项目。所有这些可能都有几个版本。 那么,你能建议我怎样安排这些事情呢? 谢谢你,c++,embedded,C++,Embedded,你认为作为源的所有东西都应该在源代码控制系统下。这是处理版本、修订、分支和标记的最佳方式。Svn可以处理二进制文件,所以你将不会遇到非文本文件的问题。 < P>如果你的C++源文件是多的,并且跨多个目录,那么John Lakos所做的努力可能是非常值得的。这本书的主题是你的软件的物理布局,也就是说,源代码文件在目录中的排列,如何限制或扩展你修改软件的能力 降低复杂性 我的第一位工程学教授有一次著名的第一次讲座。它由写在黑板上的一个等式组成: 完美=简单 源代码控制系统的问题在于,它们管理复杂性,

你认为作为源的所有东西都应该在源代码控制系统下。这是处理版本、修订、分支和标记的最佳方式。Svn可以处理二进制文件,所以你将不会遇到非文本文件的问题。

< P>如果你的C++源文件是多的,并且跨多个目录,那么John Lakos所做的努力可能是非常值得的。这本书的主题是你的软件的物理布局,也就是说,源代码文件在目录中的排列,如何限制或扩展你修改软件的能力

降低复杂性

我的第一位工程学教授有一次著名的第一次讲座。它由写在黑板上的一个等式组成:

完美=简单


源代码控制系统的问题在于,它们管理复杂性,但也会促进复杂性。

我希望有一个目录结构,在顶层反映每个可编程部分。(即微控制器、DSP1、FPGA1、FPGA2等)

我还希望有一个包含所有生成文件的子目录,这样就很容易创建一个干净的源代码树。还可以轻松地直接从源代码配置工具进行干净的构建。(即,以尽可能少的步骤从源图像获取和构建二进制图像)


每个可编程部件都有自己的版本号,一个版本号反映每个子组件版本号的组合。

一定要使用源代码管理,如果程序本身不支持,只需将您使用的父文件夹置于源代码管理之下即可。SVN是我目前的最爱

至于如何安排您的文件,我注意到您的列表中有Altium Designer,该程序将a)与源代码管理配合良好,b)以有序的方式安排您的文件,假设您使用整个“项目”文件结构。考虑使用他们的“PCB”(如果你是这么做的)或“嵌入式”项目,当你创建一个项目时,它会为你创建存储所有不同类型文件的存储桶


即使您不想在文件中实际使用Altium,也可以创建一个项目并查看其目录结构,以了解需要跟踪的所有文件。

我的设置与您相同

我使用Altium Designer进行硬件原理图和PCB设计。但我也有固件源文件和相关实用程序。我有机械设计文件

我是这样做的:

Project Name
    Firmware
        MainCpu
            trunk
            tags
            branches
        IoCpu
            trunk
            tags
            branches
    Hardware
        MainPcb
            trunk
            tags
            branches
        IoPcb
            trunk
            tags
            branches
        PowerPcb
            trunk
            tags
            branches
    Mechanical
        Chassis
            trunk
            tags
            branches
        Other
            trunk
            tags
            branches
这样,所有项目文件都存储在SVN存储库中。我发现的唯一不利的一面是,你不能只是签出项目并获取最新的FW/HW/MEK文件。你必须检查每个FW/HW/MEK的负责人

FW/HW/MEK使用单独子模块的原因是,它们将获得单独的版本标签。

(除了普通的帮助程序类外)在每个cpp/h文件中放置一个类,并将cpp/h文件命名为与类相同的名称

将相关类文件分组到文件夹中(您可以选择使用与文件夹结构匹配的命名空间层次结构。此处的.net方法是使用CompanyName.ProductName命名空间,文件存储在解决方案的ProductName项目/子文件夹中)。例如,您可以将数学、I/O和绘图类分组到单独的“子系统”文件夹中

理想情况下,将这些单独的部分制作成可重用的库(MyCompany.Math)。稍后,当您想要开发一个新产品来共享一些代码时,您会为此感到高兴。在这种情况下,顶级“文件夹”本身就变成了独立的项目,您可以开始最小化它们之间的依赖关系,以实现并在代码库中实施更好的总体框架设计

文件夹中的理想情况是在杂乱和稀疏之间找到一个良好的平衡——尝试平衡文件夹,使每个文件夹中有5-15个文件。如果更少,考虑合并文件夹;如果更大,考虑添加子类别文件夹来分解复杂性。

只要类/文件和名称空间/文件夹具有良好的描述性名称,并且文件夹具有逻辑结构,就可以使一个非常大的项目非常容易导航


冒着引发宗教战争的风险,我更喜欢将标题及其源文件放在同一个文件夹中,这样当您编辑.cpp时,就可以轻松访问.h,而不必一直向上移动并被某个文件夹吸引。

+1我们在工作中使用SVN,但如果我今天要开始一个新项目,我可能会选择像mercurial这样的分布式系统。不要使用源代码管理,因为它“提升复杂性”是有史以来最糟糕的建议。我希望我能给出-10,但我必须坚持使用-1。我没有建议不要使用源代码管理。只是建议将它的使用与在任何时候降低复杂性的努力结合起来。我希望我的英语能简单11倍。这种结构的主要问题是我们可以在不同的项目或分支(文件夹)中使用一个文件:那么如何在不同的项目中更改一个文件呢?我不想创建libs(在以前的一个项目中,我们使用源代码配置管理工具(在本例中为perforce)管理了一些libs,并使用脚本将目录/子项目映射到本地计算机上的不同目录(本质上是共享文件,在本地生成计算机上有多个位置,但在源代码存储库上只有一个源目录)VSS还允许共享文件。VSS中的多个目录以及本地计算机上的多个目录,但在VSS环境中共享,因此任何目录中的更改都是更改