开源改变世界!!

编码风格、架构和很多小事 #504

推推 grbl 2年前 (2022-10-18) 270次浏览 0个评论

关闭
atlaste 打开了这个问题 on 2 Aug 2020 · 9 条评论
关闭

编码风格、架构和许多小事#504

atlaste 打开了这个问题 on 2 Aug 2020 · 9 条评论

注释

编码风格、架构和很多小事 #504
合作者

地图册 评论 on 2 Aug 2020

在过去的几周里,我花了很多时间研究 grbl-esp32 代码库。其中之一是我想自己使用 GRBL/ESP32,这意味着我还必须真正了解代码库才能实现代码更改和功能。目前,我还没有触及代码的逻辑,所以它的行为应该仍然与 devt 分支相同。

只是想分享这个,尽管这仍然是一个 WIP(甚至还没有编译),并且有一些悬而未决的问题。

  • 在 vMicro 中编译。vMicro 是我所知道的用于 Arduino 项目的最流行的 Arduino Visual Studion 插件……而且我正在使用它,因此使用它来构建代码是有意义的。
  • 文档。我为文档添加了一些 MD 文件。
  • 编码风格。我注意到,自从它首次从 GRBL 移植以来,代码库已经有机地增长,整个代码库具有不同的编码风格。对我来说,很难看到发生了什么,所以我添加了一个.clang-format文件并将其调整为我认为的主要编码风格。它并不完美,但至少它是一致的。
  • C/C++ 问题。我发现代码库中有一些 C/C++ 问题。仅举几例:_保留全局名称空间中的前缀,并且#includeCPP 文件通常被认为是一种不好的做法。在我看到这些的地方,我消除了它们。
  • 类和文件名。一个简单的方法来帮助人们知道什么是在哪里是把类放在同名的文件中。此外,这有助于加快编译时间,因为编译器应该为每个类做更少的工作。
  • 包括. 大多数代码刚刚包括在内grbl.h,基本上包括所有内容。这意味着增量编译将被破坏,因为对于每个标头更改,编译器都必须重新编译该批次。我更改了文件以包含那里需要的内容。
  • 命名空间。对我来说,将代码移动到它所属的地方是有意义的。因此,主轴进入 Spindles 命名空间,电机进入 Motors 命名空间等等。不过,这仍然是一个 WIP,很难破译一切都应该去哪里。
  • const 与 define。目前,代码库中有大量的#define‘s 也可能是类 (const/constexpr) 变量。后者的优点是您可以获得编译时检查(因为它们是强类型的)并且它们是作用域的。实际上,我通过将代码设置为 const 来修复了一些隐式舍入错误。(就性能或内存使用而言,这并不重要)。

正在进行的工作和未来的工作:

  • 混合 C 和 C++。旧的 GRBL 代码库是纯 C,它与 C++ 混合。我也想将旧的 GRBL 代码更改为类 – 基本上这也是前缀无论如何都会发生的事情,所以我不妨推一下。这也是目前代码无法编译的主要原因。我已经开始搬东西了,但这还需要更多的工作。
  • 设置和配置。我认为最好将编译时和运行时设置更好地分开。

我仍然有一些我自己无法解决的悬而未决的问题:

  • 一般来说。我已经改变了相当多的结构;也许其中一些并不是最好的选择。因此,我很好奇您的总体印象是什么。
  • 电磁笔。电磁笔在我看来就像一种主轴。为什么这是一个单独的文件?
  • 伺服。同样,我对servo_axis和有点困惑RcServoClass。为什么不是一切都在后者?还是这仍然是 WIP?
  • 打印。我不太了解这些print.cpp功能,因为还有grbl_send似乎更通用的变体。
  • 部分编译。我发现自己想知道禁用 WIFI 和 BT 等功能有什么好处。既然 ESP32 具有所需的空间,为什么不简单地将其设置为运行时设置呢?在这里使用 ifdef 有什么好处吗?

我正在处理的分支可以在这里找到:https ://github.com/atlaste/Grbl_Esp32/tree/CleanupDevt/Grbl_Esp32 。再次强调,这仍然是一个 WIP,甚至还没有编译;需要做更多的工作,如果可能的话,我会继续投入时间。

编码风格、架构和很多小事 #504
编码风格、架构和很多小事 #504
所有者

婚戒 评论 2020 年 8 月 3 日

@ggallant571

请,本论坛只接受建设性或积极的评论。

编码风格、架构和很多小事 #504
合作者作者

地图册 评论 2020 年 8 月 3 日

只是想补充一点,这绝不是侮辱;相反。事实上,我很感激在创建 CNC 板时得到的帮助,所以我也决定做出贡献。虽然我还是电子产品的新手,但人们确实认为我是 C++ 方面的专家软件工程师。尽管如此,我总觉得我的工作应该为自己说话。

我再次强调这仍然是一个 WIP,我需要更多的时间。

无论如何:如果 Bart 和 Mitch 不欣赏我的帮助,那是我的损失,而且是我一个人的损失。在这种情况下,我们将关闭这张票并将其保留。

编码风格、架构和很多小事 #504

@ggallant571
如果您如此自信,请将 grbl 移植到您选择的控制器并以这种方式命名。
作为用户,你或我没有权利批评建设性的工作。尤其是开发者把宝贵的时间花在了一件工作上,你我都在自由地使用。您总是可以选择购买专业的 cnc 控制器,然后如果您对他们的产品不满意,请批评该公司。所以,让我们在这个论坛中以积极的方式交谈。

编码风格、架构和很多小事 #504
编码风格、架构和很多小事 #504
合作者作者

地图册 评论 2020 年 8 月 4 日

@ggallant571从您的评论中,我相信您错误地认为我介绍了类和(更通用的)C++ 代码之类的东西。我没有。GRBL_ESP32 不是 GRBL;它进化了,已经有了用于主轴和电机的类,并使用来自外部库的类。IMO 这是一个不错的选择,鉴于 ESP32 比 Arduino Uno 强大得多,因此将更多的东西转移到运行时可配置是很有意义的。事实上,最近的功能之一就是spindle_select调用,这是一个很好的例子。

显然,功能和稳定性是 CNC 机床的关键。绝对没有关于这个的讨论(我昨天运行了一条 800K 线的刀具路径,想象一下如果它在中途断裂我会有什么感觉)。事实上,我相信如果我的工作做得好,在 PC 上运行“模拟”CNC 机床应该会相对容易,这样可以更轻松、更快速地进行测试,以确保未来版本的稳定性。但公平地说,这目前只是我的愿望清单上的东西,因为它的复杂性。但是……在有这样的设施之前,我也不认为彻底检查整个项目是明智的,尤其是逻辑。是的,

这就是为什么我从唾手可得的成果开始:在不改变逻辑的情况下移动事物并添加明显的(缺失的 ctor、虚拟析构函数、包含、命名空间、iso std 命名、样式等)。一步一步来。

编码风格、架构和很多小事 #504

我认为这是一条值得走的路。巴特和我已经朝着这个方向迈出了一步,所以你肯定走在一条合理的轨道上。从很久以前我就是一个彻头彻尾的 C 程序员,所以迁移到 C++ 引起了我的一些担忧,但我最近对新设置架构的体验让我确信,如果使用得当,C++ 会非常有价值。我所说的“高雅”是指“避免使用庞大的外部框架”和“尽量不要使用太多抽象和重载,以至于新读者无法弄清楚发生了什么”。

也许我们可以逐步地做,而不是一个带有一整套变化的分支,作为一系列 PR,一次呈现一个,并在中间时间进行审查。这使得测试和审查变得更加容易,并允许通过二分法来发现问题。以下是我对个别观点的评论:

在 vMicro 中编译。vMicro 是我所知道的用于 Arduino 项目的最流行的 Arduino Visual Studion 插件……而且我正在使用它,因此使用它来构建代码是有意义的。

Bart 和我现在大部分工作都使用 platformio。它可以从命令行使用,也可以集成在 VSCode IDE 中,或者以混合模式与 VSCode 集成但使用外部编辑器。platformio 的编译速度比 Arduino 快得多,这可能是因为它编译了单个文件,而不是使用 Arduino 将所有内容连接到一个文件并编译整个 wad 的可疑技巧。

VSCode 的受欢迎程度似乎在突飞猛进,所以感觉它是“主要支持的 IDE”的一个不错的选择。

我不知道 vMicro 的特点是什么——但我确实认为支持两个环境已经足够困难了,所以添加第三个环境似乎是额外的工作,没有太多好处。如果 vMicro 配置与 Arduino 相当,不需要额外考虑,那么它是无关紧要的。我们必须支持 Arduino,因为它很熟悉,但我们真的不太喜欢它 – 当“一个构建来统治他们”土地时,容纳新手的需求可能会消失(见下文)。

文档。我为文档添加了一些 MD 文件。

文档总是非常感谢!单独公关。

编码风格。我注意到,自从它首次从 GRBL 移植以来,代码库已经有机地增长,整个代码库具有不同的编码风格。对我来说,很难看到发生了什么,所以我添加了一个 .clang 格式的文件,并将其调整为我认为的主要编码风格。它并不完美,但至少它是一致的。

那在我们的清单上,Bart 朝着这个方向采取了一些步骤,但我们并没有像我们应该的那样系统地使用它。我认为这将是一个很好的第一步。或许您可以确保它在 VSCode/platformio 环境中运行良好(VSCode 确实支持 clang-format),然后教我们如何有效地使用它。仅更改空格的全局重新格式化将是一个很好的补丁,以及某种 git 自动化来检查提交。

C/C++ 问题。我发现代码库中有一些 C/C++ 问题。仅举几例: _ 作为全局命名空间中的前缀是保留的,#include CPP 文件通常被认为是一种不好的做法。在我看到这些的地方,我消除了它们。

这将是一个很好的第二个补丁。我同意包括 CPP 是不好的。我忘记了我们为什么这样做,但它可能与 Arduino IDE 的陌生性有关。如果你能找到一个更好的解决方案,它适用于普通的 Arduino 和 platformio,那将是一个很好的第二个补丁。第三个是消除 _ 前缀。

类和文件名。一个简单的方法来帮助人们知道什么是在哪里是把类放在同名的文件中。此外,这有助于加快编译时间,因为编译器应该为每个类做更少的工作。

这听起来不错。对人类的好处是显而易见的。你能解释一下它如何帮助编译器做更少的工作吗?我没有意识到 C++ 编译器知道文件名和它的内容之间的关系。

包括。大多数代码只包含 grbl.h,它基本上包含了所有内容。这意味着增量编译将被破坏,因为对于每个标头更改,编译器都必须重新编译该批次。我更改了文件以包含那里需要的内容。

哇,考虑到很难整理出在哪里使用的内容和依赖图,我真的很佩服你做到了这一点。我通常尝试这样做,尤其是构建代码,以便单个文件依赖于最少数量的包含 – 但在大型项目中,随着时间的推移保持这种纯度变得困难。我非常希望看到您的解决方案。

命名空间。对我来说,将代码移动到它所属的地方是有意义的。因此,主轴进入 Spindles 命名空间,电机进入 Motors 命名空间等等。不过,这仍然是一个 WIP,很难破译一切都应该去哪里。

我不确定你在这里建议什么。我们有 Spindles 和 Motors 类(可能需要改进);我们还需要这些概念的名称空间吗?

常量与定义。目前,代码库中有大量#define 也可能是类(const/constexpr)变量。后者的优点是您可以获得编译时检查(因为它们是强类型的)并且它们是作用域的。实际上,我通过将代码设置为 const 来修复了一些隐式舍入错误。(就性能或内存使用而言,这并不重要)。

是的,绝对想要这样做 – 并且在有意义的地方也使用枚举而不是#defines。很想得到你的帮助 – 但作为小型目标补丁,而不是一个巨大的综合体。

混合 C 和 C++。旧的 GRBL 代码库是纯 C,它与 C++ 混合。我也想将旧的 GRBL 代码更改为类 – 基本上这也是前缀无论如何都会发生的事情,所以我不妨推一下。这也是目前代码无法编译的主要原因。我已经开始搬东西了,但这还需要更多的工作。

似乎是该系列的后期补丁之一。

设置和配置。我认为最好将编译时和运行时设置更好地分开。

这是一个讨论松弛的好话题。我的目标是完全摆脱编译时设置,启用“一个构建来统治它们,通过加载文本文件进行配置”。这在 AVR 上是不可行的,这就是为什么经典的 GRBL(甚至更大程度上是 Marlin)具有所有编译时设置的原因。但考虑到 SPI FLASH 芯片的成本非常低,它应该完全可以在 32 位处理器上运行。

设置重写受到保持与经典 GRBL 兼容性的需要的限制 – 所以发件人不会中断 – 以及当前和即将发布的 WebUI 版本。这是一个微妙的舞蹈,但我们对结果很满意。整体代码大小大幅减少,同时增加了功能并提高了可维护性。命名空间并不完美——我认为不可能设计一个同时对每个可能的观点或用例都最优的命名空间模式——但到目前为止感觉很愉快。

我仍然有一些我自己无法解决的悬而未决的问题:

一般来说。我已经改变了相当多的结构;也许其中一些并不是最好的选择。因此,我很好奇您的总体印象是什么。

上面详细介绍过。总的来说,你似乎正朝着我个人喜欢的方向前进——根据我与巴特的谈话,我怀疑他的感觉大致相似。

电磁笔。电磁笔在我看来就像一种主轴。为什么这是一个单独的文件?

大概是历史性的。主轴是在制品。如果您可以将笔合并到 Spindle 类结构中 – 或合并到改进的结构中 – 请试一试。但将其作为单独的补丁(或系列)进行。

伺服。同样,我对servo_axis 和RcServoClass 有点困惑。为什么不是一切都在后者?还是这仍然是 WIP?

在制品

打印。我不太了解 print.cpp 函数,因为还有 grbl_send 这似乎是更通用的变体。

我不知道打印功能从何而来;也许是经典 GRBL 的残余。它们没有在我能找到的任何地方使用。我删除了 print.cpp 和 print.h 并且它仍然编译 – 虽然我还没有尝试过 #defines 的所有可能组合

部分编译。我发现自己想知道禁用 WIFI 和 BT 等功能有什么好处。既然 ESP32 具有所需的空间,为什么不简单地将其设置为运行时设置呢?在这里使用 ifdef 有什么好处吗?

那是历史性的。如前所述,我们希望所有 ifdef 都消失。WebUI 集成的许多方面与类似的 grbl 代码是多余的,因此改进和合并是可能的。事实上,我使用新设置实现的代码量大幅减少主要来自 WebUI 代码的改进,用数据迭代替换了大块的复制和粘贴代码。

我正在处理的分支可以在这里找到:https ://github.com/atlaste/Grbl_Esp32/tree/CleanupDevt/Grbl_Esp32 。再次强调,这仍然是一个 WIP,甚至还没有编译;需要做更多的工作,如果可能的话,我会继续投入时间。

我们应该开始增量 PR 的过程吗?

编码风格、架构和很多小事 #504
合作者作者

地图册 评论 2020 年 8 月 4 日

刚刚注意到我不得不要求一个松弛的邀请。不知道它是如何工作的……但请发送一个到:atlaste at yahoo dot com;可能更容易沟通。

也许我们可以逐步地做,而不是一个带有一整套变化的分支,作为一系列 PR,一次呈现一个,并在中间时间进行审查。这使得测试和审查变得更加容易,并允许通过二分法来发现问题。

通常我不会同意这一点,因为这意味着我必须重新开始……但既然你们在我的董事会上帮助了我这么多,我会破例。

Bart 和我现在大部分工作都使用 platformio。它可以从命令行使用,也可以集成在 VSCode IDE 中,或者以混合模式与 VSCode 集成但使用外部编辑器。platformio 的编译速度比 Arduino 快得多,这可能是因为它编译了单个文件,而不是使用 Arduino 将所有内容连接到一个文件并编译整个 wad 的可疑技巧。

vMicro 也这样做。不过我不熟悉platformio;会调查的。就我个人而言,只要我能使用 Visual Studio(顺便说一句,这是与 VSCode 不同的产品),我就很高兴。我(和许多其他人)使用 vMicro 的唯一原因是因为 Arduino 支持不是开箱即用的。

文档。我为文档添加了一些 MD 文件。

文档总是非常感谢!单独公关。

好的。也可能是谈论这个大方向的好时机。

小背景……在我的公司,我必须管理数百万个 loc 代码库。显然,我们有很多关于代码的文档。一开始很难做到的事情是使代码和文档保持同步——因为开发人员倾向于更改代码而不是搜索文档。

在某个时候,我们决定使用 MD 文件,并将它们放在与 cpp/h 文件相同的文件夹中(名称相似)。虽然一开始这可能看起来很混乱,但最大的优势是,如果有关于代码的文档,它也“在你面前”,这有助于保持代码和文档的同步。我强烈建议在这里也使用这种方法。

那在我们的清单上,Bart 朝着这个方向采取了一些步骤,但我们并没有像我们应该的那样系统地使用它。我认为这将是一个很好的第一步。或许您可以确保它在 VSCode/platformio 环境中运行良好(VSCode 确实支持 clang-format),然后教我们如何有效地使用它。

我将把它与 PR #1一起放在一张单独的票中,其中包含更多详细信息。
如您所知,虽然 VSCode 和 Visual Studio 都支持 clang-format,都不支持最新版本和功能。

仅更改空格的全局重新格式化将是一个很好的补丁,以及某种 git 自动化来检查提交。

我承认 CI 总的来说是一个好主意,我们在这里广泛使用它。但是,正确设置 CI 绝对是一项单独的任务,并且可能需要相当长的时间才能正确完成。我可以简要描述一下我们在公司所做的工作,以提供一些想法。

CI 不应该提交;它会给开发人员带来奇怪的行为,因为你突然得到一个需要合并的新分支。所以,我们要做的是运行 clang-format,做一个 diff,然后检查它是否为空。但 CI 可以提供更多帮助:我们自动构建、进行静态代码分析、在所有单元测试中运行代码覆盖并创建安装包。前段时间,我创建了https://github.com/atlaste/CPPCoverage,我们还与所有单元测试一起运行它,以自动生成报告并检查一切是否仍在工作。因为我们经营一家公司,所以我们同意在主合并之间通常应该增加覆盖率(这不是强制执行的),所以随着时间的推移情况会变得更好。

这将是一个很好的第二个补丁。我同意包括 CPP 是不好的。我忘记了我们为什么这样做,但它可能与 Arduino IDE 的陌生性有关。如果你能找到一个更好的解决方案,它适用于普通的 Arduino 和 platformio,那将是一个很好的第二个补丁。

好的,我们称之为 PR #2

第三个是消除 _ 前缀。

好的,我们称之为 PR #3

类和文件名。一个简单的方法来帮助人们知道什么是在哪里是把类放在同名的文件中。此外,这有助于加快编译时间,因为编译器应该为每个类做更少的工作。

这听起来不错。对人类的好处是显而易见的。你能解释一下它如何帮助编译器做更少的工作吗?我没有意识到 C++ 编译器知道文件名和它的内容之间的关系。

不,编译器不是。但是,如果您有一个包含所有定义的大头文件,则每次包含基类时都必须对其进行解析(因为所有定义都在那里)。如果一个类被拆分,则需要解析的代码量非常少。

这个和上面的(PR #2 )有很多重叠,所以我会把它们结合起来。

命名空间。对我来说,将代码移动到它所属的地方是有意义的。因此,主轴进入 Spindles 命名空间,电机进入 Motors 命名空间等等。不过,这仍然是一个 WIP,很难破译一切都应该去哪里。

我不确定你在这里建议什么。我们有 Spindles 和 Motors 类(可能需要改进);我们还需要这些概念的名称空间吗?

让我们从这里开始吧,PR #4
为清楚起见,文件夹的名称通常是命名空间的名称。

我想介绍更多概念:设置、机器、IO。让我们逐步执行此操作,看看哪些有效(哪些无效)。

常量与定义。目前,代码库中有大量#define 也可能是类(const/constexpr)变量。后者的优点是您可以获得编译时检查(因为它们是强类型的)并且它们是作用域的。实际上,我通过将代码设置为 const 来修复了一些隐式舍入错误。(就性能或内存使用而言,这并不重要)。

是的,绝对想要这样做 – 并且在有意义的地方也使用枚举而不是#defines。很想得到你的帮助 – 但作为小型目标补丁,而不是一个巨大的综合体。

混合 C 和 C++。旧的 GRBL 代码库是纯 C,它与 C++ 混合。我也想将旧的 GRBL 代码更改为类 – 基本上这也是前缀无论如何都会发生的事情,所以我不妨推一下。这也是目前代码无法编译的主要原因。我已经开始搬东西了,但这还需要更多的工作。

似乎是该系列的后期补丁之一。

让我们称之为 PR #5并从简单的事情开始。Easy这里定义为:把代码放到类中,变成静态成员。这样,命名将是正确的(主要原因见下文),即使代码的行为完全相同。

设置和配置。我认为最好将编译时和运行时设置更好地分开。

这是一个讨论松弛的好话题。

是的,我相信更多关于这个主题的讨论是个好主意。

哇,考虑到很难整理出在哪里使用的内容和依赖图,我真的很佩服你做到了这一点。我通常尝试这样做,尤其是构建代码,以便单个文件依赖于最少数量的包含 – 但在大型项目中,随着时间的推移保持这种纯度变得困难。我非常希望看到您的解决方案。

一旦代码在正确的类和命名空间中,这实际上并不难。如果命名空间对应于文件夹,类对应于文件,您可以简单地浏览代码并查看需要什么。比如Planner::cycle_reinitialize()代码中使用了say,很明显Planner.h需要包含在内。因此,这也应该在 C 代码移动到类之后完成。完成后,如果您想知道每个包含是否真的有必要,请将其删除并重新编译文件。

剩下的是机器/设置配置和平台包括的#define。对于配置,这通常是一个#ifndef#define,我将它组合在一个Config.h. 我对此不满意,因为它在文件之间创建了隐式依赖关系,但这仍然是一个很好的第一步(我认为更好的方法是使用名称隐藏 – 但让我们改天再保存)。

无论如何,让我们称之为 PR #6

一般来说。我已经改变了相当多的结构;也许其中一些并不是最好的选择。因此,我很好奇您的总体印象是什么。

上面详细介绍过。总的来说,你似乎正朝着我个人喜欢的方向前进——根据我与巴特的谈话,我怀疑他的感觉大致相似。

听起来还不错!

电磁笔。电磁笔在我看来就像一种主轴。为什么这是一个单独的文件?

大概是历史性的。主轴是在制品。如果您可以将笔合并到 Spindle 类结构中 – 或合并到改进的结构中 – 请试一试。但将其作为单独的补丁(或系列)进行。

公关#7

伺服。同样,我对servo_axis 和RcServoClass 有点困惑。为什么不是一切都在后者?还是这仍然是 WIP?

在制品

公关#8

打印。我不太了解 print.cpp 函数,因为还有 grbl_send 这似乎是更通用的变体。

我不知道打印功能从何而来;也许是经典 GRBL 的残余。它们没有在我能找到的任何地方使用。我删除了 print.cpp 和 print.h 并且它仍然编译 – 虽然我还没有尝试过 #defines 的所有可能组合

让我们删除它们。ESP32<Print.h>也包含在其他地方InputBuffer,因此只会增加混乱。

我们应该开始增量 PR 的过程吗?

让我从加入 Slack 开始,然后从上面的#1开始。

编码风格、架构和很多小事 #504
所有者

婚戒 评论 2020 年 8 月 24 日

关闭….讨论移至 Slack

编码风格、架构和很多小事 #504
 
添加标题文本添加粗体文本,<Ctrl+b>添加斜体文本,<Ctrl+i>
添加引号,<Ctrl+Shift+.>添加代码,<Ctrl+e>添加链接,<Ctrl+k>
添加项目符号列表,<Ctrl+Shift+8>添加编号列表,<Ctrl+Shift+7>添加任务列表,<Ctrl+Shift+l>
直接提及用户或团队引用问题、拉取请求或讨论

添加已保存的回复

请记住,对此存储库的贡献应遵循我们的 GitHub 社区指南
通过赞助他们 来表达 您对 bdring的支持。

 赞助

标签
还没有
项目

还没有

发展

没有分支或拉取请求

5名参与者
编码风格、架构和很多小事 #504编码风格、架构和很多小事 #504编码风格、架构和很多小事 #504编码风格、架构和很多小事 #504编码风格、架构和很多小事 #504

喜欢 (0)

您必须 登录 才能发表评论!